database integration: first draft

- using SQLite as backend

/!\ Not finished yet, break execution. SàT CAN'T LAUNCH PROPERLY IN THE CURRENT STATE
This commit is contained in:
Goffi 2011-10-30 23:13:40 +01:00
commit 1982eb79d8

View file

@ -27,16 +27,17 @@ import cPickle as pickle
from ConfigParser import SafeConfigParser, NoOptionError, NoSectionError
from xml.dom import minidom
from logging import debug, info, warning, error
import pdb
from twisted.internet import defer
from twisted.words.protocols.jabber import jid
from sat.tools.xml_tools import paramsXml2xmlUI
from sat.core.default_config import default_config
from sat.tools.sqlite import SqliteStorage
SAVEFILE_PARAM_XML="/param" #xml parameters template
SAVEFILE_PARAM_DATA="/param" #individual & general parameters; _ind and _gen suffixes will be added
SAVEFILE_HISTORY="/history"
SAVEFILE_PRIVATE="/private" #file used to store misc values (mainly for plugins)
SAVEFILE_DATABASE="/sat.db"
class Param():
"""This class manage parameters with xml"""
@ -75,26 +76,20 @@ class Param():
"""Load parameters template from file"""
self.dom = minidom.parse(file)
def load_data(self, file):
"""Load parameters data from file"""
file_ind = file + '_ind'
file_gen = file + '_gen'
if os.path.exists(file_gen):
try:
with open(file_gen, 'r') as file_gen_pickle:
self.params_gen=pickle.load(file_gen_pickle)
debug(_("general params data loaded"))
except:
error (_("Can't load general params data !"))
def loadGenData(self, storage):
"""Load general parameters data from storage
@param storage: xxxStorage object instance
@return: deferred triggered once params are loaded"""
return storage.loadGenParams(self.params_gen)
if os.path.exists(file_ind):
try:
with open(file_ind, 'r') as file_ind_pickle:
self.params=pickle.load(file_ind_pickle)
debug(_("individual params data loaded"))
except:
error (_("Can't load individual params data !"))
def loadIndData(self, storage, profile):
"""Load individual parameters
set self.params cache
@param storage: xxxStorage object instance
@param profile: profile to load (*must exist*)
@return: deferred triggered once params are loaded"""
self.params[profile] = {}
return storage.loadIndParams(self.params, profile)
def save_xml(self, file):
"""Save parameters template to xml file"""
@ -124,28 +119,25 @@ class Param():
host.set_const('savefile_param_data', SAVEFILE_PARAM_DATA)
host.registerGeneralCB("registerNewAccount", host.registerNewAccountCB)
def getProfilesList(self):
return self.params.keys()
def createProfile(self, name):
"""Create a new profile
@param name: Name of the profile"""
if self.params.has_key(name):
if self.storage.hasProfile(name):
info (_('The profile name already exists'))
return 1
return True
if not self.host.trigger.point("ProfileCreation", name):
return 0
return False
self.params[name]={}
return 0
return False
def deleteProfile(self, name):
"""Delete an existing profile
@param name: Name of the profile"""
if not self.params.has_key(name):
if not self.storage.hasProfile(name):
error (_('Trying to delete an unknown profile'))
return 1
return True
del self.params[name]
return 0
return False
def getProfileName(self, profile_key):
"""return profile according to profile_key
@ -159,10 +151,10 @@ class Param():
default = self.host.memory.getPrivate('Profile_default')
if not default or not default in self.params:
info(_('No default profile, returning first one')) #TODO: manage real default profile
default = self.params.keys()[0]
default = self.getProfilesList()[0]
self.host.memory.setPrivate('Profile_default', default)
return default #FIXME: temporary, must use real default value, and fallback to first one if it doesn't exists
if not self.params.has_key(profile_key):
if not self.storage.hasProfile(profile_key):
info (_('Trying to access an unknown profile'))
return ""
return profile_key
@ -396,6 +388,7 @@ class Param():
if node[0] == 'general':
self.params_gen[(category, name)] = value
self.storage.setGenParam(category, name, value)
for profile in self.getProfilesList():
if self.host.isConnected(profile):
self.host.bridge.paramUpdate(name, value, category, profile)
@ -408,14 +401,18 @@ class Param():
if type=="button":
print "clique",node.toxml()
else:
self.params[profile][(category, name)] = value
self.host.bridge.paramUpdate(name, value, category, profile) #TODO: add profile in signal
if self.host.isConnected(profile): #key can not exists if profile is not connected
self.params[profile][(category, name)] = value
self.host.bridge.paramUpdate(name, value, category, profile)
self.storage.setIndParam(category, name, value, profile)
class Memory:
"""This class manage all persistent informations"""
def __init__(self, host):
info (_("Memory manager init"))
self.initialized = defer.Deferred()
init_defers = [] #list of deferred to wait before initialization is finished
self.host = host
self.contacts={}
self.presenceStatus={}
@ -429,7 +426,14 @@ class Memory:
self.config = self.parseMainConf()
host.set_const('savefile_history', SAVEFILE_HISTORY)
host.set_const('savefile_private', SAVEFILE_PRIVATE)
self.load()
host.set_const('savefile_database', SAVEFILE_DATABASE)
database_file = os.path.expanduser(self.getConfig('','local_dir')+
self.host.get_const('savefile_database'))
self.loadFiles()
self.storage = SqliteStorage(database_file)
self.storage.initialized.addCallback(lambda ignore: self.load(init_defers))
defer.DeferredList(init_defers).chainDeferred(self.initialized)
def parseMainConf(self):
"""look for main .ini configuration file, and parse it"""
@ -455,7 +459,8 @@ class Memory:
return os.path.expanduser(_value) if name.endswith('_path') or name.endswith('_dir') else _value
def load(self):
def loadFiles(self):
"""Load parameters and all memory things from file/db"""
param_file_xml = os.path.expanduser(self.getConfig('','local_dir')+
self.host.get_const('savefile_param_xml'))
@ -466,7 +471,7 @@ class Memory:
private_file = os.path.expanduser(self.getConfig('','local_dir')+
self.host.get_const('savefile_private'))
#parameters
#parameters template
if os.path.exists(param_file_xml):
try:
self.params.load_xml(param_file_xml)
@ -478,12 +483,7 @@ class Memory:
info (_("No params template, using default template"))
self.params.load_default_params()
try:
self.params.load_data(param_file_data)
debug(_("params loaded"))
except:
error (_("Can't load params !"))
#history
if os.path.exists(history_file):
try:
@ -502,6 +502,22 @@ class Memory:
except:
error (_("Can't load private values !"))
def load(self, init_defers):
"""Load parameters and all memory things from db
@param init_defers: list of deferred to wait before parameters are loaded"""
#parameters data
init_defers.append(self.params.loadGenData(self.storage))
def loadIndividualParams(self, profile_key):
"""Load individual parameters for a profile
@param profile_key: %(doc_profile_key)s"""
profile = self.getProfileName(profile_key)
if not profile:
error (_('Trying to load parameters for a non-existant profile'))
raise Exception("Profile doesn't exist")
return self.params.loadIndParams(profile)
def save(self):
"""Save parameters and all memory things to file/db"""
#TODO: need to encrypt files (at least passwords !) and set permissions
@ -525,7 +541,7 @@ class Memory:
debug(_("private values saved"))
def getProfilesList(self):
return self.params.getProfilesList()
return self.storage.getProfilesList()
def getProfileName(self, profile_key):