Class: Sequel::Postgres::Adapter

Inherits:
PGconn
  • Object
show all
Defined in:
lib/sequel/adapters/postgres.rb

Overview

PGconn subclass for connection specific methods used with the pg or postgres-pr driver.

Defined Under Namespace

Classes: PGresult

Constant Summary collapse

DISCONNECT_ERROR_CLASSES =

The underlying exception classes to reraise as disconnect errors instead of regular database errors.

[IOError, Errno::EPIPE, Errno::ECONNRESET]
DISCONNECT_ERROR_RE =

Since exception class based disconnect checking may not work, also trying parsing the exception message to look for disconnect errors.

/\A#{Regexp.union(disconnect_errors)}/
CONNECTION_OK =

Handle old postgres-pr sequel-postgres-pr already implements this API

-1

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#prepared_statementsObject (readonly)

Hash of prepared statements for this connection. Keys are string names of the server side prepared statement, and values are SQL strings.



85
86
87
# File 'lib/sequel/adapters/postgres.rb', line 85

def prepared_statements
  @prepared_statements
end

Instance Method Details

#async_exec(sql) ⇒ Object



111
112
113
# File 'lib/sequel/adapters/postgres.rb', line 111

def async_exec(sql)
  PGresult.new(@conn.query(sql))
end

#async_exec_paramsObject



89
# File 'lib/sequel/adapters/postgres.rb', line 89

alias async_exec_params async_exec

#block(timeout = nil) ⇒ Object



115
116
# File 'lib/sequel/adapters/postgres.rb', line 115

def block(timeout=nil)
end

#check_disconnect_errorsObject

Raise a Sequel::DatabaseDisconnectError if a one of the disconnect error classes is raised, or a PGError is raised and the connection status cannot be determined or it is not OK.



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/sequel/adapters/postgres.rb', line 135

def check_disconnect_errors
  yield
rescue *DISCONNECT_ERROR_CLASSES => e
  disconnect = true
  raise(Sequel.convert_exception_class(e, Sequel::DatabaseDisconnectError))
rescue PGError => e
  disconnect = false
  begin
    s = status
  rescue PGError
    disconnect = true
  end
  status_ok = (s == Adapter::CONNECTION_OK)
  disconnect ||= !status_ok
  disconnect ||= e.message =~ DISCONNECT_ERROR_RE
  disconnect ? raise(Sequel.convert_exception_class(e, Sequel::DatabaseDisconnectError)) : raise
ensure
  block if status_ok && !disconnect
end

#escape_bytea(str) ⇒ Object

Escape bytea values. Uses historical format instead of hex format for maximum compatibility.



99
100
101
# File 'lib/sequel/adapters/postgres.rb', line 99

def escape_bytea(str)
  str.gsub(/[\000-\037\047\134\177-\377]/n){|b| "\\#{sprintf('%o', b.each_byte{|x| break x}).rjust(3, '0')}"}
end

#escape_string(str) ⇒ Object

Escape strings by doubling apostrophes. This only works if standard conforming strings are used.



105
106
107
# File 'lib/sequel/adapters/postgres.rb', line 105

def escape_string(str)
  str.gsub("'", "''")
end

#execute(sql, args = nil) ⇒ Object

Execute the given SQL with this connection. If a block is given, yield the results, otherwise, return the number of changed rows.



157
158
159
160
161
162
163
164
165
# File 'lib/sequel/adapters/postgres.rb', line 157

def execute(sql, args=nil)
  args = args.map{|v| @db.bound_variable_arg(v, self)} if args
  q = check_disconnect_errors{execute_query(sql, args)}
  begin
    defined?(yield) ? yield(q) : q.cmd_tuples
  ensure
    q.clear if q && q.respond_to?(:clear)
  end
end

#statusObject



118
119
120
# File 'lib/sequel/adapters/postgres.rb', line 118

def status
  CONNECTION_OK
end