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, postgres, or postgres-pr driver.

Constant Summary collapse

DISCONNECT_ERROR_RE =
/\Acould not receive data from server/

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.



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

def prepared_statements
  @prepared_statements
end

Instance Method Details

#check_disconnect_errorsObject

Raise a Sequel::DatabaseDisconnectError if a PGError is raised and the connection status cannot be determined or it is not OK.



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/sequel/adapters/postgres.rb', line 122

def check_disconnect_errors
  begin
    yield
  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
  rescue IOError, Errno::EPIPE, Errno::ECONNRESET => e
    disconnect = true
    raise(Sequel.convert_exception_class(e, Sequel::DatabaseDisconnectError))
  ensure
    block if status_ok && !disconnect
  end
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.



146
147
148
149
150
151
152
153
154
# File 'lib/sequel/adapters/postgres.rb', line 146

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