[registry] added sqlite3 database adapter
[rbot] / lib / rbot / registry / sqlite.rb
1 #-- vim:sw=2:et
2 #++
3 #
4 # :title: Sqlite3 registry implementation
5 #
6
7 require 'sqlite3'
8
9 module Irc
10 class Bot
11 class Registry
12
13   class SqliteAccessor < AbstractAccessor
14
15     def initialize(filename)
16       super filename + '.db'
17     end
18
19     def registry
20       super
21       unless @registry
22         @registry = SQLite3::Database.new(@filename)
23         begin
24           @registry.execute('SELECT COUNT(*) FROM data')
25         rescue
26           @registry.execute('CREATE TABLE data (key string, value blob)')
27         end
28       end
29       @registry
30     end
31
32     def flush
33     end
34
35     def optimize
36     end
37
38     def [](key)
39       if dbexists?
40         begin
41           value = @registry.get_first_row('SELECT value FROM data WHERE key = ?', key.to_s)
42           return restore(value.first)
43         rescue
44           return default
45         end
46       else
47         return default
48       end
49     end
50
51     def []=(key,value)
52       value = SQLite3::Blob.new(store(value))
53       if has_key? key
54         registry.execute('UPDATE data SET value = ? WHERE key = ?', value, key.to_s)
55       else
56         registry.execute('INSERT INTO data VALUES (?, ?)', key.to_s, value)
57       end
58     end
59
60     def each(&block)
61       return nil unless dbexists?
62       res = registry.execute('SELECT * FROM data')
63       res.each do |row|
64         key, value = row
65         block.call(key, restore(value))
66       end
67     end
68
69     def has_key?(key)
70       return nil unless dbexists?
71       res = registry.get_first_row('SELECT COUNT(*) FROM data WHERE key = ?', key.to_s)
72       return res.first > 0
73     end
74
75     def has_value?(value)
76       return nil unless dbexists?
77       value = SQLite3::Blob.new(store(value))
78       res = registry.get_first_row('SELECT COUNT(*) FROM data WHERE value = ?', value)
79       return res.first > 0
80     end
81
82     def delete(key)
83       return default unless dbexists?
84       begin
85         registry.execute('DELETE FROM data WHERE key = ?', key.to_s)
86         registry.changes > 0
87       rescue
88         false
89       end
90     end
91
92     # returns a list of your keys
93     def keys
94       return [] unless dbexists?
95       res = registry.execute('SELECT key FROM data')
96       res.map { |row| row.first }
97     end
98
99     def clear
100       return unless dbexists?
101       registry.execute('DELETE FROM data')
102     end
103
104     # returns the number of keys in your registry namespace
105     def length
106       return 0 unless dbexists?
107       res = registry.get_first_row('SELECT COUNT(key) FROM data')
108       res.first
109     end
110
111   end
112
113 end # Registry
114 end # Bot
115 end # Irc
116