module Sequel::JDBC::Postgres::DatabaseMethods
Public Class Methods
Add the primary_keys and primary_key_sequences instance variables, so we can get the correct return values for inserted rows.
# File lib/sequel/adapters/jdbc/postgresql.rb, line 39 def self.extended(db) super db.send(:initialize_postgres_adapter) end
Public Instance Methods
Remove any current entry for the oid in the oid_convertor_map.
# File lib/sequel/adapters/jdbc/postgresql.rb, line 45 def add_conversion_proc(oid, *) super Sequel.synchronize{@oid_convertor_map.delete(oid)} end
See Sequel::Postgres::Adapter#copy_into
# File lib/sequel/adapters/jdbc/postgresql.rb, line 51 def copy_into(table, opts=OPTS) data = opts[:data] data = Array(data) if data.is_a?(String) if block_given? && data raise Error, "Cannot provide both a :data option and a block to copy_into" elsif !block_given? && !data raise Error, "Must provide either a :data option or a block to copy_into" end synchronize(opts[:server]) do |conn| begin copy_manager = org.postgresql.copy.CopyManager.new(conn) copier = copy_manager.copy_in(copy_into_sql(table, opts)) if block_given? while buf = yield java_bytes = buf.to_java_bytes copier.writeToCopy(java_bytes, 0, java_bytes.length) end else data.each do |d| java_bytes = d.to_java_bytes copier.writeToCopy(java_bytes, 0, java_bytes.length) end end rescue Exception => e copier.cancelCopy if copier raise ensure unless e begin copier.endCopy rescue NativeException => e2 raise_error(e2) end end end end end
See Sequel::Postgres::Adapter#copy_table
# File lib/sequel/adapters/jdbc/postgresql.rb, line 92 def copy_table(table, opts=OPTS) synchronize(opts[:server]) do |conn| copy_manager = org.postgresql.copy.CopyManager.new(conn) copier = copy_manager.copy_out(copy_table_sql(table, opts)) begin if block_given? while buf = copier.readFromCopy yield(String.from_java_bytes(buf)) end nil else b = String.new while buf = copier.readFromCopy b << String.from_java_bytes(buf) end b end rescue => e raise_error(e, :disconnect=>true) ensure if buf && !e raise DatabaseDisconnectError, "disconnecting as a partial COPY may leave the connection in an unusable state" end end end end
# File lib/sequel/adapters/jdbc/postgresql.rb, line 119 def oid_convertor_proc(oid) if (conv = Sequel.synchronize{@oid_convertor_map[oid]}).nil? conv = if pr = conversion_procs[oid] lambda do |r, i| if v = r.getString(i) pr.call(v) end end else false end Sequel.synchronize{@oid_convertor_map[oid] = conv} end conv end
Private Instance Methods
For PostgreSQL-specific types, return the string that should be used as the PGObject value. Returns nil by default, loading pg_* extensions will override this to add support for specific types.
# File lib/sequel/adapters/jdbc/postgresql.rb, line 144 def bound_variable_arg(arg, conn) nil end
# File lib/sequel/adapters/jdbc/postgresql.rb, line 137 def disconnect_error?(exception, opts) super || exception.message =~ /\A(This connection has been closed\.|FATAL: terminating connection due to administrator command|An I\/O error occurred while sending to the backend\.)\z/ end
Work around issue when using Sequel's bound variable support where the same SQL is used in different bound variable calls, but the schema has changed between the calls. This is necessary as jdbc-postgres versions after 9.4.1200 violate the JDBC API. These versions cache separate PreparedStatement instances, which are eventually prepared server side after the prepareThreshold is met. The JDBC API violation is that PreparedStatement#close does not release the server side prepared statement.
# File lib/sequel/adapters/jdbc/postgresql.rb, line 155 def prepare_jdbc_statement(conn, sql, opts) ps = super unless opts[:name] ps.prepare_threshold = 0 end ps end
If the given argument is a recognized PostgreSQL-specific type, create a PGObject instance with unknown type and the bound argument string value, and set that as the prepared statement argument.
# File lib/sequel/adapters/jdbc/postgresql.rb, line 166 def set_ps_arg(cps, arg, i) if v = bound_variable_arg(arg, nil) obj = org.postgresql.util.PGobject.new obj.setType("unknown") obj.setValue(v) cps.setObject(i, obj) else super end end
Use setNull for nil arguments as the default behavior of setString with nil doesn't appear to work correctly on PostgreSQL.
# File lib/sequel/adapters/jdbc/postgresql.rb, line 179 def set_ps_arg_nil(cps, i) cps.setNull(i, JavaSQL::Types::NULL) end
Execute the connection configuration SQL queries on the connection.
# File lib/sequel/adapters/jdbc/postgresql.rb, line 184 def setup_connection_with_opts(conn, opts) conn = super statement(conn) do |stmt| connection_configuration_sqls(opts).each{|sql| log_connection_yield(sql, conn){stmt.execute(sql)}} end conn end
# File lib/sequel/adapters/jdbc/postgresql.rb, line 192 def setup_type_convertor_map super @oid_convertor_map = {} end