]> jfr.im git - irc/rizon/acid.git/blob - pyva/pyva/src/main/python/pseudoclient/sys_options.py
Split pyva plugin into pyva.core and pyva.pyva
[irc/rizon/acid.git] / pyva / pyva / src / main / python / pseudoclient / sys_options.py
1 from collection import *
2 from sys_base import *
3 from istring import istring
4
5 class OptionManager(InvariantCollection, Subsystem):
6 def __init__(self, module):
7 InvariantCollection.__init__(self)
8 Subsystem.__init__(self, module, self, 'options')
9 self.module = module
10 self.db_open()
11 self.cursor.execute("CREATE TABLE IF NOT EXISTS " + module.name + "_options (name VARCHAR(51) NOT NULL, value TEXT, PRIMARY KEY (name))")
12 self.cursor.execute("SELECT name, value FROM " + module.name + "_options")
13 self.deleted_values = []
14
15 for row in self.cursor.fetchall():
16 name = istring(row[0])
17 value = istring(row[1])
18 self[name] = [name, value, False]
19
20 def get(self, name, type, default = None):
21 if not name in self:
22 if default != None:
23 self[name] = [name, istring(default), True]
24
25 return default
26
27 return type(self[name][1])
28
29 def set(self, name, value):
30 new_value = istring(value)
31
32 if not name in self:
33 self[name] = [name, new_value, True]
34 else:
35 if (self[name][1] != new_value):
36 self[name][1]= new_value
37 self[name][2]= True
38
39 return value
40
41 def clear(self, name):
42 if not name in self:
43 return False
44
45 self.deleted_values.append(name)
46 del(self[name])
47 return True
48
49 def commit(self):
50 try:
51 deleted_values = [str(value) for value in self.deleted_values if value not in self]
52 changed_values = [(str(value[0]), str(value[1])) for value in self.list_all() if value[2]]
53
54 if len(deleted_values) > 0:
55 self.cursor.executemany("DELETE FROM " + self.module.name + "_options WHERE name = %s", deleted_values)
56 self.module.elog.commit('Deleted %d options from database.' % len(deleted_values))
57
58 if len(changed_values) > 0:
59 self.cursor.executemany("REPLACE INTO " + self.module.name + "_options (name, value) VALUES (%s, %s)", changed_values)
60 self.module.elog.commit('Committed %d options to database.' % len(changed_values))
61
62 self.deleted_values = []
63
64 for value in self.list_all():
65 value[2] = False
66 except Exception, err:
67 self.module.elog.error('Option commit failed: @b%s@b' % err)