DataObjects uses it's own internal connection pooling in addition to the pooling that Sequel uses. You should make sure that you don't set the connection pool size to more than 8 for a Sequel::DataObjects::Database object, or hack DataObjects (or Extlib) to use a pool size at least as large as the pool size being used by Sequel.
Call the DATABASE_SETUP proc directly after initialization, so the object always uses sub adapter specific code. Also, raise an error immediately if the connection doesn't have a uri, since DataObjects requires one.
# File lib/sequel/adapters/do.rb, line 51 def initialize(opts) super raise(Error, "No connection string specified") unless uri if prok = DATABASE_SETUP[subadapter.to_sym] prok.call(self) end end
Setup a DataObjects::Connection to the database.
# File lib/sequel/adapters/do.rb, line 60 def connect(server) setup_connection(::DataObjects::Connection.new(uri(server_opts(server)))) end
# File lib/sequel/adapters/do.rb, line 64 def disconnect_connection(conn) conn.dispose end
Execute the given SQL. If a block is given, the DataObjects::Reader created is yielded to it. A block should not be provided unless a a SELECT statement is being used (or something else that returns rows). Otherwise, the return value is the insert id if opts is :insert, or the number of affected rows, otherwise.
# File lib/sequel/adapters/do.rb, line 73 def execute(sql, opts={}) synchronize(opts[:server]) do |conn| begin command = conn.create_command(sql) res = log_yield(sql){block_given? ? command.execute_reader : command.execute_non_query} rescue ::DataObjects::Error => e raise_error(e) end if block_given? begin yield(res) ensure res.close if res end elsif opts[:type] == :insert res.insert_id else res.affected_rows end end end
Execute the SQL on the this database, returning the number of affected rows.
# File lib/sequel/adapters/do.rb, line 97 def execute_dui(sql, opts={}) execute(sql, opts) end
Execute the SQL on this database, returning the primary key of the table being inserted to.
# File lib/sequel/adapters/do.rb, line 103 def execute_insert(sql, opts={}) execute(sql, opts.merge(:type=>:insert)) end
Return the subadapter type for this database, i.e. sqlite3 for do:sqlite3::memory:.
# File lib/sequel/adapters/do.rb, line 109 def subadapter uri.split(":").first end
Return the DataObjects URI for the Sequel URI, removing the do: prefix.
# File lib/sequel/adapters/do.rb, line 115 def uri(opts={}) opts = @opts.merge(opts) (opts[:uri] || opts[:url]).sub(/\Ado:/, '') end
Method to call on a statement object to execute SQL that does not return any rows.
# File lib/sequel/adapters/do.rb, line 124 def connection_execute_method :execute_non_query end
dataobjects uses the DataObjects::Error class as the main error class.
# File lib/sequel/adapters/do.rb, line 129 def database_error_classes [::DataObjects::Error] end
Recognize DataObjects::ConnectionError instances as disconnect errors.
# File lib/sequel/adapters/do.rb, line 134 def disconnect_error?(e, opts) super || (e.is_a?(::DataObjects::Error) && (e.is_a?(::DataObjects::ConnectionError) || e.message =~ DISCONNECT_ERROR_RE)) end
Execute SQL on the connection by creating a command first
# File lib/sequel/adapters/do.rb, line 139 def log_connection_execute(conn, sql) log_yield(sql){conn.create_command(sql).execute_non_query} end
Allow extending the given connection when it is first created. By default, just returns the connection.
# File lib/sequel/adapters/do.rb, line 145 def setup_connection(conn) conn end