Code

Ticket #1237: __init__.py.diff

File __init__.py.diff, 3.4 KB (added by junzhang.jn@…, 8 years ago)
Line 
1Index: __init__.py
2===================================================================
3--- __init__.py ( rev 2025 )
4+++ __init__.py ( work copy )
5@@ -24,7 +24,7 @@
6         (exc, DATABASE_ENGINE, ", ".join(map(repr, available_backends)))
7 
8 DatabaseError = dbmod.DatabaseError
9-db = dbmod.DatabaseWrapper()
10+#db = dbmod.DatabaseWrapper()
11 dictfetchone = dbmod.dictfetchone
12 dictfetchmany = dbmod.dictfetchmany
13 dictfetchall = dbmod.dictfetchall
14@@ -40,3 +40,118 @@
15 OPERATOR_MAPPING = dbmod.OPERATOR_MAPPING
16 DATA_TYPES = dbmod.DATA_TYPES
17 DATA_TYPES_REVERSE = dbmod.DATA_TYPES_REVERSE
18+
19+
20+get_check_sql = dbmod.get_check_sql
21+
22+#import logging
23+#logger = logging.getLogger( 'back' )
24+
25+class ConnectObjectFactory:
26+    def __init__( self ):
27+        pass
28+       
29+    def create_object( self ):
30+        return dbmod.DatabaseWrapper()
31+   
32+    def destroy_object( self , obj ):
33+        obj.close()
34+        del obj
35+   
36+    def validate_object( self , obj ):
37+        cu = obj.cursor()
38+        try:
39+            cu.execute( get_check_sql() )
40+            return True
41+        except:
42+            return False
43+
44+import threading
45+import thread
46+
47+def atomcall( func ):
48+    def call( *arg , **kwarg ):
49+        try:
50+            atomcall.lock.acquire()
51+            return func( *arg , **kwarg )
52+        finally:
53+            atomcall.lock.release()
54+    return call
55+   
56+atomcall.lock = threading.Lock()
57+
58+class AutoReleaseCursor:
59+    def __init__( self , dbwrap , host ):
60+        self.dbwrap = dbwrap
61+        self.host   = host
62+   
63+    def __getattr__( self , key ):
64+        if hasattr( self.host , key ):
65+            return getattr( self.host , key )
66+        else:
67+            return getattr( self , key )
68+   
69+    def __del__( self ):
70+        #logger.info( 'cursor close %s' , self.dbwrap )
71+        self.host.close()
72+        self.dbwrap.close()
73+   
74+import pool
75+class DatabaseWrapper:
76+    def __init__(self):
77+        self.connections = {}
78+        self.pool = pool.DBPoolWithThread( ConnectObjectFactory() , freetime = 60 * 5 , threadsafety = dbmod.Database.threadsafety )
79+        self.queries = []
80+
81+    def cursor(self):
82+        con = self.getcon()
83+        if con is None:
84+            con = self.pool.borrow_object()
85+            self.setcon( con )
86+        if con:
87+            return AutoReleaseCursor( self , con.cursor() )
88+
89+    def commit(self):
90+        con = self.getcon()
91+        if con:
92+            return con.commit()
93+
94+    def rollback(self):
95+        con = self.getcon()
96+        if con:
97+            return con.rollback()
98+
99+    def close(self):
100+        con = self.getcon()
101+        if con is not None:
102+            self.pool.return_object( con )
103+            self.delcon()
104+   
105+    def quote_name(self, name):
106+        con = self.getcon()
107+        if con is None:
108+            try:
109+                con = self.pool.borrow_object()
110+                ret = con.quote_name(name)
111+            finally:
112+                self.pool.return_object( con )
113+        else:
114+            ret = con.quote_name(name)
115+        return ret
116+
117+    @atomcall
118+    def getcon( self ):
119+        threadid = thread.get_ident()
120+        return self.connections.get( threadid , None )
121+       
122+    @atomcall
123+    def delcon( self ):
124+        threadid = thread.get_ident()
125+        del self.connections[ threadid ]
126+       
127+    @atomcall
128+    def setcon( self , con ):
129+        threadid = thread.get_ident()
130+        self.connections[threadid] = con
131+
132+db = DatabaseWrapper()