pg_conn 0.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ecdb9e5679acd6da6db9b98fc179941b5752727f7ec064bbb3168ed3ca33d33
4
- data.tar.gz: 28152343bf4490ad17f770799e4fa211662cab13cc19c639049d465a4c610f2a
3
+ metadata.gz: 515c790d7c2850a3d679f3b56601a8cd7311eeeb7c8875f23e7e24a9b1d3389a
4
+ data.tar.gz: '08b7e60560b80649d613e7469c7d544b136c5cff789d9f107eeb83a56e4449ff'
5
5
  SHA512:
6
- metadata.gz: 68767284661c94cc8c0a5e610d967bfe8e31db67cf3a6998b68895ba1f0ca30e003e68036ac6e23788e0175226cb77a06c1ea883362dfb5386874aeeed21928c
7
- data.tar.gz: 251335c7c53cfd1cfac031576bb854aada2e034e64587a58932eb63cce35f48e9867579c52bcc48d91368e93d6d7beaddc1c5334c2207d063684cdbea4335ec4
6
+ metadata.gz: aee7f2323e2bd7cb4893780210161c7839dd985e33dec5d1c93b6318c4f3c03494ef2108031fe0aff0e83352c94bb6c5a421830ac7e8972cd23d830159a61f08
7
+ data.tar.gz: c4ad3b31c34a19ce3c697ab9cdb318f9aee9752c7eb3bc598588da48923d488908b26c324fd29cf6381d60d08e249920a99671324b84434776fbdedeb85ad5f1
@@ -44,7 +44,7 @@ module PgConn
44
44
  conn.values stmt
45
45
  end
46
46
 
47
- # Return the owner of the database
47
+ # Return the owner of a given database
48
48
  def owner(database)
49
49
  conn.value %(
50
50
  select r.rolname
@@ -54,13 +54,13 @@ module PgConn
54
54
  )
55
55
  end
56
56
 
57
- # Return list of users currently logged in to the database or to any
57
+ # Return list of users currently logged in to the given database or to any
58
58
  # database if database is nil
59
59
  #
60
- # FIXME: There is a possible race-condition here where some process
61
- # (auto-vacuum) is logged in to the database but has a nil username. The
62
- # easy fix is to have usename not null but it would be nice to know what
63
- # exactly is triggering this problem
60
+ # FIXME: There is a possible race-condition here where some process (eg.
61
+ # auto-vacuum) is logged in to the database but has a nil username. The
62
+ # easy fix is to have 'usename is not null' but it would be nice to know
63
+ # what exactly is triggering this problem
64
64
  #
65
65
  def users(database)
66
66
  database_clause = database ? "datname = '#{database}'" : nil
@@ -69,7 +69,7 @@ module PgConn
69
69
  end
70
70
 
71
71
  # Hollow-out a database by removing all schemas in the database. The public
72
- # schema is recreated afterwards if :public is true. Uses the current
72
+ # schema is recreated afterwards unless if :public is false. Uses the current
73
73
  # database if @database is nil
74
74
  #
75
75
  # Note that the database can have active users logged in while the database
@@ -85,9 +85,11 @@ module PgConn
85
85
  .select { |schema| !exclude.include?(schema) }
86
86
  .join(", ")
87
87
  conn.exec "drop schema #{schemas} cascade"
88
+
89
+ # FIXME SECURITY Why grant 'create' to public?
88
90
  conn.exec %(
89
91
  create schema public authorization postgres;
90
- grant usage, create on schema public to public
92
+ grant usage, create on schema public to public
91
93
  ) if public
92
94
  ensure
93
95
  conn&.terminate if local
@@ -1,3 +1,3 @@
1
1
  module PgConn
2
- VERSION = "0.6.1"
2
+ VERSION = "0.7.1"
3
3
  end
data/lib/pg_conn.rb CHANGED
@@ -49,8 +49,7 @@ module PgConn
49
49
  def name() @pg_connection.db end
50
50
  alias_method :database, :name # Obsolete
51
51
 
52
- # Database manipulation methods: #exist?, #create, #drop, #list. It is
53
- # named 'rdbms' because #database is already defined
52
+ # Database manipulation methods: #exist?, #create, #drop, #list
54
53
  attr_reader :rdbms
55
54
 
56
55
  # Role manipulation methods: #exist?, #create, #drop, #list
@@ -64,6 +63,22 @@ module PgConn
64
63
  # #exec or #transaction block
65
64
  attr_reader :timestamp
66
65
 
66
+ # PG::Error object if the last statement failed; otherwise nil
67
+ attr_reader :err
68
+
69
+ # Last error message. The error message is the first line of the PG error
70
+ # message that may contain additional info. It doesn't contain a
71
+ # terminating newline
72
+ def errmsg = err&.message =~ /^ERROR:\s*(.*?)\n/m && $1.capitalize
73
+
74
+ # The one-based line number of the last PG::Error or nil if absent in the
75
+ # Postgres error message
76
+ def errline = err&.message =~ /\n\s*LINE\s+(\d+):/m && $1.to_i
77
+
78
+ # The one-based character number of the error in the last PG::Error or nil
79
+ # if absent in the Postgres error message
80
+ def errchar = err&.message =~ /\n(\s*LINE\s+\d+: ).*?\n(\s+)\^\n/m && ($2.size - $1.size + 1)
81
+
67
82
  # :call-seq:
68
83
  # initialize(dbname = nil, user = nil, field_name_class: Symbol)
69
84
  # initialize(connection_hash, field_name_class: Symbol)
@@ -79,10 +94,6 @@ module PgConn
79
94
  # of <key>=<value> pairs with the same keys as the hash, or a URI with the
80
95
  # format 'postgres[ql]://[user[:password]@][host][:port][/name]
81
96
  #
82
- # The :field_name_class option controls the Ruby type of column names. It can be
83
- # Symbol (the default) or String. The :timestamp option is used
84
- # internally to set the timestamp for transactions
85
- #
86
97
  # If given an array argument, PgConn will not connect to the database and
87
98
  # instead write its commands to the array. In this case, methods extracting
88
99
  # values from the database (eg. #value) will return nil or raise an
@@ -93,6 +104,10 @@ module PgConn
93
104
  # recommended except in cases where you want to piggyback on an existing
94
105
  # connection (eg. a Rails connection)
95
106
  #
107
+ # The :field_name_class option controls the Ruby type of column names. It can be
108
+ # Symbol (the default) or String. The :timestamp option is used
109
+ # internally to set the timestamp for transactions
110
+ #
96
111
  # Note that the connection hash and the connection string may support more
97
112
  # parameters than documented here. Consult
98
113
  # https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING
@@ -478,9 +493,10 @@ module PgConn
478
493
 
479
494
  # Execute SQL statement(s) in a transaction and return the number of
480
495
  # affected records (if any). Also sets #timestamp unless a transaction is
481
- # already in progress. The +sql+ argument can be a String or an arbitrarily
482
- # nested array of strings. The empty array is a NOP but the empty string is
483
- # not.
496
+ # already in progress. The +sql+ argument can be a command (String) or an
497
+ # arbitrarily nested array of commands. Note that you can't have commands
498
+ # that span multiple lines. The empty array is a NOP but the empty string
499
+ # is not.
484
500
  #
485
501
  # #exec pass Postgres exceptions to the caller unless :fail is false. If
486
502
  # fail is false #exec instead return nil but note that postgres doesn't
@@ -495,10 +511,10 @@ module PgConn
495
511
 
496
512
  # Execute SQL statement(s) without a transaction block and return the
497
513
  # number of affected records (if any). This used to call procedures that
498
- # may manipulate transactions. The +sql+ argument can be a String or
499
- # an arbitrarily nested array of strings. The empty array is a NOP but the
500
- # empty string is not. #exec pass Postgres exceptions to the caller unless
501
- # :fail is false in which case it returns nil
514
+ # may manipulate transactions. The +sql+ argument can be a SQL command or
515
+ # an arbitrarily nested array of commands. The empty array is a NOP but the
516
+ # empty string is not. #execute pass Postgres exceptions to the caller
517
+ # unless :fail is false in which case it returns nil
502
518
  #
503
519
  # TODO: Handle postgres exceptions wrt transaction state and stack
504
520
  def execute(sql, fail: true, silent: false)
@@ -589,7 +605,7 @@ module PgConn
589
605
  push_transaction
590
606
  result = yield
591
607
  rescue PgConn::Rollback
592
- pop_trancaction(commit: false)
608
+ pop_transaction(commit: false)
593
609
  return nil
594
610
  # FIXME: Rescue other postgres errors and wipe-out stack
595
611
  end
@@ -626,25 +642,27 @@ module PgConn
626
642
  PG::Connection.new *args, **opts
627
643
  end
628
644
  end
629
-
645
+
630
646
  # :call-seq:
631
647
  # pg_exec(string)
632
648
  # pg_exec(array)
633
649
  #
634
- # +arg+ can be a statement or an array of statements. The statements are
635
- # concatenated before being sent to the server. It returns a PG::Result
636
- # object or nil if +arg+ was empty. #exec pass Postgres exceptions to the
637
- # caller unless :fail is false
650
+ # Execute statement(s) on the server. If the argument is an array of
651
+ # commands, the commands are concatenated with ';' before being sent to the
652
+ # server. #pg_exec returns a PG::Result object or nil if +arg+ was empty.
653
+ # #exec pass Postgres exceptions to the caller unless :fail is false
638
654
  #
639
655
  # FIXME: Error message prints the last statement but what if another
640
656
  # statement failed?
641
657
  #
642
- # TODO WILD: Parse sql and split it into statements that are executed
643
- # one-by-one so we're able to pinpoint errors in the source
658
+ # TODO: Connsider executing statements one-by-one so we're able to
659
+ # pin-point Postgres errors without a line number. This may be expensive,
660
+ # though
644
661
  #
645
662
  # TODO: Fix silent by not handling exceptions
646
663
  def pg_exec(arg, fail: true, silent: false)
647
664
  if @pg_connection
665
+ @err = nil
648
666
  begin
649
667
  last_stmt = nil # To make the current SQL statement visible to the rescue clause. FIXME Not used?
650
668
  if arg.is_a?(String)
@@ -659,9 +677,11 @@ module PgConn
659
677
  end
660
678
 
661
679
  rescue PG::Error => ex
680
+ @err = ex
662
681
  if fail
663
682
  if !silent # FIXME Why do we handle this?
664
683
  $stderr.puts arg
684
+ $stderr.puts
665
685
  $stderr.puts ex.message
666
686
  $stderr.flush
667
687
  end
@@ -670,6 +690,7 @@ module PgConn
670
690
  return nil
671
691
  end
672
692
  end
693
+
673
694
  else # @pg_commands is defined
674
695
  if arg.is_a?(String)
675
696
  @pg_commands << arg if arg != ""
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_conn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claus Rasmussen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-06 00:00:00.000000000 Z
11
+ date: 2024-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg