On this page
class ActiveRecord::ConnectionAdapters::SQLite3Adapter
The SQLite3 adapter works SQLite 3.6.16 or newer with the sqlite3-ruby drivers (available as gem from rubygems.org/gems/sqlite3).
Options:
:database
- Path to the database file.
Constants
- NATIVE_DATABASE_TYPES
Public Class Methods
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 130
def initialize(connection, logger, config)
super(connection, logger)
@active = nil
@statements = StatementPool.new(@connection,
self.class.type_cast_config_to_integer(config.fetch(:statement_limit) { 1000 }))
@config = config
if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
@prepared_statements = true
@visitor = Arel::Visitors::SQLite.new self
else
@visitor = unprepared_visitor
end
end
Public Instance Methods
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 185
def active?
@active != false
end
Returns 62. SQLite supports index names up to 64 characters. The rest is used by rails internally to perform temporary rename operations
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 209
def allowed_index_name_length
index_name_length - 2
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 477
def change_column_null(table_name, column_name, null, default = nil)
unless null || default.nil?
exec_query("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
end
alter_table(table_name) do |definition|
definition[column_name].null = null
end
end
Clears the prepared statements cache.
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 198
def clear_cache!
@statements.clear
end
Disconnects from the database if already connected. Otherwise, this method does nothing.
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 191
def disconnect!
super
@active = false
@connection.close rescue nil
end
Returns the current database encoding format as a string, eg: 'UTF-8'
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 218
def encoding
@connection.encoding.to_s
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 323
def exec_delete(sql, name = 'SQL', binds = [])
exec_query(sql, name, binds)
@connection.changes
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 293
def exec_query(sql, name = nil, binds = [])
type_casted_binds = binds.map { |col, val|
[col, type_cast(val, col)]
}
log(sql, name, type_casted_binds) do
# Don't cache statements if they are not prepared
if without_prepared_statement?(binds)
stmt = @connection.prepare(sql)
begin
cols = stmt.columns
records = stmt.to_a
ensure
stmt.close
end
stmt = records
else
cache = @statements[sql] ||= {
:stmt => @connection.prepare(sql)
}
stmt = cache[:stmt]
cols = cache[:cols] ||= stmt.columns
stmt.reset!
stmt.bind_params type_casted_binds.map { |_, val| val }
end
ActiveRecord::Result.new(cols, stmt.to_a)
end
end
DATABASE STATEMENTS ======================================
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 274
def explain(arel, binds = [])
sql = "EXPLAIN QUERY PLAN #{to_sql(arel, binds)}"
ExplainPrettyPrinter.new.pp(exec_query(sql, 'EXPLAIN', binds))
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 329
def last_inserted_id(result)
@connection.last_insert_row_id
end
QUOTING ==================================================
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 228
def quote(value, column = nil)
if value.kind_of?(String) && column && column.type == :binary
s = value.unpack("H*")[0]
"x'#{s}'"
else
super
end
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 241
def quote_table_name_for_assignment(table, attr)
quote_column_name(attr)
end
Renames a table.
Example:
rename_table('octopuses', 'octopi')
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 444
def rename_table(table_name, new_name)
exec_query "ALTER TABLE #{quote_table_name(table_name)} RENAME TO #{quote_table_name(new_name)}"
rename_table_indexes(table_name, new_name)
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 177
def requires_reloading?
true
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 353
def select_rows(sql, name = nil, binds = [])
exec_query(sql, name, binds).rows
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 181
def supports_add_column?
true
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 150
def supports_ddl_transactions?
true
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 222
def supports_explain?
true
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 202
def supports_index_sort_order?
true
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 158
def supports_partial_index?
sqlite_version >= '3.8.0'
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 154
def supports_savepoints?
true
end
Returns true, since this connection adapter supports prepared statement caching.
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 164
def supports_statement_cache?
true
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 384
def table_exists?(table_name)
table_name && tables(nil, table_name).any?
end
See: www.sqlite.org/lang_altertable.html SQLite has an additional restriction on the ALTER TABLE statement
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 451
def valid_alter_table_options( type, options)
type.to_sym != :primary_key
end
Protected Instance Methods
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 608
def sqlite_version
@sqlite_version ||= SQLite3Adapter::Version.new(select_value('select sqlite_version(*)'))
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 513
def table_structure(table_name)
structure = exec_query("PRAGMA table_info(#{quote_table_name(table_name)})", 'SCHEMA').to_hash
raise(ActiveRecord::StatementInvalid, "Could not find table '#{table_name}'") if structure.empty?
structure
end
# File activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb, line 612
def translate_exception(exception, message)
case exception.message
# SQLite 3.8.2 returns a newly formatted error message:
# UNIQUE constraint failed: *table_name*.*column_name*
# Older versions of SQLite return:
# column *column_name* is not unique
when /column(s)? .* (is|are) not unique/, /UNIQUE constraint failed: .*/
RecordNotUnique.new(message, exception)
else
super
end
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.