-
Notifications
You must be signed in to change notification settings - Fork 49
/
basic.rb
109 lines (81 loc) · 2.18 KB
/
basic.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
module Picky
module Backends
class SQLite
class Basic
include Helpers::File
attr_reader :cache_path, :db
def initialize cache_path, options = {}
@cache_path = "#{cache_path}.sqlite3"
@empty = options[:empty]
@initial = options[:initial]
@realtime = options[:realtime]
lazily_initialize_client
end
def initial
@initial && @initial.clone || (@realtime ? self.reset : {})
end
def empty
@empty && @empty.clone || (@realtime ? self.reset.asynchronous : {})
end
def dump internal
dump_sqlite internal unless @realtime
self
end
def load
self
end
def clear
db.execute 'delete from key_value'
end
def lazily_initialize_client
@db ||= SQLite3::Database.new cache_path
end
def dump_sqlite internal
reset
transaction do
# Note: Internal structures need to
# implement each.
#
internal.each do |key, value|
encoded_value = Yajl::Encoder.encode value
db.execute 'insert into key_value values (?,?)', key.to_s, encoded_value
end
end
end
def reset
create_directory cache_path
lazily_initialize_client
truncate_db
self
end
# Drops the table and creates it anew.
#
# THINK Could this be replaced by a truncate (DELETE FROM) statement?
#
def truncate_db
drop_table
create_table
end
def drop_table
db.execute 'drop table if exists key_value;'
end
def asynchronous
db.execute 'PRAGMA synchronous = OFF;'
self
end
def synchronous
db.execute 'PRAGMA synchronous = ON;'
self
end
def transaction
db.execute 'BEGIN;'
yield
db.execute 'COMMIT;'
end
def to_s
"#{self.class}(#{cache_path})"
end
end
end
end
end