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 =

Make postgres-pr look like pg

-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.



72
73
74
# File 'lib/sequel/adapters/postgres.rb', line 72

def prepared_statements
  @prepared_statements
end

Instance Method Details

#async_exec(sql) ⇒ Object



91
92
93
# File 'lib/sequel/adapters/postgres.rb', line 91

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

#block(timeout = nil) ⇒ Object



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

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.



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/sequel/adapters/postgres.rb', line 114

def check_disconnect_errors
  begin
    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
end

#escape_bytea(str) ⇒ Object

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



79
80
81
# File 'lib/sequel/adapters/postgres.rb', line 79

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.



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

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.



138
139
140
141
142
143
144
145
146
# File 'lib/sequel/adapters/postgres.rb', line 138

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
    block_given? ? yield(q) : q.cmd_tuples
  ensure
    q.clear if q && q.respond_to?(:clear)
  end
end

#statusObject



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

def status
  CONNECTION_OK
end