#!/usr/bin/python
import os,sys,string
unimplementedError = 'Dbmail unimplemented'
configError = 'Dbmail configuration error'
from dbmail.lib.DbmailConfig import DbmailConfig
class Dbmail(DbmailConfig):
_stanza_='DBMAIL'
def __init__(self,file=None):
DbmailConfig.__init__(self,file)
self.setCursor()
def getConfig(self,key=None):
return self._getConfig(self._stanza_,key)
def setCursor(self):
storage=string.lower(self.getConfig(key='DRIVER'))
if storage=='mysql':
self._setMysqlDictCursor()
elif storage=='pgsql':
self._setPgsqlDictCursor()
elif storage=='sqlite':
self._setSqliteDictCursor()
else:
raise configError, 'invalid value for config-item: DRIVER'
def _setMysqlDictCursor(self):
import MySQLdb
conn=MySQLdb.connect(host=self.getConfig('host'),user=self.getConfig('user'),
db=self.getConfig('db'),passwd=self.getConfig('pass'))
conn.autocommit(1)
self._cursor=conn.cursor(MySQLdb.cursors.DictCursor)
assert(self._cursor)
def _setPgsqlDictCursor(self):
use=None
try:
from pyPgSQL import PgSQL
use='pgsql'
except:
pass
try:
import psycopg2
import psycopg2.extras
use='psycopg2'
except:
pass
if use=='pgsql':
conn = PgSQL.connect(database=self.getConfig('db'),host=self.getConfig('host'),
user=self.getConfig('user'),password=self.getConfig('pass'))
conn.autocommit=1
self._conn = conn
self._cursor = conn.cursor()
elif use=='psycopg2':
conn = psycopg2.connect("host=%s dbname=%s user=%s password=%s" % (\
self.getConfig('host'), self.getConfig('user'), \
self.getConfig('db'), self.getConfig('pass')))
conn.set_isolation_level(0)
self._conn = conn
self._cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
else:
raise novalidDriver, "no postgres driver available (PgSQL or psycopg2)"
assert(self._cursor)
def _setSqliteDictCursor(self):
raise unimplementedError, "sqlite dict-cursor"
def getCursor(self): return self._cursor
class DbmailSmtp(Dbmail):
_stanza_='SMTP'
class DbmailAlias(Dbmail):
def get(self,alias,deliver_to=None):
c=self.getCursor()
filter=''
q="select * from %saliases where alias=%%s" % self._prefix
if deliver_to:
q="%s AND deliver_to=%%s" % q
c.execute(q,(alias, deliver_to,))
else:
c.execute(q,(alias,))
return c.fetchall()
def set(self,alias,deliver_to):
c=self.getCursor()
q="""INSERT INTO %saliases (alias,deliver_to) VALUES (%%s,%%s)""" % self._prefix
if not self.get(alias,deliver_to):
assert(alias and deliver_to)
c.execute(q, (alias,deliver_to,))
def delete(self,alias,deliver_to):
c=self.getCursor()
q="""DELETE FROM %saliases WHERE alias=%%s AND deliver_to=%%s""" % self._prefix
if self.get(alias,deliver_to):
c.execute(q, (alias,deliver_to,))
class DbmailUser(Dbmail):
_dirty=1
def __init__(self,userid):
Dbmail.__init__(self)
self.setUserid(userid)
self._userdict={}
def create(self): pass
def update(self): pass
def delete(self): pass
def setDirty(self,dirty=1): self._dirty=dirty
def getDirty(self): return self._dirty
def setUserid(self,userid): self._userid=userid
def getUserid(self): return self._userid
def getUserdict(self):
if not self.getDirty() and self._userdict:
return self._userdict
q="select * from %susers where userid=%%s" % self._prefix
c=self.getCursor()
c.execute(q,(self.getUserid(),))
dict = c.fetchone()
assert(dict)
self._userdict = dict
self.setDirty(0)
return self._userdict
def getUidNumber(self): return self.getUserdict()['user_idnr']
def getGidNumber(self): return self.getUserdict()['client_idnr']
syntax highlighted by Code2HTML, v. 0.9.1