Class: Sequel::DataObjects::Database
- Inherits:
-
Sequel::Database
- Object
- Sequel::Database
- Sequel::DataObjects::Database
- Defined in:
- lib/sequel_core/adapters/do.rb
Overview
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.
Constant Summary
Constants inherited from Sequel::Database
Sequel::Database::ADAPTERS, Sequel::Database::SQL_BEGIN, Sequel::Database::SQL_COMMIT, Sequel::Database::SQL_ROLLBACK
Constants included from Schema::SQL
Schema::SQL::AUTOINCREMENT, Schema::SQL::CASCADE, Schema::SQL::COMMA_SEPARATOR, Schema::SQL::NOT_NULL, Schema::SQL::NO_ACTION, Schema::SQL::NULL, Schema::SQL::PRIMARY_KEY, Schema::SQL::RESTRICT, Schema::SQL::SET_DEFAULT, Schema::SQL::SET_NULL, Schema::SQL::TYPES, Schema::SQL::UNDERSCORE, Schema::SQL::UNIQUE, Schema::SQL::UNSIGNED
Instance Attribute Summary collapse
-
#converted_exceptions ⇒ Object
Convert the given exceptions to Sequel:Errors, necessary because DO raises errors specific to database types in certain cases.
Attributes inherited from Sequel::Database
#default_schema, #loggers, #opts, #pool, #prepared_statements
Instance Method Summary collapse
-
#connect(server) ⇒ Object
Setup a DataObjects::Connection to the database.
-
#dataset(opts = nil) ⇒ Object
Return a Sequel::DataObjects::Dataset object for this database.
-
#execute(sql, opts = {}) ⇒ Object
Execute the given SQL.
-
#execute_dui(sql, opts = {}) ⇒ Object
Execute the SQL on the this database, returning the number of affected rows.
-
#execute_insert(sql, opts = {}) ⇒ Object
Execute the SQL on this database, returning the primary key of the table being inserted to.
-
#initialize(opts) ⇒ Database
constructor
Call the DATABASE_SETUP proc directly after initialization, so the object always uses sub adapter specific code.
-
#subadapter ⇒ Object
Return the subadapter type for this database, i.e.
-
#transaction(server = nil) ⇒ Object
Use DataObject’s transaction support for transactions.
-
#uri(opts = {}) ⇒ Object
Return the DataObjects URI for the Sequel URI, removing the do: prefix.
Methods inherited from Sequel::Database
#<<, #[], adapter_class, adapter_scheme, #add_column, #add_index, #alter_table, #call, connect, #create_or_replace_view, #create_table, #create_table!, #create_view, #disconnect, #drop_column, #drop_index, #drop_table, #drop_view, #execute_ddl, #fetch, #from, #get, identifier_input_method, #identifier_input_method, #identifier_input_method=, identifier_input_method=, #identifier_output_method, identifier_output_method, #identifier_output_method=, identifier_output_method=, #inspect, #log_info, #logger, #logger=, #multi_threaded?, #query, quote_identifiers=, #quote_identifiers=, #quote_identifiers?, #rename_column, #rename_table, #select, #serial_primary_key_options, #set_column_default, #set_column_type, single_threaded=, #single_threaded?, #synchronize, #table_exists?, #test_connection, #typecast_value, #upcase_identifiers=, upcase_identifiers=, #upcase_identifiers?, #url
Methods included from Schema::SQL
#alter_table_sql, #alter_table_sql_list, #auto_increment_sql, #column_definition_sql, #column_list_sql, #column_references_sql, #constraint_definition_sql, #create_table_sql_list, #default_index_name, #drop_index_sql, #drop_table_sql, #filter_expr, #index_definition_sql, #index_list_sql_list, #literal, #on_delete_clause, #quote_identifier, #quote_schema_table, #rename_table_sql, #schema, #schema_utility_dataset
Constructor Details
#initialize(opts) ⇒ Database
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.
53 54 55 56 57 58 59 60 61 |
# File 'lib/sequel_core/adapters/do.rb', line 53 def initialize(opts) @opts = opts @converted_exceptions = [] raise(Error, "No connection string specified") unless uri if prok = DATABASE_SETUP[subadapter.to_sym] prok.call(self) end super(opts) end |
Instance Attribute Details
#converted_exceptions ⇒ Object
Convert the given exceptions to Sequel:Errors, necessary because DO raises errors specific to database types in certain cases.
47 48 49 |
# File 'lib/sequel_core/adapters/do.rb', line 47 def converted_exceptions @converted_exceptions end |
Instance Method Details
#connect(server) ⇒ Object
Setup a DataObjects::Connection to the database.
64 65 66 |
# File 'lib/sequel_core/adapters/do.rb', line 64 def connect(server) setup_connection(::DataObjects::Connection.new(uri(server_opts(server)))) end |
#dataset(opts = nil) ⇒ Object
Return a Sequel::DataObjects::Dataset object for this database.
69 70 71 |
# File 'lib/sequel_core/adapters/do.rb', line 69 def dataset(opts = nil) DataObjects::Dataset.new(self, opts) end |
#execute(sql, opts = {}) ⇒ Object
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.
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/sequel_core/adapters/do.rb', line 78 def execute(sql, opts={}) log_info(sql) synchronize(opts[:server]) do |conn| begin command = conn.create_command(sql) res = block_given? ? command.execute_reader : command.execute_non_query rescue Exception => e raise_error(e, :classes=>@converted_exceptions) 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_dui(sql, opts = {}) ⇒ Object
Execute the SQL on the this database, returning the number of affected rows.
103 104 105 |
# File 'lib/sequel_core/adapters/do.rb', line 103 def execute_dui(sql, opts={}) execute(sql, opts) end |
#execute_insert(sql, opts = {}) ⇒ Object
Execute the SQL on this database, returning the primary key of the table being inserted to.
109 110 111 |
# File 'lib/sequel_core/adapters/do.rb', line 109 def execute_insert(sql, opts={}) execute(sql, opts.merge(:type=>:insert)) end |
#subadapter ⇒ Object
Return the subadapter type for this database, i.e. sqlite3 for do:sqlite3::memory:.
115 116 117 |
# File 'lib/sequel_core/adapters/do.rb', line 115 def subadapter uri.split(":").first end |
#transaction(server = nil) ⇒ Object
Use DataObject’s transaction support for transactions. This only supports single level transactions, and it always prepares transactions and commits them immediately after. It’s wasteful, but required by DataObject’s API.
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/sequel_core/adapters/do.rb', line 123 def transaction(server=nil) th = Thread.current synchronize(server) do |conn| return yield(conn) if @transactions.include?(th) t = ::DataObjects::Transaction.create_for_uri(uri) t.instance_variable_get(:@connection).close t.instance_variable_set(:@connection, conn) begin log_info("Transaction.begin") t.begin @transactions << th yield(conn) rescue Exception => e log_info("Transaction.rollback") t.rollback transaction_error(e) ensure unless e log_info("Transaction.commit") t.prepare t.commit end @transactions.delete(th) end end end |
#uri(opts = {}) ⇒ Object
Return the DataObjects URI for the Sequel URI, removing the do: prefix.
152 153 154 155 |
# File 'lib/sequel_core/adapters/do.rb', line 152 def uri(opts={}) opts = @opts.merge(opts) (opts[:uri] || opts[:url]).sub(/\Ado:/, '') end |