first import
first import between version 0.1.3 and 0.2 darcs-hash:20051127110300-684f5-0ed50cd0e86df9195cec2c1df070fdf24a6faeb5.gz
This commit is contained in:
180
jabber/storage.py
Normal file
180
jabber/storage.py
Normal file
@@ -0,0 +1,180 @@
|
||||
##
|
||||
## storage.py
|
||||
## Login : <dax@happycoders.org>
|
||||
## Started on Wed Jul 20 20:26:53 2005 dax
|
||||
## $Id: storage.py,v 1.1 2005/09/18 20:24:07 dax Exp $
|
||||
##
|
||||
## Copyright (C) 2005 dax
|
||||
## This program is free software; you can redistribute it and/or modify
|
||||
## it under the terms of the GNU General Public License as published by
|
||||
## the Free Software Foundation; either version 2 of the License, or
|
||||
## (at your option) any later version.
|
||||
##
|
||||
## This program is distributed in the hope that it will be useful,
|
||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
## GNU General Public License for more details.
|
||||
##
|
||||
## You should have received a copy of the GNU General Public License
|
||||
## along with this program; if not, write to the Free Software
|
||||
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
##
|
||||
|
||||
import os
|
||||
import re
|
||||
import os.path
|
||||
import sys
|
||||
import anydbm
|
||||
import mailconnection_factory
|
||||
from UserDict import UserDict
|
||||
|
||||
class Storage(UserDict):
|
||||
def __init__(self, nb_pk_fields = 1, spool_dir = "."):
|
||||
UserDict.__init__(self)
|
||||
self._spool_dir = ""
|
||||
self.set_spool_dir(spool_dir)
|
||||
self.nb_pk_fields = nb_pk_fields
|
||||
self.file = self._spool_dir + "/registered.db"
|
||||
|
||||
# return hash of hash (jid and name)
|
||||
def load(self):
|
||||
pass
|
||||
|
||||
def sync(self):
|
||||
pass
|
||||
|
||||
def store(self, nb_pk_fields, registered, pk):
|
||||
pass
|
||||
|
||||
def add(self, key_list, obj):
|
||||
pass
|
||||
|
||||
def remove(self, key_list):
|
||||
pass
|
||||
|
||||
def get_spool_dir(self):
|
||||
return self._spool_dir
|
||||
|
||||
def set_spool_dir(self, spool_dir):
|
||||
self._spool_dir = spool_dir
|
||||
if not os.path.isdir(self._spool_dir):
|
||||
os.makedirs(self._spool_dir)
|
||||
|
||||
spool_dir = property(get_spool_dir, set_spool_dir)
|
||||
|
||||
class DBMStorage(Storage):
|
||||
def __init__(self, nb_pk_fields = 1, spool_dir = "."):
|
||||
# print "DBM INIT"
|
||||
Storage.__init__(self, nb_pk_fields, spool_dir)
|
||||
self.__str_registered = anydbm.open(self.file, \
|
||||
'c')
|
||||
|
||||
def __del__(self):
|
||||
# print "DBM STOP"
|
||||
self.__str_registered.close()
|
||||
|
||||
def load(self):
|
||||
# print "DBM LOAD"
|
||||
result = {}
|
||||
try:
|
||||
for pk in self.__str_registered.keys():
|
||||
pk_list = pk.split('#')
|
||||
obj = result
|
||||
key = None
|
||||
while pk_list:
|
||||
key = pk_list.pop(0)
|
||||
if pk_list:
|
||||
if not obj.has_key(key):
|
||||
obj[key] = {}
|
||||
obj = obj[key]
|
||||
obj[key] = mailconnection_factory.str_to_mail_connection(self.__str_registered[pk])
|
||||
except Exception, e:
|
||||
print >>sys.stderr, "Cannot load registered.db : "
|
||||
print >>sys.stderr, e
|
||||
return result
|
||||
|
||||
def sync(self):
|
||||
# print "DBM SYNC"
|
||||
self.__str_registered.close()
|
||||
self.__str_registered = anydbm.open(self.file, \
|
||||
'c')
|
||||
|
||||
def __store(self, nb_pk_fields, registered, pk):
|
||||
if nb_pk_fields > 0:
|
||||
for key in registered.keys():
|
||||
if pk:
|
||||
self.__store(nb_pk_fields - 1, \
|
||||
registered[key], pk + "#" + key)
|
||||
else:
|
||||
self.__store(nb_pk_fields - 1, \
|
||||
registered[key], key)
|
||||
else:
|
||||
self.__str_registered[pk] = str(registered)
|
||||
print "STORING : " + pk + " = " + str(registered)
|
||||
|
||||
def store(self, registered):
|
||||
# print "DBM STORE"
|
||||
try:
|
||||
self.__store(self.nb_pk_fields, registered, "")
|
||||
# Force file synchronisation
|
||||
self.sync()
|
||||
except Exception, e:
|
||||
print >>sys.stderr, "Cannot save to registered.db : "
|
||||
print >>sys.stderr, e
|
||||
|
||||
def __setitem__(self, pk_tuple, obj):
|
||||
print "Adding " + "#".join(pk_tuple) + " = " + str(obj)
|
||||
self.__str_registered["#".join(pk_tuple)] = str(obj)
|
||||
self.sync()
|
||||
|
||||
def __getitem__(self, pk_tuple):
|
||||
print "Getting " + "#".join(pk_tuple)
|
||||
if len(pk_tuple) == self.nb_pk_fields:
|
||||
return mailconnection_factory.str_to_mail_connection(self.__str_registered["#".join(pk_tuple)])
|
||||
else:
|
||||
partial_key = "#".join(pk_tuple)
|
||||
regexp = re.compile(partial_key)
|
||||
return [mailconnection_factory.str_to_mail_connection(self.__str_registered[key])
|
||||
for key in self.__str_registered.keys()
|
||||
if regexp.search(key)]
|
||||
|
||||
def __delitem__(self, pk_tuple):
|
||||
print "Deleting " + "#".join(pk_tuple)
|
||||
del self.__str_registered["#".join(pk_tuple)]
|
||||
self.sync()
|
||||
|
||||
def has_key(self, pk_tuple):
|
||||
return self.__str_registered.has_key("#".join(pk_tuple))
|
||||
|
||||
def keys(self, pk_tuple = None):
|
||||
if pk_tuple is None:
|
||||
return [tuple(key.split("#")) for key in self.__str_registered.keys()]
|
||||
else:
|
||||
level = len(pk_tuple)
|
||||
partial_key = "#".join(pk_tuple)
|
||||
regexp = re.compile("^" + partial_key)
|
||||
result = {}
|
||||
for key in self.__str_registered.keys():
|
||||
if regexp.search(key):
|
||||
result[key.split("#")[level]] = None
|
||||
return result.keys()
|
||||
|
||||
class SQLiteStorage(Storage):
|
||||
def __init__(self, nb_pk_fields = 1, spool_dir = "."):
|
||||
pass
|
||||
|
||||
def load(self):
|
||||
pass
|
||||
|
||||
def sync(self):
|
||||
pass
|
||||
|
||||
def store(self, nb_pk_fields, registered, pk):
|
||||
pass
|
||||
|
||||
def add(self, key_list, obj):
|
||||
pass
|
||||
|
||||
def remove(self, key_list):
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user