diff options
author | pzread <netfirewall@gmail.com> | 2013-05-23 23:59:32 +0800 |
---|---|---|
committer | pzread <netfirewall@gmail.com> | 2013-05-23 23:59:32 +0800 |
commit | 3653c85804a25de0162064449b4585717af77557 (patch) | |
tree | 1f8002436ac8e05c3e249a3fdd16121efd22f172 | |
parent | 735510bf7e8ea549f420fe5a04931164e0098931 (diff) | |
download | taiwan-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.py | 28 | ||||
-rw-r--r-- | src/py/imc/async.py | 4 | ||||
-rw-r--r-- | src/py/tojauth.py | 89 |
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) |