class Sequel::Mock::Database
Database class for Sequel's mock adapter.
Constants
- DatasetClass
Attributes
Set the columns to set in the dataset when the dataset fetches rows. Argument types supported:
- nil
-
Set no columns
Array of Symbols: Used for all datasets Array (otherwise): First retrieval gets the first value in the
array, second gets the second value, etc.
- Proc
-
Called with the select SQL query, uses the value returned, which should be an array of symbols
Set the hashes to yield by execute when retrieving rows. Argument types supported:
- nil
-
Yield no rows
- Hash
-
Always yield a single row with this hash
- Array of Hashes
-
Yield separately for each hash in this array
- Array (otherwise)
-
First retrieval gets the first value in the array, second gets the second value, etc.
- Proc
-
Called with the select SQL query, uses the value returned, which should be a hash or array of hashes.
- Class
-
Should be an Exception subclass, will create a new instance an raise it wrapped in a DatabaseError.
Set the number of rows to return from update or delete. Argument types supported:
- nil
-
Return 0 for all updates and deletes
- Integer
-
Used for all updates and deletes
- Array
-
First update/delete gets the first value in the array, second gets the second value, etc.
- Proc
-
Called with the update/delete SQL query, uses the value returned.
- Class
-
Should be an Exception subclass, will create a new instance an raise it wrapped in a DatabaseError.
Mock the server version, useful when using the shared adapters
Public Instance Methods
Set the autogenerated primary key integer to be returned when running an insert query. Argument types supported:
- nil
-
Return nil for all inserts
- Integer
-
Starting integer for next insert, with futher inserts getting an incremented value
- Array
-
First insert gets the first value in the array, second gets the second value, etc.
- Proc
-
Called with the insert SQL query, uses the value returned
- Class
-
Should be an Exception subclass, will create a new instance an raise it wrapped in a DatabaseError.
# File lib/sequel/adapters/mock.rb, line 51 def autoid=(v) @autoid = case v when Integer i = v - 1 proc{Sequel.synchronize{i+=1}} else v end end
Return a related Connection option connecting to the given shard.
# File lib/sequel/adapters/mock.rb, line 103 def connect(server) Connection.new(self, server, server_opts(server)) end
# File lib/sequel/adapters/mock.rb, line 107 def disconnect_connection(c) end
Store the sql used for later retrieval with sqls, and return the appropriate value using either the autoid, fetch, or numrows methods.
# File lib/sequel/adapters/mock.rb, line 113 def execute(sql, opts=OPTS, &block) synchronize(opts[:server]){|c| _execute(c, sql, opts, &block)} end
Store the sql used, and return the value of the numrows method.
# File lib/sequel/adapters/mock.rb, line 119 def execute_dui(sql, opts=OPTS) execute(sql, opts.merge(:meth=>:numrows)) end
Store the sql used, and return the value of the autoid method.
# File lib/sequel/adapters/mock.rb, line 124 def execute_insert(sql, opts=OPTS) execute(sql, opts.merge(:meth=>:autoid)) end
Enable use of savepoints.
# File lib/sequel/adapters/mock.rb, line 137 def supports_savepoints? shared_adapter? ? super : true end
Private Instance Methods
# File lib/sequel/adapters/mock.rb, line 143 def _autoid(sql, v, ds=nil) if ds ds.send(:cache_set, :_autoid, ds.autoid + 1) if ds.autoid.is_a?(Integer) v else _nextres(v, sql, nil) end end
# File lib/sequel/adapters/mock.rb, line 152 def _execute(c, sql, opts=OPTS, &block) sql += " -- args: #{opts[:arguments].inspect}" if opts[:arguments] sql += " -- #{@opts[:append]}" if @opts[:append] sql += " -- #{c.server.is_a?(Symbol) ? c.server : c.server.inspect}" if c.server != :default log_connection_yield(sql, c){} unless opts[:log] == false @sqls << sql ds = opts[:dataset] begin if block columns(ds, sql) if ds _fetch(sql, (ds._fetch if ds) || @fetch, &block) elsif meth = opts[:meth] if meth == :numrows _numrows(sql, (ds.numrows if ds) || @numrows) else v = ds.autoid if ds _autoid(sql, v || @autoid, (ds if v)) end end rescue => e raise_error(e) end end
# File lib/sequel/adapters/mock.rb, line 177 def _fetch(sql, f, &block) case f when Hash yield f.dup when Array if f.all?{|h| h.is_a?(Hash)} f.each{|h| yield h.dup} else _fetch(sql, f.shift, &block) end when Proc h = f.call(sql) if h.is_a?(Hash) yield h.dup elsif h h.each{|h1| yield h1.dup} end when Class if f < Exception raise f else raise Error, "Invalid @fetch attribute: #{v.inspect}" end when nil # nothing else raise Error, "Invalid @fetch attribute: #{f.inspect}" end end
# File lib/sequel/adapters/mock.rb, line 207 def _nextres(v, sql, default) case v when Integer v when Array v.empty? ? default : _nextres(v.shift, sql, default) when Proc v.call(sql) when Class if v < Exception raise v else raise Error, "Invalid @autoid/@numrows attribute: #{v.inspect}" end when nil default else raise Error, "Invalid @autoid/@numrows attribute: #{v.inspect}" end end
# File lib/sequel/adapters/mock.rb, line 228 def _numrows(sql, v) _nextres(v, sql, 0) end
Additional options supported:
- :autoid
-
Call autoid= with the value
- :columns
-
Call columns= with the value
- :fetch
-
Call fetch= with the value
- :numrows
-
Call numrows= with the value
- :extend
-
A module the object is extended with.
- :sqls
-
The array to store the SQL queries in.
# File lib/sequel/adapters/mock.rb, line 240 def adapter_initialize opts = @opts @sqls = opts[:sqls] || [] @shared_adapter = false case db_type = opts[:host] when String, Symbol db_type = db_type.to_sym unless mod = Sequel.synchronize{SHARED_ADAPTER_MAP[db_type]} begin require "sequel/adapters/shared/#{db_type}" rescue LoadError else mod = Sequel.synchronize{SHARED_ADAPTER_MAP[db_type]} end end if mod @shared_adapter = true extend(mod::DatabaseMethods) extend_datasets(mod::DatasetMethods) if mod.respond_to?(:mock_adapter_setup) mod.mock_adapter_setup(self) end end end unless @shared_adapter extend UnmodifiedIdentifiers::DatabaseMethods extend_datasets UnmodifiedIdentifiers::DatasetMethods end self.autoid = opts[:autoid] self.columns = opts[:columns] self.fetch = opts[:fetch] self.numrows = opts[:numrows] extend(opts[:extend]) if opts[:extend] sqls end
# File lib/sequel/adapters/mock.rb, line 280 def columns(ds, sql, cs=@columns) case cs when Array unless cs.empty? if cs.all?{|c| c.is_a?(Symbol)} ds.columns(*cs) else columns(ds, sql, cs.shift) end end when Proc ds.columns(*cs.call(sql)) when nil # nothing else raise Error, "Invalid @columns attribute: #{cs.inspect}" end end
# File lib/sequel/adapters/mock.rb, line 299 def quote_identifiers_default shared_adapter? ? super : false end