Module: ActiveRecord::ConnectionAdapters::SQLite3::DatabaseStatements

Included in:
ActiveRecord::ConnectionAdapters::SQLite3Adapter
Defined in:
activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb

Instance Method Summary collapse

Instance Method Details

#begin_db_transactionObject

:nodoc:


86
87
88
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 86

def begin_db_transaction #:nodoc:
  log("begin transaction", "TRANSACTION") { @connection.transaction }
end

#begin_isolated_db_transaction(isolation) ⇒ Object

:nodoc


77
78
79
80
81
82
83
84
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 77

def begin_isolated_db_transaction(isolation) #:nodoc
  raise TransactionIsolationError, "SQLite3 only supports the `read_uncommitted` transaction isolation level" if isolation != :read_uncommitted
  raise StandardError, "You need to enable the shared-cache mode in SQLite mode before attempting to change the transaction isolation level" unless shared_cache?

  Thread.current.thread_variable_set("read_uncommitted", @connection.get_first_value("PRAGMA read_uncommitted"))
  @connection.read_uncommitted = true
  begin_db_transaction
end

#commit_db_transactionObject

:nodoc:


90
91
92
93
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 90

def commit_db_transaction #:nodoc:
  log("commit transaction", "TRANSACTION") { @connection.commit }
  reset_read_uncommitted
end

#exec_delete(sql, name = "SQL", binds = []) ⇒ Object Also known as: exec_update


71
72
73
74
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 71

def exec_delete(sql, name = "SQL", binds = [])
  exec_query(sql, name, binds)
  @connection.changes
end

#exec_query(sql, name = nil, binds = [], prepare: false) ⇒ Object


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
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 35

def exec_query(sql, name = nil, binds = [], prepare: false)
  if preventing_writes? && write_query?(sql)
    raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
  end

  materialize_transactions

  type_casted_binds = type_casted_binds(binds)

  log(sql, name, binds, type_casted_binds) do
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      # Don't cache statements if they are not prepared
      unless prepare
        stmt = @connection.prepare(sql)
        begin
          cols = stmt.columns
          unless without_prepared_statement?(binds)
            stmt.bind_params(type_casted_binds)
          end
          records = stmt.to_a
        ensure
          stmt.close
        end
      else
        stmt = @statements[sql] ||= @connection.prepare(sql)
        cols = stmt.columns
        stmt.reset!
        stmt.bind_params(type_casted_binds)
        records = stmt.to_a
      end

      build_result(columns: cols, rows: records)
    end
  end
end

#exec_rollback_db_transactionObject

:nodoc:


95
96
97
98
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 95

def exec_rollback_db_transaction #:nodoc:
  log("rollback transaction", "TRANSACTION") { @connection.rollback }
  reset_read_uncommitted
end

#execute(sql, name = nil) ⇒ Object

:nodoc:


21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 21

def execute(sql, name = nil) #:nodoc:
  if preventing_writes? && write_query?(sql)
    raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
  end

  materialize_transactions

  log(sql, name) do
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      @connection.execute(sql)
    end
  end
end

#explain(arel, binds = []) ⇒ Object


16
17
18
19
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 16

def explain(arel, binds = [])
  sql = "EXPLAIN QUERY PLAN #{to_sql(arel, binds)}"
  SQLite3::ExplainPrettyPrinter.new.pp(exec_query(sql, "EXPLAIN", []))
end

#write_query?(sql) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)

12
13
14
# File 'activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb', line 12

def write_query?(sql) # :nodoc:
  !READ_QUERY.match?(sql)
end