Class: Sequel::ODBC::Database

Inherits:
Database show all
Defined in:
lib/sequel/adapters/odbc.rb

Constant Summary collapse

GUARDED_DRV_NAME =
/^\{.+\}$/.freeze
DRV_NAME_GUARDS =
'{%s}'.freeze

Constants inherited from Database

Database::ADAPTERS, Database::AUTOINCREMENT, Database::CASCADE, Database::COMMA_SEPARATOR, Database::NOT_NULL, Database::NO_ACTION, Database::NULL, Database::PRIMARY_KEY, Database::RESTRICT, Database::SET_DEFAULT, Database::SET_NULL, Database::SQL_BEGIN, Database::SQL_COMMIT, Database::SQL_ROLLBACK, Database::TYPES, Database::UNDERSCORE, Database::UNIQUE, Database::UNSIGNED

Instance Attribute Summary

Attributes inherited from Database

#default_schema, #loggers, #opts, #pool, #prepared_statements

Instance Method Summary collapse

Methods inherited from Database

#<<, #>>, #[], adapter_class, adapter_scheme, #add_column, #add_index, #alter_table, #alter_table_sql, #alter_table_sql_list, #auto_increment_sql, #call, #column_definition_sql, #column_list_sql, #column_references_sql, connect, #constraint_definition_sql, #create_or_replace_view, #create_table, #create_table!, #create_table_sql_list, #create_view, #default_index_name, #disconnect, #drop_column, #drop_index, #drop_index_sql, #drop_table, #drop_table_sql, #drop_view, #execute_ddl, #execute_insert, #fetch, #filter_expr, #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=, #index_definition_sql, #index_list_sql_list, #inspect, #literal, #log_info, #logger, #logger=, #multi_threaded?, #on_delete_clause, #query, #quote_identifier, #quote_identifiers=, quote_identifiers=, #quote_identifiers?, #quote_schema_table, #rename_column, #rename_table, #rename_table_sql, #schema, #schema_utility_dataset, #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?, #uri, #url

Methods included from Metaprogramming

#meta_def

Constructor Details

#initialize(opts) ⇒ Database

Returns a new instance of Database.



11
12
13
14
15
16
17
18
19
20
21
# File 'lib/sequel/adapters/odbc.rb', line 11

def initialize(opts)
  super(opts)
  case opts[:db_type]
  when 'mssql'
    Sequel.require 'adapters/shared/mssql'
    extend Sequel::MSSQL::DatabaseMethods
  when 'progress'
    Sequel.require 'adapters/shared/progress'
    extend Sequel::Progress::DatabaseMethods
  end
end

Instance Method Details

#connect(server) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/sequel/adapters/odbc.rb', line 23

def connect(server)
  opts = server_opts(server)
  if opts.include? :driver
    drv = ::ODBC::Driver.new
    drv.name = 'Sequel ODBC Driver130'
    opts.each do |param, value|
      if :driver == param and not (value =~ GUARDED_DRV_NAME)
        value = DRV_NAME_GUARDS % value
      end
      drv.attrs[param.to_s.capitalize] = value
    end
    db = ::ODBC::Database.new
    conn = db.drvconnect(drv)
  else
    conn = ::ODBC::connect(opts[:database], opts[:user], opts[:password])
  end
  conn.autocommit = true
  conn
end

#dataset(opts = nil) ⇒ Object



43
44
45
# File 'lib/sequel/adapters/odbc.rb', line 43

def dataset(opts = nil)
  ODBC::Dataset.new(self, opts)
end

#execute(sql, opts = {}) ⇒ Object

ODBC returns native statement objects, which must be dropped if you call execute manually, or you will get warnings. See the fetch_rows method source code for an example of how to drop the statements.



51
52
53
54
55
56
57
58
# File 'lib/sequel/adapters/odbc.rb', line 51

def execute(sql, opts={})
  log_info(sql)
  synchronize(opts[:server]) do |conn|
    r = conn.run(sql)
    yield(r) if block_given?
    r
  end
end

#execute_dui(sql, opts = {}) ⇒ Object Also known as: do



60
61
62
63
# File 'lib/sequel/adapters/odbc.rb', line 60

def execute_dui(sql, opts={})
  log_info(sql)
  synchronize(opts[:server]){|conn| conn.do(sql)}
end

#transaction(opts = {}) ⇒ Object

Support single level transactions on ODBC



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/sequel/adapters/odbc.rb', line 67

def transaction(opts={})
  unless opts.is_a?(Hash)
    Deprecation.deprecate('Passing an argument other than a Hash to Database#transaction', "Use DB.transaction(:server=>#{opts.inspect})") 
    opts = {:server=>opts}
  end
  synchronize(opts[:server]) do |conn|
    return yield(conn) if @transactions.include?(Thread.current)
    log_info(begin_transaction_sql)
    conn.do(begin_transaction_sql)
    begin
      @transactions << Thread.current
      yield(conn)
    rescue ::Exception => e
      log_info(rollback_transaction_sql)
      conn.do(rollback_transaction_sql)
      transaction_error(e)
    ensure
      unless e
        log_info(commit_transaction_sql)
        conn.do(commit_transaction_sql)
      end
      @transactions.delete(Thread.current)
    end
  end
end