+from ipsilon.util.log import Log
+import uuid
+
+
+OPTIONS_COLUMNS = ['name', 'option', 'value']
+UNIQUE_DATA_COLUMNS = ['uuid', 'name', 'value']
+
+
+class Store(Log):
+
+ def __init__(self, name):
+ self._dbname = name
+
+ def _build_where(self, kvfilter, kvout):
+ where = ""
+ sep = "WHERE"
+ for k in kvfilter:
+ mk = "where_%s" % k
+ kvout[mk] = kvfilter[k]
+ where += "%s %s=:%s" % (sep, k, mk)
+ sep = " AND"
+ return where
+
+ def _build_select(self, table, kvfilter=None, kvout=None, columns=None):
+ SELECT = "SELECT %(cols)s FROM %(table)s %(where)s"
+ cols = "*"
+ if columns:
+ cols = ",".join(columns)
+ where = ""
+ if kvfilter is not None:
+ where = self._build_where(kvfilter, kvout)
+ return SELECT % {'table': table, 'cols': cols, 'where': where}
+
+ def _select(self, cursor, table, kvfilter=None, columns=None):
+ kv = dict()
+ select = self._build_select(table, kvfilter, kv, columns)
+ cursor.execute(select, kv)
+ return cursor.fetchall()
+
+ def _create(self, cursor, table, columns):
+ CREATE = "CREATE TABLE IF NOT EXISTS %(table)s(%(cols)s)"
+ cols = ",".join(columns)
+ create = CREATE % {'table': table, 'cols': cols}
+ cursor.execute(create)
+
+ def _update(self, cursor, table, values, kvfilter):
+ UPDATE = "UPDATE %(table)s SET %(setval)s %(where)s"
+ kv = dict()
+
+ setval = ""
+ sep = ""
+ for k in values:
+ mk = "setval_%s" % k
+ kv[mk] = values[k]
+ setval += "%s%s=:%s" % (sep, k, mk)
+ sep = " , "
+
+ where = self._build_where(kvfilter, kv)
+
+ update = UPDATE % {'table': table, 'setval': setval, 'where': where}
+ cursor.execute(update, kv)
+
+ def _insert(self, cursor, table, values):
+ INSERT = "INSERT INTO %(table)s VALUES(%(values)s)"
+ vals = ""
+ sep = ""
+ for _ in values:
+ vals += "%s?" % sep
+ sep = ","
+ insert = INSERT % {'table': table, 'values': vals}
+ cursor.execute(insert, values)
+
+ def _delete(self, cursor, table, kvfilter):
+ DELETE = "DELETE FROM %(table)s %(where)s"
+ kv = dict()
+ where = self._build_where(kvfilter, kv)
+ delete = DELETE % {'table': table, 'where': where}
+ cursor.execute(delete, kv)
+
+ def _row_to_dict_tree(self, data, row):
+ name = row[0]
+ if len(row) > 2:
+ if name not in data:
+ data[name] = dict()
+ d2 = data[name]
+ self._row_to_dict_tree(d2, row[1:])