diff --git a/sqlor/dbpools.py b/sqlor/dbpools.py index 3b804e3..dd1fefa 100644 --- a/sqlor/dbpools.py +++ b/sqlor/dbpools.py @@ -14,6 +14,7 @@ from appPublic.myjson import loadf from appPublic.jsonConfig import getConfig from appPublic.rc4 import unpassword from appPublic.log import exception +from appPublic.event_dispatcher import EventDispatcher import threading from .sor import SQLor @@ -103,10 +104,11 @@ class SqlorPool: @SingletonDecorator -class DBPools: +class DBPools(EventDispatcher): def __init__(self,databases={},max_connect=100,loop=None): if loop is None: loop = get_event_loop() + super().__init__(self) self.loop = loop self.max_connect = max_connect self._pools = {} @@ -139,6 +141,7 @@ class DBPools: sqlor = None async with pool.context() as sqlor: try: + sqlor.dbpools = self await sqlor.enter() yield sqlor if sqlor and sqlor.dataChanged: diff --git a/sqlor/sor.py b/sqlor/sor.py index c677a53..761161a 100644 --- a/sqlor/sor.py +++ b/sqlor/sor.py @@ -72,6 +72,9 @@ def readsql(fn): return b class SQLor(object): + """ + self.dbpools was set by DBPools + """ def __init__(self,dbdesc=None,sqltp = '$[',sqlts = ']$',sqlvp = '${',sqlvs = '}$'): self.conn = None self.cur = None @@ -605,11 +608,14 @@ class SQLor(object): sql = 'insert into %s.%s (%s) values (%s)' % (self.dbname, tablename,fns,vfns) rf = RegisterFunction() rfname = f'{self.dbname}:{tablename}:c:before' + self.dbpools.dispatch(rfname, ns) ret = await rf.exe(rfname, ns) if isinstance(ret, dict): ns.update(ret) r = await self.execute(sql,ns.copy()) - await rf.exe(f'{self.dbname}:{tablename}:c:after', ns) + rfname = f'{self.dbname}:{tablename}:c:after' + self.dbpools.dispatch(rfname, ns) + await rf.exe(rfname, ns) return r async def R(self,tablename,ns,filters=None): @@ -653,11 +659,15 @@ class SQLor(object): sql = 'update %s.%s set %s where %s' % (self.dbname, tablename, u_str,c_str) rf = RegisterFunction() - ret = await rf.exe(f'{self.dbname}:{tablename}:u:before',ns) + rfname = f'{self.dbname}:{tablename}:u:before' + self.dbpools.dispatch(rfname, ns) + ret = await rf.exe(rfname, ns) if isinstance(ret, dict): ns.update(ret) r = await self.execute(sql, ns.copy()) - await rf.exe(f'{self.dbname}:{tablename}:u:after',ns) + rfname = f'{self.dbname}:{tablename}:u:after' + self.dbpools.dispatch(rfname, ns) + await rf.exe(rfname, ns) return r async def D(self,tablename, ns): @@ -668,11 +678,14 @@ class SQLor(object): c_str = ' and '.join(c) sql = 'delete from %s.%s where %s' % (self.dbname, tablename,c_str) rf = RegisterFunction() - ret = await rf.exe(f'{self.dbname}:{tablename}:d:before', ns) + rfname = f'{self.dbname}:{tablename}:d:before' + ret = await rf.exe(rfname, ns) if isinstance(ret, dict): ns.update(ret) r = await self.execute(sql, ns) - ns = await rf.exe(f'{self.dbname}:{tablename}:d:after', ns) + rfname = f'{self.dbname}:{tablename}:d:after' + self.dbpools.dispatch(rfname, ns) + ns = await rf.exe(rfname, ns) return r async def connect(self):