Mercurial > hg > ZDBInterface
comparison DBInterface.py @ 19:132ae1c0255a
V1.7: new connection caching. some cleanup.
author | casties |
---|---|
date | Fri, 11 Jan 2013 17:58:56 +0100 |
parents | 60fea3a6c695 |
children | 5f3d6623b71e |
comparison
equal
deleted
inserted
replaced
18:60fea3a6c695 | 19:132ae1c0255a |
---|---|
12 psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) | 12 psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) |
13 psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY) | 13 psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY) |
14 | 14 |
15 from Products.ZSQLMethods.SQL import SQLConnectionIDs | 15 from Products.ZSQLMethods.SQL import SQLConnectionIDs |
16 from Shared.DC.ZRDB.Results import Results | 16 from Shared.DC.ZRDB.Results import Results |
17 | |
18 | |
19 def unicodify(s,alternate='latin-1'): | |
20 """decode str (utf-8 or latin-1 representation) into unicode object""" | |
21 if not s: | |
22 return u"" | |
23 if isinstance(s, str): | |
24 try: | |
25 return s.decode('utf-8') | |
26 except: | |
27 return s.decode(alternate) | |
28 else: | |
29 return s | |
30 | |
31 def utf8ify(s): | |
32 """encode unicode object or string into byte string in utf-8 representation. | |
33 assumes string objects to be utf-8""" | |
34 if not s: | |
35 return "" | |
36 if isinstance(s, str): | |
37 return s | |
38 else: | |
39 return s.encode('utf-8') | |
40 | |
41 def getTextFromNode(node): | |
42 """get the cdata content of a XML node""" | |
43 if node is None: | |
44 return "" | |
45 | |
46 if isinstance(node, list): | |
47 nodelist = node | |
48 else: | |
49 nodelist=node.childNodes | |
50 | |
51 rc = "" | |
52 for node in nodelist: | |
53 if node.nodeType == node.TEXT_NODE: | |
54 rc = rc + node.data | |
55 return rc | |
56 | 17 |
57 def sqlName(s, lc=True, more=''): | 18 def sqlName(s, lc=True, more=''): |
58 """returns restricted ASCII-only version of string""" | 19 """returns restricted ASCII-only version of string""" |
59 if s is None: | 20 if s is None: |
60 return "" | 21 return "" |
82 """return list of available connection ids""" | 43 """return list of available connection ids""" |
83 return SQLConnectionIDs(self) | 44 return SQLConnectionIDs(self) |
84 | 45 |
85 def getDB(self): | 46 def getDB(self): |
86 """returns DB object""" | 47 """returns DB object""" |
87 # TODO: can we cache and reuse a DB object? | 48 db = None |
49 | |
50 # connection caching according to http://pypi.python.org/pypi/alm.solrindex | |
51 jar = self._p_jar | |
52 oid = self._p_oid | |
53 fc = None | |
54 if jar is not None and oid is not None: | |
55 fc = getattr(jar, 'foreign_connections', None) | |
56 if fc is None: | |
57 jar.foreign_connections = fc = {} | |
58 | |
59 db = fc.get(oid, None) | |
60 if db is not None: | |
61 logging.debug("getDb: using cached db=%s"%repr(db)) | |
62 return db | |
63 | |
88 if self.connection_id is None: | 64 if self.connection_id is None: |
89 # try to take the first existing ID | 65 # try to take the first existing ID |
90 connids = self.getConnectionIDs() | 66 connids = self.getConnectionIDs() |
91 if len(connids) > 0: | 67 if len(connids) > 0: |
92 connection_id = connids[0][1] | 68 connection_id = connids[0][1] |
93 self.connection_id = connection_id | 69 self.connection_id = connection_id |
94 logging.debug("connection_id: %s"%repr(connection_id)) | 70 logging.debug("connection_id: %s"%repr(connection_id)) |
95 | 71 |
96 # get Connection instance | 72 # get Connection/DA instance |
97 con = getattr(self, self.connection_id) | 73 con = getattr(self, self.connection_id) |
98 # call to get db object | 74 # call to get db object |
99 db = con() | 75 db = con() |
100 if self.autocommit: | 76 if self.autocommit: |
101 # force our transaction isolation level | 77 # force our transaction isolation level |
102 db.tilevel = psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT | 78 db.tilevel = psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT |
79 | |
80 if fc is not None and oid is not None: | |
81 # cache db | |
82 fc[oid] = db | |
103 | 83 |
104 return db | 84 return db |
105 | 85 |
106 def executeZSQL(self, query, args=None, max_rows=None): | 86 def executeZSQL(self, query, args=None, max_rows=None): |
107 """execute query with args on the database and return all results as Result object.""" | 87 """execute query with args on the database and return all results as Result object.""" |