X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fipsilon.git;a=blobdiff_plain;f=ipsilon%2Futil%2Fdata.py;h=7d0e0ff5f8db927c523c855308d34c26594b4afc;hp=2a55bb2ac64fcb567fbc835553023012073f968a;hb=b6a436f76177c0180af3e0e70a88d3f974ac717d;hpb=2926eb00f40d925549b14b86f73f8649df1e9c05 diff --git a/ipsilon/util/data.py b/ipsilon/util/data.py index 2a55bb2..7d0e0ff 100755 --- a/ipsilon/util/data.py +++ b/ipsilon/util/data.py @@ -20,6 +20,8 @@ import os import sqlite3 import cherrypy +from random import randint +import sys class Store(object): @@ -118,6 +120,39 @@ class Store(object): def get_user_preferences(self, user): return self._load_user_prefs(self._user_dbname, user) + def save_user_preferences(self, user, options): + SELECT = "SELECT option, value FROM users WHERE name=?" + UPDATE = "UPDATE users SET value=? WHERE name=? AND option=?" + INSERT = "INSERT INTO users VALUES(?,?,?)" + con = None + try: + con = sqlite3.connect(self._user_dbname) + cur = con.cursor() + cur.execute(""" + CREATE TABLE IF NOT EXISTS users(name TEXT, + option TEXT, + value TEXT) + """) + curvals = dict() + for row in cur.execute(SELECT, (user,)): + curvals[row[0]] = row[1] + + for name in options: + if name in curvals: + cur.execute(UPDATE, (options[name], user, name)) + else: + cur.execute(INSERT, (user, name, options[name])) + + con.commit() + except sqlite3.Error, e: + if con: + con.rollback() + cherrypy.log.error("Failed to store config: [%s]" % e) + raise + finally: + if con: + con.close() + def get_plugins_config(self, facility): con = None rows = [] @@ -161,6 +196,41 @@ class Store(object): return (lpo, plco) + def get_plugin_config(self, facility, plugin): + con = None + rows = [] + try: + con = sqlite3.connect(self._admin_dbname) + cur = con.cursor() + cur.execute("CREATE TABLE IF NOT EXISTS " + + facility + " (name TEXT,option TEXT,value TEXT)") + cur.execute("SELECT option, value FROM " + + facility + " WHERE name=?", (plugin,)) + rows = cur.fetchall() + con.commit() + except sqlite3.Error, e: + if con: + con.rollback() + fpe = (facility, plugin, e) + cherrypy.log.error("Failed to get %s/%s config: [%s]" % fpe) + raise + finally: + if con: + con.close() + + res = dict() + for (option, value) in rows: + if option in res: + if res[option] is list: + res[option].append(value) + else: + v = res[option] + res[option] = [v, value] + else: + res[option] = value + + return res + def save_plugin_config(self, facility, plugin, options): SELECT = "SELECT option, value FROM %s WHERE name=?" % facility UPDATE = "UPDATE %s SET value=? WHERE name=? AND option=?" % facility @@ -169,6 +239,8 @@ class Store(object): try: con = sqlite3.connect(self._admin_dbname) cur = con.cursor() + cur.execute("CREATE TABLE IF NOT EXISTS " + + facility + " (name TEXT,option TEXT,value TEXT)") curvals = dict() for row in cur.execute(SELECT, (plugin,)): curvals[row[0]] = row[1] @@ -189,6 +261,25 @@ class Store(object): if con: con.close() + def wipe_plugin_config(self, facility, plugin): + # Try to backup old data first, just in case ? + try: + con = sqlite3.connect(self._admin_dbname) + cur = con.cursor() + cur.execute("CREATE TABLE IF NOT EXISTS " + + facility + " (name TEXT,option TEXT,value TEXT)") + cur.execute("DELETE FROM " + facility + " WHERE name=?", + (plugin,)) + con.commit() + except sqlite3.Error, e: + if con: + con.rollback() + cherrypy.log.error("Failed to wipe %s config: [%s]" % (plugin, e)) + raise + finally: + if con: + con.close() + def get_data(self, plugin, idval=None, name=None, value=None): con = None rows = [] @@ -276,3 +367,66 @@ class Store(object): finally: if con: con.close() + + def new_datum(self, plugin, datum): + ID = "(SELECT IFNULL(MAX(id), 0) + 1 FROM %s_data)" % plugin + INSERT_NEW = "INSERT INTO %s_data VALUES(%s,?,?)" % (plugin, ID) + INSERT = "INSERT INTO %s_data VALUES(?,?,?)" % plugin + SELECT = "SELECT id FROM %s_data WHERE name=? AND value=?" % plugin + DELETE = "DELETE FROM %s_data WHERE name=? AND value=?" % plugin + con = None + try: + con = sqlite3.connect(self._admin_dbname) + cur = con.cursor() + tmpid = ('new', str(randint(0, sys.maxint))) + cur.execute(INSERT_NEW, tmpid) + cur.execute(SELECT, tmpid) + rows = cur.fetchall() + idval = rows[0][0] + for name in datum: + cur.execute(INSERT, (idval, name, datum[name])) + cur.execute(DELETE, tmpid) + con.commit() + except sqlite3.Error, e: + if con: + con.rollback() + cherrypy.log.error("Failed to store %s data: [%s]" % (plugin, e)) + raise + finally: + if con: + con.close() + + def del_datum(self, plugin, idval): + DELETE = "DELETE FROM %s_data WHERE id=?" % plugin + con = None + try: + con = sqlite3.connect(self._admin_dbname) + cur = con.cursor() + cur.execute(DELETE, (idval,)) + con.commit() + except sqlite3.Error, e: + if con: + con.rollback() + cherrypy.log.error("Failed to delete %s data: [%s]" % (plugin, e)) + raise + finally: + if con: + con.close() + + def wipe_data(self, plugin): + # Try to backup old data first, just in case + try: + con = sqlite3.connect(self._admin_dbname) + cur = con.cursor() + cur.execute("DROP TABLE IF EXISTS " + plugin + "_data") + cur.execute("CREATE TABLE " + plugin + "_data" + "(id INTEGER, name TEXT, value TEXT)") + con.commit() + except sqlite3.Error, e: + if con: + con.rollback() + cherrypy.log.error("Failed to wipe %s data: [%s]" % (plugin, e)) + raise + finally: + if con: + con.close()