Class: ActiveHarness::Memory::Adapter::Sqlite

Inherits:
Base
  • Object
show all
Defined in:
lib/active_harness/memory/adapter/sqlite.rb

Overview

SQLite-backed memory adapter.

Requires the ‘sqlite3’ gem — add it to your Gemfile yourself:

gem 'sqlite3'

Connection options (one of):

database:   — path to the SQLite file; adapter opens and closes the connection
            use ":memory:" for an in-process, non-persistent database
connection: — an existing SQLite3::Database instance you manage

Storage options:

table_name:      — default "active_harness_memory_turns"
storage_size:    — max turns per session kept in the table (default 1000)
eviction_percent — % of oldest turns to drop when limit is hit (default 10)
on_trim:         — Proc called with evicted turns
namespace:       — isolates turns within a session

Constant Summary collapse

DEFAULT_TABLE =
"active_harness_memory_turns"
DEFAULT_STORAGE_SIZE =
1000
DEFAULT_TRIM_PERCENT =
10
TABLE_NAME_RE =
/\A[a-zA-Z_][a-zA-Z0-9_.]*\z/

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ Sqlite

Returns a new instance of Sqlite.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/active_harness/memory/adapter/sqlite.rb', line 29

def initialize(opts = {})
  @table        = opts.fetch(:table_name, DEFAULT_TABLE).to_s
  @storage_size = opts.fetch(:storage_size, DEFAULT_STORAGE_SIZE)
  @trim_percent = opts.fetch(:eviction_percent, DEFAULT_TRIM_PERCENT)
  @on_trim      = opts[:on_trim]
  @namespace    = opts[:namespace]

  unless @table.match?(TABLE_NAME_RE)
    raise ArgumentError, "Invalid table_name: #{@table.inspect}"
  end

  @borrowed_conn = opts[:connection]
  @db_path       = opts[:database]
  @owned_conn    = nil
  @session_id    = nil
  @turns         = []
end

Instance Method Details

#closeObject



63
64
65
66
67
68
# File 'lib/active_harness/memory/adapter/sqlite.rb', line 63

def close
  if @owned_conn
    @owned_conn.close rescue nil
    @owned_conn = nil
  end
end

#deleteObject



70
71
72
73
74
75
76
# File 'lib/active_harness/memory/adapter/sqlite.rb', line 70

def delete
  db.execute(
    "DELETE FROM #{@table} WHERE session_id = ? AND (namespace IS ?)",
    [@session_id, @namespace]
  )
  @turns = []
end

#open(session_id) ⇒ Object



47
48
49
50
51
# File 'lib/active_harness/memory/adapter/sqlite.rb', line 47

def open(session_id)
  @session_id = session_id
  ensure_connection!
  @turns = fetch_turns
end

#readObject



53
54
55
# File 'lib/active_harness/memory/adapter/sqlite.rb', line 53

def read
  @turns.dup
end

#write(turn) ⇒ Object



57
58
59
60
61
# File 'lib/active_harness/memory/adapter/sqlite.rb', line 57

def write(turn)
  insert_turn(turn)
  @turns << turn
  trim_if_needed!
end