aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpzread <netfirewall@gmail.com>2013-05-23 23:59:32 +0800
committerpzread <netfirewall@gmail.com>2013-05-23 23:59:32 +0800
commit3653c85804a25de0162064449b4585717af77557 (patch)
tree1f8002436ac8e05c3e249a3fdd16121efd22f172
parent735510bf7e8ea549f420fe5a04931164e0098931 (diff)
downloadtaiwan-online-judge-3653c85804a25de0162064449b4585717af77557.tar
taiwan-online-judge-3653c85804a25de0162064449b4585717af77557.tar.gz
taiwan-online-judge-3653c85804a25de0162064449b4585717af77557.tar.bz2
taiwan-online-judge-3653c85804a25de0162064449b4585717af77557.tar.lz
taiwan-online-judge-3653c85804a25de0162064449b4585717af77557.tar.xz
taiwan-online-judge-3653c85804a25de0162064449b4585717af77557.tar.zst
taiwan-online-judge-3653c85804a25de0162064449b4585717af77557.zip
Fix AsyncDB bug. Done TOJAuth
-rw-r--r--src/py/asyncdb.py28
-rw-r--r--src/py/imc/async.py4
-rw-r--r--src/py/tojauth.py89
3 files changed, 54 insertions, 67 deletions
diff --git a/src/py/asyncdb.py b/src/py/asyncdb.py
index a3ba35a..651dd73 100644
--- a/src/py/asyncdb.py
+++ b/src/py/asyncdb.py
@@ -186,7 +186,7 @@ class AsyncDB:
self._oper_dispatch,
tornado.ioloop.IOLoop.ERROR)
- self._oper_dispatch(conn.fileno(),0)
+ self._ioloop.add_callback(self._oper_dispatch,conn.fileno(),0)
for i in range(2):
conn = self._create_conn()
@@ -196,7 +196,7 @@ class AsyncDB:
self._oper_dispatch,
tornado.ioloop.IOLoop.ERROR)
- self._oper_dispatch(conn.fileno(),0)
+ self._ioloop.add_callback(self._oper_dispatch,conn.fileno(),0)
def cursor(self):
return RestrictCursor(self,self._cursor())
@@ -206,7 +206,7 @@ class AsyncDB:
fd = cur.connection.fileno()
self._pendoper_fdmap[fd].append((self.OPER_EXECUTE,(cur,sql,param),_grid))
- self._oper_dispatch(fd,0)
+ self._ioloop.add_callback(self._oper_dispatch,fd,0)
imc.async.switchtop()
@@ -220,14 +220,14 @@ class AsyncDB:
self._oper_dispatch,
tornado.ioloop.IOLoop.ERROR)
- return self._cursor()
+ return self._cursor(conn)
def end_transaction(self,conn):
if len(self._free_connpool) < 16:
self._free_connpool.append(conn)
else:
- conn.close()
+ self._close_conn(conn)
@imc.async.callee
def _cursor(self,conn = None,_grid = None):
@@ -238,7 +238,7 @@ class AsyncDB:
fd = self._share_connpool[random.randrange(len(self._share_connpool))].fileno()
self._pendoper_fdmap[fd].append((self.OPER_CURSOR,None,_grid))
- self._oper_dispatch(fd,0)
+ self._ioloop.add_callback(self._oper_dispatch,fd,0)
cur = imc.async.switchtop()
return cur
@@ -256,9 +256,23 @@ class AsyncDB:
return conn
+ def _close_conn(self,conn):
+ fd = conn.fileno()
+ self._conn_fdmap.pop(fd,None)
+ self._pendoper_fdmap.pop(fd,None)
+ self._opercallback_fdmap.pop(fd,None)
+
+ conn.close()
+
def _oper_dispatch(self,fd,evt):
err = None
- conn = self._conn_fdmap[fd]
+ try:
+ conn = self._conn_fdmap[fd]
+
+ except KeyError:
+ self._ioloop.remove_handler(fd)
+ return
+
try:
stat = conn.poll()
diff --git a/src/py/imc/async.py b/src/py/imc/async.py
index 59cfc5e..cac8d23 100644
--- a/src/py/imc/async.py
+++ b/src/py/imc/async.py
@@ -1,3 +1,5 @@
+import traceback
+
from greenlet import greenlet
from imc import auth
@@ -56,6 +58,7 @@ def caller(f):
return result
except Exception as err:
+ traceback.print_stack()
print(err)
return (False,'Einternal')
@@ -79,5 +82,6 @@ def retcall(grid,value = None,err = None):
auth.current_iden = old_iden
except Exception as err:
+ traceback.print_stack()
print(err)
pass
diff --git a/src/py/tojauth.py b/src/py/tojauth.py
index 77dd2df..b70ab03 100644
--- a/src/py/tojauth.py
+++ b/src/py/tojauth.py
@@ -10,6 +10,8 @@ class TOJAuth(Auth):
ACCESS_SETPER = 0x10
ACCESS_EXECUTE = 0x20
+ auth_accessid = 1
+
def __init__(self,pubkey,privkey = None):
super().__init__()
@@ -78,11 +80,13 @@ class TOJAuth(Auth):
def create_access(self):
self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
+
cur = self.db.cursor()
sqlstr = ('INSERT INTO "ACCESS" ("owner_idenid") VALUES (%s) '
'RETURNING "accessid";')
sqlarr = (self.current_iden['idenid'], )
cur.execute(sqlstr, sqlarr)
+
for data in cur:
accessid = data[0]
return accessid
@@ -90,47 +94,29 @@ class TOJAuth(Auth):
def set_access_list(self, accessid, roleid, permission):
self.check_access(accessid, self.ACCESS_SETPER)(0)
- def _db_write(accessid, roleid, permission):
- cur = self.db.cursor()
- if not self._does_access_list_exist(cur, accessid, roleid):
- sqlstr = ('INSERT INTO "ACCESS_ROLE" ("accessid", "roleid", '
- '"permission") VALUES (%s, %s, %s);')
- sqlarr = (accessid, roleid, permission)
- else:
- sqlstr = ('UPDATE "ACCESS_ROLE" SET "permission"=%s '
- 'WHERE "accessid"=%s AND "roleid"=%s;')
- sqlarr = (permission, accessid, roleid)
- cur.execute(sqlstr, sqlarr)
-
- _db_write(accessid, roleid, permission)
+ cur = self.db.cursor()
+ table = 'ACCESS_ROLE'
+ cond = {
+ 'accessid' : accessid,
+ 'roleid' : roleid
+ }
+ value = {
+ 'permission' : permission
+ }
+ cur.upsert(table, cond, value)
def del_access_list(self, accessid, roleid):
self.check_access(accessid, self.ACCESS_SETPER)(0)
- def _db_write(accessid, roleid):
- cur = self.db.cursor()
- if self._does_access_list_exist(cur, accessid, roleid):
- sqlstr = ('DELETE FROM "ACCESS_ROLE" WHERE "accessid"=%s '
- 'AND "roleid"=%s;')
- sqlarr = (accessid, roleid)
- cur.execute(sqlstr, sqlarr)
- else:
- raise Exception('TOJAuth.del_access_list() : Access object '
- 'doesn\'t exist')
-
- _db_write(accessid, roleid)
-
- def _does_access_list_exist(self, cur, accessid, roleid):
- sqlstr = ('SELECT COUNT(*) FROM "ACCESS_ROLE" WHERE '
- '"accessid"=%s AND "roleid"=%s;')
+ cur = self.db.cursor()
+ sqlstr = ('DELETE FROM "ACCESS_ROLE" WHERE "accessid"=%s '
+ 'AND "roleid"=%s;')
sqlarr = (accessid, roleid)
- cur.execute(sqlstr, sqlarr)
- for data in cur:
- count = data[0]
- return count>0
+ cur.execute(sqlstr, sqlarr)
def create_role(self, rolename, roletype):
self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
+
cur = self.db.cursor()
sqlstr = ('INSERT INTO "ROLE" ("rolename") VALUES (%s)'
' RETURNING "roleid";')
@@ -143,43 +129,26 @@ class TOJAuth(Auth):
def set_role_relation(self, idenid, roleid):
self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
- def _db_write(idenid, roleid):
- cur = self.db.cursor()
- if not self._does_role_relation_exist(cur, idenid, roleid):
- sqlstr = ('INSERT INTO "IDEN_ROLE" ("idenid", "roleid") '
- 'VALUES (%s, %s);')
- sqlarr = (idenid, roleid)
- cur.execute(sqlstr, sqlarr)
-
- _db_write(idenid, roleid)
+ cur = self.db.cursor()
+ table = 'IDEN_ROLE'
+ cond = {
+ 'idenid' : idenid,
+ 'roleid' : roleid
+ }
+ cur.upsert(table, cond)
def del_role_relation(self, idenid, roleid):
self.check_access(self.auth_accessid, self.ACCESS_EXECUTE)(0)
- def _db_write(idenid, roleid):
- cur = self.db.cursor()
- if self._does_role_relation_exist(cur, idenid, roleid):
- sqlstr = ('DELETE FROM "IDEN_ROLE" WHERE "idenid"=%s '
- 'AND "roleid"=%s;')
- sqlarr = (idenid, roleid)
- cur.execute(sqlstr, sqlarr)
- else:
- raise Exception('TOJAuth.del_role_relation() : Role relation '
- 'doesn\'t exist')
-
- _db_write(idenid, roleid)
-
- def _does_role_relation_exist(self, cur, idenid, roleid):
- sqlstr = ('SELECT COUNT(*) FROM "IDEN_ROLE" WHERE "idenid"=%s '
+ cur = self.db.cursor()
+ sqlstr = ('DELETE FROM "IDEN_ROLE" WHERE "idenid"=%s '
'AND "roleid"=%s;')
sqlarr = (idenid, roleid)
cur.execute(sqlstr, sqlarr)
- for data in cur:
- count = data[0]
- return count>0
def set_owner(self, idenid, accessid):
self.check_access(accessid, self.ACCESS_SETPER)(0)
+
cur = self.db.cursor()
sqlstr = ('UPDATE "ACCESS" SET "owner_idenid"=%s WHERE "accessid"=%s;')
sqlarr = (idenid, accessid)