class Sequel::TinyTDS::Database
Constants
- DatasetClass
Public Instance Methods
Transfer the :user option to the :username option.
# File lib/sequel/adapters/tinytds.rb, line 11 def connect(server) opts = server_opts(server) opts[:username] = opts[:user] c = TinyTds::Client.new(opts) c.query_options.merge!(:cache_rows=>false) if (ts = opts[:textsize]) sql = "SET TEXTSIZE #{typecast_value_integer(ts)}" log_yield(sql){c.execute(sql)} end c end
Execute the given sql
on the server. If the :return option is
present, its value should be a method symbol that is called on the
TinyTds::Result object returned from executing the sql
. The
value of such a method is returned to the caller. Otherwise, if a block is
given, it is yielded the result object. If no block is given and a :return
is not present, nil
is returned.
# File lib/sequel/adapters/tinytds.rb, line 31 def execute(sql, opts=OPTS) synchronize(opts[:server]) do |c| begin m = opts[:return] r = nil if (args = opts[:arguments]) && !args.empty? types = [] values = [] args.each_with_index do |(k, v), i| v, type = ps_arg_type(v) types << "@#{k} #{type}" values << "@#{k} = #{v}" end case m when :do sql = "#{sql}; SELECT @@ROWCOUNT AS AffectedRows" single_value = true when :insert sql = "#{sql}; SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident" single_value = true end sql = "EXEC sp_executesql N'#{c.escape(sql)}', N'#{c.escape(types.join(', '))}', #{values.join(', ')}" log_yield(sql) do r = c.execute(sql) r.each{|row| return row.values.first} if single_value end else log_yield(sql) do r = c.execute(sql) return r.send(m) if m end end yield(r) if block_given? rescue TinyTds::Error => e raise_error(e, :disconnect=>!c.active?) ensure r.cancel if r && c.sqlsent? end end end
Execute the DDL sql
on the database and return nil.
# File lib/sequel/adapters/tinytds.rb, line 84 def execute_ddl(sql, opts=OPTS) execute(sql, opts.merge(:return=>:each)) nil end
Return the number of rows modified by the given sql
.
# File lib/sequel/adapters/tinytds.rb, line 73 def execute_dui(sql, opts=OPTS) execute(sql, opts.merge(:return=>:do)) end
Return the value of the autogenerated primary key (if any) for the row
inserted by the given sql
.
# File lib/sequel/adapters/tinytds.rb, line 79 def execute_insert(sql, opts=OPTS) execute(sql, opts.merge(:return=>:insert)) end
Private Instance Methods
Choose whether to use unicode strings on initialization
# File lib/sequel/adapters/tinytds.rb, line 92 def adapter_initialize set_mssql_unicode_strings end
For some reason, unless you specify a column can be NULL, it assumes NOT NULL, so turn NULL on by default unless the column is a primary key column.
# File lib/sequel/adapters/tinytds.rb, line 99 def column_list_sql(g) pks = [] g.constraints.each{|c| pks = c[:columns] if c[:type] == :primary_key} g.columns.each{|c| c[:null] = true if !pks.include?(c[:name]) && !c[:primary_key] && !c.has_key?(:null) && !c.has_key?(:allow_null)} super end
tiny_tds uses TinyTds::Error as the base error class.
# File lib/sequel/adapters/tinytds.rb, line 107 def database_error_classes [TinyTds::Error] end
Stupid MSSQL maps foreign key and check constraint violations to the same error code, and doesn't expose the sqlstate. Use database error numbers if present and unambiguous, otherwise fallback to the regexp mapping.
# File lib/sequel/adapters/tinytds.rb, line 115 def database_specific_error_class(exception, opts) case exception.db_error_number when 515 NotNullConstraintViolation when 2627 UniqueConstraintViolation else super end end
Return true if the :conn argument is present and not active.
# File lib/sequel/adapters/tinytds.rb, line 127 def disconnect_error?(e, opts) super || (opts[:conn] && !opts[:conn].active?) end
Dispose of any possible results of execution.
# File lib/sequel/adapters/tinytds.rb, line 132 def log_connection_execute(conn, sql) log_yield(sql){conn.execute(sql).each} end
Return a 2 element array with the literal value and type to use in the prepared statement call for the given value and connection.
# File lib/sequel/adapters/tinytds.rb, line 138 def ps_arg_type(v) case v when Fixnum [v, 'int'] when Bignum [v, 'bigint'] when Float [v, 'double precision'] when Numeric [v, 'numeric'] when Time if v.is_a?(SQLTime) [literal(v), 'time'] else [literal(v), 'datetime'] end when DateTime [literal(v), 'datetime'] when Date [literal(v), 'date'] when nil ['NULL', 'nvarchar(max)'] when true ['1', 'int'] when false ['0', 'int'] when SQL::Blob [literal(v), 'varbinary(max)'] else [literal(v), 'nvarchar(max)'] end end