85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright 2010 Maurizio Porrato <maurizio.porrato@gmail.com>
|
|
# 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:
|