# -*- coding: utf-8 -*- # # Copyright 2010 Maurizio Porrato # See LICENSE.txt for copyright info from twisted.python import log from twisted.enterprise.adbapi import safe from frn.userstore import FRNUserNotFound from frn.user import FRNUser def _asDict(curs, *args, **kw): log.msg("Running query %s %s" % (str(args), str(kw))) curs.execute(*args, **kw) result = curs.fetchall() columns = [d[0] for d in curs.description] d = [dict(zip(columns, r)) for r in result] log.msg("Query returned: %s" % str(d)) return d def _returnId(curs, *args, **kw): log.msg("Running query %s %s" % (str(args), str(kw))) curs.execute(*args, **kw) rowId = curs.lastrowid log.msg("Query returned: %s" % str(rowId)) return rowId class DatabaseUserStore(object): def __init__(self, pool): self._pool = pool def _query(self, *args, **kw): return self._pool.runInteraction(_asDict, *args, **kw) def getByName(self, name, email): try: return self._query(""" SELECT * FROM frn_users WHERE "on"=? AND "ea"=?""", (name, email)).addCallback( lambda x: FRNUser(**x[0])) except IndexError: raise FRNUserNotFound def getById(self, userId): return self._query(""" SELECT * FROM frn_users WHERE "id"=?""", (int(userId), )).addCallback( lambda x: FRNUser(x[0])) def update(self, userId, **kw): assignments = ','.join(["\"%s\"='%s'" % (k,safe(v)) for k,v in kw.items()]) op = "UPDATE frn_users SET "+assignments+" WHERE \"id\"=?" self._pool.runOperation(op, (int(userId),)) def create(self, user): return self._query( """INSERT INTO frn_users ("on","ea") VALUES (?,?)""", (user.ON, user.EA)).addCallback(lambda x: "%015s" % x) def list(self): return self._query("SELECT * FROM frn_users").addCallback( lambda x: [FRNUser(y) for y in x]) def login(self, user): def gotUser(u): log.msg("Got user %s" % u.ID) if u.PW == user.PW: return u.ID return "WRONG" log.msg("Authenticating %s (%s)" % (user.ON, user.EA)) return self.getByName(user.ON, user.EA).addCallbacks( gotUser, lambda x: "WRONG") def logout(self, userId): pass # vim: set et ai sw=4 ts=4 sts=4: