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, #rollback_on_exit, #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
26
27
28
29
30
31
32
33
34
35
36
37
38
# 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)

  # SEQUEL6: Default to ansi: true
  if opts[:ansi]
    sql = %w(
      ANSI_NULLS
      ANSI_PADDING
      ANSI_WARNINGS
      ANSI_NULL_DFLT_ON
      QUOTED_IDENTIFIER
      CONCAT_NULL_YIELDS_NULL
    ).map{|v| "SET #{v} ON"}.join(";")
    log_connection_yield(sql, c){c.execute(sql)}
  end

  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.


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
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/sequel/adapters/tinytds.rb', line 46

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


99
100
101
102
103
104
# File 'lib/sequel/adapters/tinytds.rb', line 99

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

#execute_dui(sql, opts = OPTS) ⇒ Object


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

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

#execute_insert(sql, opts = OPTS) ⇒ Object


93
94
95
96
97
# File 'lib/sequel/adapters/tinytds.rb', line 93

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