Class: Sequel::TinyTDS::Database

Inherits:
Database show all
Includes:
MSSQL::DatabaseMethods
Defined in:
lib/sequel/adapters/tinytds.rb

Constant Summary

Constants included from MSSQL::DatabaseMethods

MSSQL::DatabaseMethods::FOREIGN_KEY_ACTION_MAP

Constants inherited from Database

Database::ADAPTERS, Database::COLUMN_DEFINITION_ORDER, Database::COLUMN_SCHEMA_DATETIME_TYPES, Database::COLUMN_SCHEMA_STRING_TYPES, Database::COMBINABLE_ALTER_TABLE_OPS, Database::DEFAULT_DATABASE_ERROR_REGEXPS, Database::DEFAULT_STRING_COLUMN_SIZE, Database::EXTENSIONS, Database::OPTS, Database::SCHEMA_TYPE_CLASSES, Database::TRANSACTION_ISOLATION_LEVELS

Instance Attribute Summary

Attributes included from MSSQL::DatabaseMethods

#mssql_unicode_strings

Attributes inherited from Database

#cache_schema, #dataset_class, #default_string_column_size, #log_connection_info, #log_warn_duration, #loggers, #opts, #pool, #prepared_statements, #sql_log_level, #timezone, #transaction_isolation_level

Instance Method Summary collapse

Methods included from MSSQL::DatabaseMethods

#call_mssql_sproc, #database_type, #foreign_key_list, #freeze, #global_index_namespace?, #indexes, #server_version, #supports_partial_indexes?, #supports_savepoints?, #supports_transaction_isolation_levels?, #supports_transactional_ddl?, #tables, #views

Methods inherited from Database

#<<, #[], adapter_class, adapter_scheme, #adapter_scheme, #add_column, #add_index, #add_servers, #after_commit, after_initialize, #after_rollback, #alter_table, #alter_table_generator, #call, #cast_type_literal, connect, #create_join_table, #create_join_table!, #create_join_table?, #create_or_replace_view, #create_table, #create_table!, #create_table?, #create_table_generator, #create_view, #database_type, #dataset, #disconnect, #disconnect_connection, #drop_column, #drop_index, #drop_join_table, #drop_table, #drop_table?, #drop_view, #extend_datasets, extension, #extension, #fetch, #freeze, #from, #from_application_timestamp, #get, #global_index_namespace?, #in_transaction?, #initialize, #inspect, #literal, #literal_symbol, #literal_symbol_set, load_adapter, #log_connection_yield, #log_exception, #log_info, #logger=, #prepared_statement, #quote_identifier, register_extension, #remove_servers, #rename_column, #rename_table, #rollback_checker, #run, run_after_initialize, #schema, #schema_type_class, #select, #serial_primary_key_options, #servers, #set_column_default, #set_column_type, #set_prepared_statement, set_shared_adapter_scheme, #sharded?, #single_threaded?, #supports_create_table_if_not_exists?, #supports_deferrable_constraints?, #supports_deferrable_foreign_key_constraints?, #supports_drop_table_if_exists?, #supports_foreign_key_parsing?, #supports_index_parsing?, #supports_partial_indexes?, #supports_prepared_transactions?, #supports_savepoints?, #supports_savepoints_in_prepared_transactions?, #supports_schema_parsing?, #supports_table_listing?, #supports_transaction_isolation_levels?, #supports_transactional_ddl?, #supports_view_listing?, #supports_views_with_check_option?, #supports_views_with_local_check_option?, #synchronize, #table_exists?, #test_connection, #to_application_timestamp, #transaction, #typecast_value, #uri, #url, #valid_connection?

Constructor Details

This class inherits a constructor from Sequel::Database

Instance Method Details

#connect(server) ⇒ Object

Transfer the :user option to the :username option.



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/sequel/adapters/tinytds.rb', line 13

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_connection_yield(sql, c){c.execute(sql)}
  end

  c
end

#execute(sql, opts = OPTS) ⇒ Object

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.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/sequel/adapters/tinytds.rb', line 33

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_connection_yield(sql, c) do
          r = c.execute(sql)
          r.each{|row| return row.values.first} if single_value
        end
      else
        log_connection_yield(sql, c) do
          r = c.execute(sql)
          return r.public_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? && c.active?
    end
  end
end

#execute_ddl(sql, opts = OPTS) ⇒ Object



86
87
88
89
90
91
# File 'lib/sequel/adapters/tinytds.rb', line 86

def execute_ddl(sql, opts=OPTS)
  opts = Hash[opts]
  opts[:return] = :each
  execute(sql, opts)
  nil
end

#execute_dui(sql, opts = OPTS) ⇒ Object



74
75
76
77
78
# File 'lib/sequel/adapters/tinytds.rb', line 74

def execute_dui(sql, opts=OPTS)
  opts = Hash[opts]
  opts[:return] = :do
  execute(sql, opts)
end

#execute_insert(sql, opts = OPTS) ⇒ Object



80
81
82
83
84
# File 'lib/sequel/adapters/tinytds.rb', line 80

def execute_insert(sql, opts=OPTS)
  opts = Hash[opts]
  opts[:return] = :insert
  execute(sql, opts)
end