Do you mean the python-mysqldb package? I don't see a mysql-python package for Ubuntu.
----- Original Message ----- From: "Daniel Heule" <[email protected]> To: <[email protected]> Sent: Friday, January 09, 2009 8:23 AM Subject: Re: [courier-users] pythonfilter and sql >I have programmed a implementation for mysql for the ttldb's. > > you need the mysql-python package and the file TtlDb.py replaced in the > filters dir of courier-pythonfilter 1.5 > > It's not long tested (one week since programmed). > > To Gordon: > Please can you pick up this code to the courier-pyhtonfilter package? > > Greats Daniel > > Ricardo Kleemann schrieb: >> Hi, >> >> Does anyone know if there's a plan to get mysql support into >> pythonfilter? As I understand it, only postgresql is supported at the >> moment. >> >> Thanks >> Ricardo >> ------------------------------------------------------------------------ >> >> ------------------------------------------------------------------------------ >> Check out the new SourceForge.net Marketplace. >> It is the best place to buy or sell services for >> just about anything Open Source. >> http://p.sf.net/sfu/Xq1LFB >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> courier-users mailing list >> [email protected] >> Unsubscribe: https://lists.sourceforge.net/lists/listinfo/courier-users >> > > -------------------------------------------------------------------------------- > #!/usr/bin/python > # TtlDb -- Helper function for handling DBs of TTL tokens > # Copyright (C) 2006-2008 Gordon Messmer <[email protected]> > # > # This file is part of pythonfilter. > # > # pythonfilter 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 3 of the License, or > # (at your option) any later version. > # > # pythonfilter 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 pythonfilter. If not, see <http://www.gnu.org/licenses/>. > > import sys > import thread > import time > import courier.config > > > class TtlDbError(Exception): > """Base class for exceptions in this module.""" > pass > > > class LockError(TtlDbError): > """Exception raised by detectable locking errors. > > Attributes: > message -- explanation of the error > """ > pass > > > class OpenError(TtlDbError): > """Exception raised if there are problems creating the TtlDb instance. > > Attributes: > message -- explanation of the error > """ > pass > > > class TtlDbSQL: > """Wrapper for SQL db containing tokens with a TTL.""" > > dbapi_name = None > create_statement = 'CREATE TABLE %s (id CHAR(64) NOT NULL, value BIGINT > NOT NULL, PRIMARY KEY(id))' > purge_statement = 'DELETE FROM %s WHERE value < $1' > select_statement = 'SELECT value FROM %s WHERE id = $1' > insert_statement = 'INSERT INTO %s VALUES ($1, $2)' > update_statement = 'UPDATE %s SET value=$2 WHERE id=$1' > delete_statement = 'DELETE FROM %s WHERE id = $1' > > def __init__(self, name, TTL, PurgeInterval): > self.dbLock = thread.allocate_lock() > > if self.dbapi_name is None: > raise OpenError('Do not use TtlDbSQL directly. Subclass and > define "dbapi".') > self.dbapi = __import__(self.dbapi_name) > self.tablename = name > self._connect() > # The db will be scrubbed at the interval indicated in seconds. > # All records older than the "TTL" number of seconds will be > # removed from the db. > self.TTL = TTL > self.PurgeInterval = PurgeInterval > # A value of 0 will cause the db to purge the first time the > # purge() function is called. After the first time, the db > # will not be purged until the PurgeInterval has passed. > self.LastPurged = 0 > > def _connect(self): > dbConfig = courier.config.getModuleConfig('TtlDb') > try: > self.db = self.dbapi.connect(user=dbConfig['user'], > password=dbConfig['password'], > host=dbConfig['host'], > port=int(dbConfig['port']), > database=dbConfig['db']) > except: > raise OpenError('Failed to open %s SQL db, check settings in > pythonfilter-modules.conf' % (dbConfig['db'])) > try: > try: > c = self.db.cursor() > c.execute(self.create_statement % self.tablename) > self.db.commit() > except: > self.db.rollback() > finally: > c.close() > > def _dbExec(self, query, params=None, reconnect=True): > exec_params = None > if params: > if self.dbapi.paramstyle == 'numeric': > exec_params = [x[1] for x in params] > elif(self.dbapi.paramstyle == 'pyformat' > or self.dbapi.paramstyle == 'named'): > exec_params = dict(params) > try: > c = self.db.cursor() > c.execute(query, exec_params) > except self.dbapi.OperationalError: > c.close() > if reconnect: > self._connect() > c = self._dbExec(query, params, reconnect=False) > else: > raise > return c > > def _dbRead(self, query, params=None): > c = self._dbExec(query, params) > r = c.fetchone() > c.close() > if r: > return str(r[0]) > else: > return None > > def _dbWrite(self, query, params=None): > try: > c = self._dbExec(query, params) > except: > self.db.rollback() > raise > self.db.commit() > c.close() > > def lock(self): > self.dbLock.acquire() > > def unlock(self): > """Unlock the database""" > self.dbLock.release() > > def purge(self): > """Remove all keys who have outlived their TTL. > > Don't call this function inside a locked section of code. > """ > self.lock() > try: > if time.time() > (self.LastPurged + self.PurgeInterval): > # Any token whose value is less than "minVal" is no longer > valid. > minVal = int(time.time() - self.TTL) > self._dbWrite(self.purge_statement % self.tablename, > (('value', minVal),)) > self.LastPurged = time.time() > finally: > self.unlock() > > def has_key(self, key): > value = self._dbRead(self.select_statement % self.tablename, > (('id', key),)) > return bool(value) > > def __getitem__(self, key): > value = self._dbRead(self.select_statement % self.tablename, > (('id', key),)) > return value > > def __setitem__(self, key, value): > try: > self._dbWrite(self.insert_statement % self.tablename, > (('id', key), ('value', int(value)))) > except (self.dbapi.ProgrammingError, self.dbapi.IntegrityError): > self._dbWrite(self.update_statement % self.tablename, > (('id', key), ('value', int(value)))) > > def __delitem__(self, key): > self._dbWrite(self.delete_statement % self.tablename, > (('id', key),)) > > > class TtlDbPg(TtlDbSQL): > """Wrapper for SQL db containing tokens with a TTL.""" > > dbapi_name = 'pgsql' > > class TtlDbMySQL(TtlDbSQL): > """Wrapper for SQL db containing tokens with a TTL.""" > > dbapi_name = 'MySQLdb' > create_statement = 'CREATE TABLE %s (id VARCHAR(254) NOT NULL, value > BIGINT NOT NULL, PRIMARY KEY(id))' > purge_statement = 'DELETE FROM %s WHERE value < %%(value)s' > select_statement = 'SELECT value FROM %s WHERE id = %%(id)s' > insert_statement = 'INSERT INTO %s VALUES (%%(id)s, %%(value)s)' > update_statement = 'UPDATE %s SET value=%%(value)s WHERE id=%%(id)s' > delete_statement = 'DELETE FROM %s WHERE id = %%(id)s' > > > def _connect(self): > dbConfig = courier.config.getModuleConfig('TtlDb') > try: > self.dbapi.paramstyle = 'pyformat' > self.db = self.dbapi.connect(user=dbConfig['user'], > passwd=dbConfig['password'], > host=dbConfig['host'], > port=int(dbConfig['port']), > db=dbConfig['db']) > except: > raise OpenError('Failed to open %s SQL db, check settings in > pythonfilter-modules.conf' % (dbConfig['db'])) > try: > try: > c = self.db.cursor() > c.execute(self.create_statement % self.tablename) > self.db.commit() > except: > self.db.rollback() > finally: > c.close() > > class TtlDbPsycopg2(TtlDbSQL): > """Wrapper for SQL db containing tokens with a TTL.""" > > dbapi_name = 'psycopg2' > purge_statement = 'DELETE FROM %s WHERE value < %%(value)s' > select_statement = 'SELECT value FROM %s WHERE id = %%(id)s' > insert_statement = 'INSERT INTO %s VALUES (%%(id)s, %%(value)s)' > update_statement = 'UPDATE %s SET value=%%(value)s WHERE id=%%(id)s' > delete_statement = 'DELETE FROM %s WHERE id = %%(id)s' > > > class TtlDbDbm: > """Wrapper for dbm containing tokens with a TTL.""" > def __init__(self, name, TTL, PurgeInterval): > self.dbLock = thread.allocate_lock() > > import anydbm > dmbConfig = courier.config.getModuleConfig('TtlDb') > dbmDir = dmbConfig['dir'] > try: > self.db = anydbm.open(dbmDir + '/' + name, 'c') > except: > raise OpenError('Failed to open %s db in %s, make sure that the > directory exists\n' % (name, dbmDir)) > # The db will be scrubbed at the interval indicated in seconds. > # All records older than the "TTL" number of seconds will be > # removed from the db. > self.TTL = TTL > self.PurgeInterval = PurgeInterval > # A value of 0 will cause the db to purge the first time the > # purge() function is called. After the first time, the db > # will not be purged until the PurgeInterval has passed. > self.LastPurged = 0 > > def lock(self): > self.dbLock.acquire() > > def unlock(self): > """Unlock the database""" > try: > # Synchronize the database to disk if the db type supports that > try: > self.db.sync() > except AttributeError: > # this dbm library doesn't support the sync() method > pass > finally: > self.dbLock.release() > > def purge(self): > """Remove all keys who have outlived their TTL. > > Don't call this function inside a locked section of code. > """ > self.lock() > try: > if time.time() > (self.LastPurged + self.PurgeInterval): > # Any token whose value is less than "minVal" is no longer > valid. > minVal = time.time() - self.TTL > for key in self.db.keys(): > if float(self.db[key]) < minVal: > del self.db[key] > self.LastPurged = time.time() > finally: > self.unlock() > > def has_key(self, key): > return self.db.has_key(key) > > def __getitem__(self, key): > return self.db[key] > > def __setitem__(self, key, value): > self.db[key] = str(int(value)) > > def __delitem__(self, key): > del(self.db[key]) > > > _dbmClasses = {'dbm': TtlDbDbm, > 'psycopg2': TtlDbPsycopg2, > 'mysql': TtlDbMySQL, > 'pg': TtlDbPg} > > > def TtlDb(name, TTL, PurgeInterval): > """Wrapper for db containing tokens with a TTL. > > This is used when a db is required which simply tracks whether or not > a token exists, and when it was last used. Token values should be the > value of time.time() when the token was last used. The tokens will > be removed from the db if their value indicates that they haven't been > used within the TTL period. > > A TtlDb.OpenError exception will be raised if the db can't be opened. > """ > dbConfig = courier.config.getModuleConfig('TtlDb') > type = dbConfig['type'] > return _dbmClasses[type](name, TTL, PurgeInterval) > > -------------------------------------------------------------------------------- > ------------------------------------------------------------------------------ > Check out the new SourceForge.net Marketplace. > It is the best place to buy or sell services for > just about anything Open Source. > http://p.sf.net/sfu/Xq1LFB -------------------------------------------------------------------------------- > _______________________________________________ > courier-users mailing list > [email protected] > Unsubscribe: https://lists.sourceforge.net/lists/listinfo/courier-users > ------------------------------------------------------------------------------ Check out the new SourceForge.net Marketplace. It is the best place to buy or sell services for just about anything Open Source. http://p.sf.net/sfu/Xq1LFB _______________________________________________ courier-users mailing list [email protected] Unsubscribe: https://lists.sourceforge.net/lists/listinfo/courier-users
