lib/litedb.rb in litedb-0.2.0 vs lib/litedb.rb in litedb-0.2.1
- old
+ new
@@ -1,100 +1,11 @@
# frozen_string_literal: true
require_relative "litedb/version"
+require_relative "litedb/connection"
require "sqlite3"
require "litescheduler"
-class Litedb < SQLite3::Database
+module Litedb
class Error < StandardError; end
-
- DEFAULT_FILE = ":memory:"
- DEFAULT_OPTIONS = {
- synchronous: :NORMAL,
- mmap_size: 32 * 1024, # 32 kilobytes
- journal_size_limit: 64 * 1024 * 1024 # 64 megabytes
- }.freeze
-
- attr_reader :config
-
- def initialize(file = nil, options = {}, zvfs = nil)
- @scheduler = Litescheduler.instance
- file ||= DEFAULT_FILE
- options = options.transform_keys { |key|
- begin
- key.to_sym
- rescue
- key
- end
- }
- @config = DEFAULT_OPTIONS.merge(options)
-
- super(file, @config, zvfs)
-
- set_pragmas
- run_migrations
- prepare_statements
- end
-
- def run_statement(statement, *args)
- statements[statement].execute!(*args)
- end
-
- private
-
- def set_pragmas
- # set a custom busy handler to override the `busy_timeout`
- # this ensures we either switch to another execution context or try again to connect
- # https://www.sqlite.org/pragma.html#pragma_busy_timeout
- busy_handler { @scheduler.switch || sleep(rand * 0.001) }
- # Journal mode WAL allows for greater concurrency (many readers + one writer)
- # https://www.sqlite.org/pragma.html#pragma_journal_mode
- self.journal_mode = :WAL
- # level of database durability
- # 2 = "FULL" (sync on every write)
- # 1 = "NORMAL" (sync every 1000 written pages)
- # 0 = "OFF" (don't sync)
- # https://www.sqlite.org/pragma.html#pragma_synchronous
- self.synchronous = @config[:synchronous]
- # set the global memory map so all processes can share data
- # https://www.sqlite.org/pragma.html#pragma_mmap_size
- # https://www.sqlite.org/mmap.html
- self.mmap_size = @config[:mmap_size]
- # impose a limit on the WAL file to prevent unlimited growth (with a negative impact on read performance as well)
- # https://www.sqlite.org/pragma.html#pragma_journal_size_limit
- self.journal_size_limit = @config[:journal_size_limit]
- end
-
- def run_migrations
- return if @config[:migrations].nil?
-
- migrations = if @config[:migrations].is_a?(Hash)
- @config[:migrations].values
- elsif @config[:migrations].is_a?(Array)
- @config[:migrations]
- else
- raise Error.new("`migrations` option must be either a Hash or an Array")
- end
-
- transaction(:immediate) do
- migrations.each do |sql|
- execute(clean_sql(sql))
- end
- end
- end
-
- def prepare_statements
- instance_variable_set(:@statements, {})
- self.class.attr_reader(:statements) unless respond_to?(:statements)
-
- return if @config[:statements].nil?
-
- @config[:statements].each do |key, sql|
- statements[key.to_sym] = prepare(clean_sql(sql))
- end
- end
-
- def clean_sql(sql)
- sql.gsub(/[[:space:]]+/, " ").strip
- end
end