class MiGA::SQLite

SQLite3 wrapper for MiGA.

Attributes

opts[R]

Options hash

path[R]

Database absolute path

Public Class Methods

default_opts(opts = {}) click to toggle source

Default parsing options. Supported opts keys:

  • :busy_attempts: Number of times to retry when database is busy (default: 3)

# File lib/miga/sqlite.rb, line 14
def default_opts(opts = {})
  opts[:busy_attempts] ||= 3
  opts
end
new(path, opts = {}) click to toggle source

Create MiGA::SQLite with database in path (without opening a connection) and options opts (see .default_opts)

# File lib/miga/sqlite.rb, line 31
def initialize(path, opts = {})
  @opts = MiGA::SQLite.default_opts(opts)
  @path = File.absolute_path(path)
  MiGA::MiGA.DEBUG("Accessing database: #{path}")
end

Public Instance Methods

run(*cmd) { |conn| ... } click to toggle source

Executes cmd and returns the result. Alternatively, if a block is passed, the commands are ignored and the block is executed with a single parameter of the database connection

# File lib/miga/sqlite.rb, line 41
def run(*cmd)
  if block_given?
    run_block { |conn| yield(conn) }
  else
    y = nil
    run_block { |conn| y = conn.execute(*cmd) }
    y
  end
end
run_block(&blk) click to toggle source

Executes blk that accepts a single parameter for the database connection

# File lib/miga/sqlite.rb, line 54
def run_block(&blk)
  busy_attempts ||= 0
  io_attempts ||= 0
  SQLite3::Database.new(path) { |conn| blk[conn] }
rescue SQLite3::BusyException => e
  busy_attempts += 1
  raise "Database busy #{path}: #{e.message}" if busy_attempts >= 3

  sleep(1)
  retry
rescue SQLite3::IOException => e
  io_attempts += 1
  raise "Database I/O error #{path}: #{e.message}" if io_attempts >= 3

  sleep(1)
  retry
end