Class: Og::SqliteAdapter
Overview
A Store that persists objects into an Sqlite3 database.
As well as the usual options to the constructor, you can also pass a :busy_timeout option which defines how quickly to retry a query, should the database be locked. The default value is 50ms. The retry will currently continue until successful.
To read documentation about the methods, consult the documentation for SqlStore and Store.
Instance Attribute Summary
Attributes inherited from SqlStore
Attributes inherited from Store
Instance Method Summary collapse
- #close ⇒ Object
- #commit ⇒ Object
-
#db_filename(options) ⇒ Object
Override if needed.
- #destroy_db(options) ⇒ Object
- #exec_statement(sql) ⇒ Object
-
#initialize(options) ⇒ SqliteAdapter
constructor
Initialize the Sqlite store.
- #last_insert_id(klass = nil) ⇒ Object
-
#primary_key_type ⇒ Object
The type used for default primary keys.
-
#query(sql) ⇒ Object
SQLite send back a BusyException if the database is locked.
- #query_statement(sql) ⇒ Object
- #rollback ⇒ Object
- #sql_update(sql) ⇒ Object
- #start ⇒ Object
-
#table_info(table) ⇒ Object
Returns the Sqlite information of a table within the database or nil if it doesn’t exist.
Methods included from SqlUtils
blob, build_join_name, create_join_table_sql, date, escape, join_class_ordering, join_object_ordering, join_table, join_table_index, join_table_info, join_table_key, join_table_keys, ordered_join_table_keys, parse_blob, parse_boolean, parse_date, parse_float, parse_int, parse_timestamp, quote, quote_array, table, tableize, timestamp
Methods inherited from SqlStore
#aggregate, #count, #create_db, #create_field_map, #create_table, #delete_all, #drop_table, #enchant, #eval_og_allocate, #eval_og_create_schema, #eval_og_delete, #eval_og_insert, #eval_og_read, #eval_og_update, #exec, #field_for_attribute, #field_sql_for_attribute, #fields_for_class, #find, #find_one, #force_primary_key, #handle_sql_exception, #insert_sql, #join, #load, #pk_field, #prepare_statement, #read_all, #read_attr, #read_field, #read_join_relations, #read_one, #read_row, #reload, #resolve_limit_options, #resolve_options, #select, #select_one, #serializable_attributes_for_class, #sql_indices_for_class, #sql_type_for_class, #table_exists?, #type_cast, #unjoin, #update, #update_by_sql, #update_condition, #write_attr
Methods inherited from Store
#count, #delete, #delete_all, #enchant, #find, #force_save!, #insert, #load, #reload, #save, #transaction, #update, #update_attributes
Constructor Details
#initialize(options) ⇒ SqliteAdapter
Initialize the Sqlite store. This store provides a default name.
32 33 34 35 36 |
# File 'lib/og/adapter/sqlite.rb', line 32 def initialize() super @busy_timeout = ([:busy_timeout] || 50)/1000 @conn = SQLite3::Database.new(db_filename()) end |
Instance Method Details
#close ⇒ Object
38 39 40 41 |
# File 'lib/og/adapter/sqlite.rb', line 38 def close @conn.close super end |
#commit ⇒ Object
82 83 84 85 |
# File 'lib/og/adapter/sqlite.rb', line 82 def commit @transaction_nesting -= 1 @conn.commit if @transaction_nesting < 1 end |
#db_filename(options) ⇒ Object
Override if needed.
45 46 47 48 49 50 51 52 |
# File 'lib/og/adapter/sqlite.rb', line 45 def db_filename() [:name] ||= 'data' if [:name] == ':memory:' ':memory:' else "#{[:name]}.db" end end |
#destroy_db(options) ⇒ Object
54 55 56 57 58 59 60 61 |
# File 'lib/og/adapter/sqlite.rb', line 54 def destroy_db() begin FileUtils.rm(db_filename()) super rescue Errno::ENOENT => ex # FIXME: Lookup Win32/Linux/BSD error Logger.info "Cannot drop '#{[:name]}'!" end end |
#exec_statement(sql) ⇒ Object
73 74 75 |
# File 'lib/og/adapter/sqlite.rb', line 73 def exec_statement(sql) query(sql).close() end |
#last_insert_id(klass = nil) ⇒ Object
97 98 99 |
# File 'lib/og/adapter/sqlite.rb', line 97 def last_insert_id(klass = nil) query("SELECT last_insert_rowid()").first_value.to_i end |
#primary_key_type ⇒ Object
The type used for default primary keys.
65 66 67 |
# File 'lib/og/adapter/sqlite.rb', line 65 def primary_key_type 'integer PRIMARY KEY' end |
#query(sql) ⇒ Object
SQLite send back a BusyException if the database is locked. Currently we keep sending the query until success or the universe implodes. Note that the SQLite3 ruby library provides a busy_timeout, and busy_handler facility, but I couldn’t get the thing to work.
113 114 115 116 117 118 119 120 |
# File 'lib/og/adapter/sqlite.rb', line 113 def query(sql) begin return @conn.query(sql) rescue SQLite3::BusyException sleep(@busy_timeout) retry end end |
#query_statement(sql) ⇒ Object
69 70 71 |
# File 'lib/og/adapter/sqlite.rb', line 69 def query_statement(sql) return query(sql) end |
#rollback ⇒ Object
87 88 89 90 |
# File 'lib/og/adapter/sqlite.rb', line 87 def rollback @transaction_nesting -= 1 @conn.rollback if @transaction_nesting < 1 end |
#sql_update(sql) ⇒ Object
92 93 94 95 |
# File 'lib/og/adapter/sqlite.rb', line 92 def sql_update(sql) exec(sql) @conn.changes end |
#start ⇒ Object
77 78 79 80 |
# File 'lib/og/adapter/sqlite.rb', line 77 def start @conn.transaction if @transaction_nesting < 1 @transaction_nesting += 1 end |
#table_info(table) ⇒ Object
Returns the Sqlite information of a table within the database or nil if it doesn’t exist. Mostly for internal usage.
104 105 106 107 |
# File 'lib/og/adapter/sqlite.rb', line 104 def table_info(table) r = query_statement("SELECT name FROM sqlite_master WHERE type='table' AND name='#{self.class.escape(table.to_s)}'"); return r && r.blank? ? nil : r.next end |