Class: Sequel::SQLite::Database

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

Constant Summary

Constants included from DatabaseMethods

Sequel::SQLite::DatabaseMethods::AUTO_VACUUM, Sequel::SQLite::DatabaseMethods::SYNCHRONOUS, Sequel::SQLite::DatabaseMethods::TEMP_STORE, Sequel::SQLite::DatabaseMethods::TRANSACTION_MODE

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 collapse

Attributes included from DatabaseMethods

#current_timestamp_utc, #integer_booleans, #transaction_mode, #use_timestamp_timezones

Attributes inherited from Database

#cache_schema, #check_string_typecast_bytesize, #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 DatabaseMethods

#database_type, #foreign_key_list, #indexes, #set_integer_booleans, #sqlite_version, #supports_create_table_if_not_exists?, #supports_deferrable_foreign_key_constraints?, #supports_partial_indexes?, #supports_savepoints?, #tables, #use_timestamp_timezones?, #values, #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, #drop_column, #drop_index, #drop_join_table, #drop_table, #drop_table?, #drop_view, #extend_datasets, #extension, extension, #fetch, #from, #from_application_timestamp, #get, #global_index_namespace?, #in_transaction?, #inspect, #literal, #literal_symbol, #literal_symbol_set, load_adapter, #log_connection_yield, #log_exception, #log_info, #logger=, #new_connection, #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, #transaction, #typecast_value, #uri, #url, #valid_connection?

Constructor Details

#initialize(opts = OPTS) ⇒ Database

Returns a new instance of Database.



101
102
103
104
# File 'lib/sequel/adapters/sqlite.rb', line 101

def initialize(opts = OPTS)
  super
  @allow_regexp = typecast_value_boolean(opts[:setup_regexp_function])
end

Instance Attribute Details

#conversion_procsObject (readonly)

The conversion procs to use for this database



99
100
101
# File 'lib/sequel/adapters/sqlite.rb', line 99

def conversion_procs
  @conversion_procs
end

Instance Method Details

#allow_regexp?Boolean

Whether this Database instance is setup to allow regexp matching. True if the :setup_regexp_function option was passed when creating the Database.

Returns:

  • (Boolean)


144
145
146
# File 'lib/sequel/adapters/sqlite.rb', line 144

def allow_regexp?
  @allow_regexp
end

#connect(server) ⇒ Object

Connect to the database. Since SQLite is a file based database, available options are limited:

:database

database name (filename or ‘:memory:’ or file: URI)

:readonly

open database in read-only mode; useful for reading static data that you do not want to modify

:timeout

how long to wait for the database to be available if it is locked, given in milliseconds (default is 5000)



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/sequel/adapters/sqlite.rb', line 114

def connect(server)
  opts = server_opts(server)
  opts[:database] = ':memory:' if blank_object?(opts[:database])
  sqlite3_opts = {}
  sqlite3_opts[:readonly] = typecast_value_boolean(opts[:readonly]) if opts.has_key?(:readonly)
  db = ::SQLite3::Database.new(opts[:database].to_s, sqlite3_opts)
  db.busy_timeout(typecast_value_integer(opts.fetch(:timeout, 5000)))

  if USE_EXTENDED_RESULT_CODES
    db.extended_result_codes = true
  end
  
  connection_pragmas.each{|s| log_connection_yield(s, db){db.execute_batch(s)}}

  if typecast_value_boolean(opts[:setup_regexp_function])
    db.create_function("regexp", 2) do |func, regexp_str, string|
      func.result = Regexp.new(regexp_str).match(string) ? 1 : 0
    end
  end
  
  class << db
    attr_reader :prepared_statements
  end
  db.instance_variable_set(:@prepared_statements, {})
  
  db
end

#disconnect_connection(c) ⇒ Object

Disconnect given connections from the database.



149
150
151
152
# File 'lib/sequel/adapters/sqlite.rb', line 149

def disconnect_connection(c)
  c.prepared_statements.each_value{|v| v.first.close}
  c.close
end

#execute(sql, opts = OPTS, &block) ⇒ Object

Run the given SQL with the given arguments and yield each row.



155
156
157
# File 'lib/sequel/adapters/sqlite.rb', line 155

def execute(sql, opts=OPTS, &block)
  _execute(:select, sql, opts, &block)
end

#execute_ddl(sql, opts = OPTS) ⇒ Object

Drop any prepared statements on the connection when executing DDL. This is because prepared statements lock the table in such a way that you can’t drop or alter the table while a prepared statement that references it still exists.



167
168
169
170
171
172
173
# File 'lib/sequel/adapters/sqlite.rb', line 167

def execute_ddl(sql, opts=OPTS)
  synchronize(opts[:server]) do |conn|
    conn.prepared_statements.values.each{|cps, s| cps.close}
    conn.prepared_statements.clear
    super
  end
end

#execute_dui(sql, opts = OPTS) ⇒ Object

Run the given SQL with the given arguments and return the number of changed rows.



160
161
162
# File 'lib/sequel/adapters/sqlite.rb', line 160

def execute_dui(sql, opts=OPTS)
  _execute(:update, sql, opts)
end

#execute_insert(sql, opts = OPTS) ⇒ Object



175
176
177
# File 'lib/sequel/adapters/sqlite.rb', line 175

def execute_insert(sql, opts=OPTS)
  _execute(:insert, sql, opts)
end

#freezeObject



179
180
181
182
# File 'lib/sequel/adapters/sqlite.rb', line 179

def freeze
  @conversion_procs.freeze
  super
end

#to_application_timestamp(s) ⇒ Object

Handle Integer and Float arguments, since SQLite can store timestamps as integers and floats.



185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/sequel/adapters/sqlite.rb', line 185

def to_application_timestamp(s)
  case s
  when String
    super
  when Integer
    super(Time.at(s).to_s)
  when Float
    super(DateTime.jd(s).to_s)
  else
    raise Sequel::Error, "unhandled type when converting to : #{s.inspect} (#{s.class.inspect})"
  end
end