1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import re
16 import pgsql
17
18 from base_drv import BaseDatabase, BaseCursor, BaseBinary
19 from base_drv import BaseKeywordDict
20 import sqlerrors
21 import sqllib
22
24 keys = BaseKeywordDict.keys.copy()
25 keys.update( {
26 'PRIMARYKEY' : 'SERIAL PRIMARY KEY',
27 'BLOB' : 'BYTEA',
28 'MEDIUMBLOB' : 'BYTEA',
29 'PATHTYPE' : 'BYTEA',
30 'STRING' : 'VARCHAR'
31 } )
32
35
36
38 __binary__ = True
42 return "decode('%s','hex')" % "".join("%02x" % ord(c) for c in self.s)
43
44
46 keys = []
47 def __match(m):
48 d = m.groupdict()
49 kw = d["kw"][1:]
50 if len(kw):
51 if kw not in keys:
52 keys.append(kw)
53 d["kwIdx"] = keys.index(kw)+1
54 else:
55 keys.append(None)
56 d["kwIdx"] = len(keys)
57 return "%(pre)s%(s)s$%(kwIdx)d" % d
58
59 sql = re.sub("(?i)(?P<pre>[(,<>=]|(LIKE|AND|BETWEEN|LIMIT|OFFSET)\s)(?P<s>\s*)(?P<kw>:\w+|[?])",
60 __match, sql)
61
62 if len(keys) and keys[0] is not None:
63 return (sql, keys)
64 return (sql, [])
65
67 binaryClass = Binary
68 driver = "postgresql"
69
70
71
72
73
74
75
76
77
91
92
93 - def execute(self, sql, *args, **kw):
94 self._executeCheck(sql)
95 keys = []
96
97 kw.pop("start_transaction", True)
98 args, kw = self._executeArgs(args, kw)
99
100
101 if len(args) or len(kw):
102 sql, keys = _mungeSQL(sql)
103
104
105 if len(args):
106 if len(kw) or len(keys):
107 raise sqlerrors.CursorError(
108 "Do not pass both positional and named bind arguments",
109 *args, **kw)
110 ret = self._tryExecute(self._cursor.execute, sql, args)
111 elif len(keys):
112 if False in [kw.has_key(x) for x in keys]:
113 raise CursorError(
114 "Query keys not defined in named argument dict",
115 sorted(keys), sorted(kw.keys()))
116
117 ret = self._tryExecute(self._cursor.execute, sql,
118 [kw[x] for x in keys])
119 else:
120 ret = self._tryExecute(self._cursor.execute, sql)
121 if ret == self._cursor:
122 return self
123 return ret
124
125
135
136
144 assert(isinstance(stmt, pgsql.PreparedCursor))
145 if not len(args):
146 ret = self._tryExecute(stmt._source.execute)
147 elif isinstance(args[0], (tuple, list)):
148 ret = self._tryExecute(stmt._source.execute, *args)
149 else:
150 ret = self._tryExecute(stmt._source.execute, args)
151 if isinstance(ret, int):
152 return ret
153 return stmt
154
155
157 return self._cursor.fields
158
159
167
168
173
174
175
177 ret = self.execute("select lastval()").fetchone()
178 if ret is None:
179 return 0
180 return ret[0]
181
182
185 assert(self.dbh)
186 return self.dbh.itercursor()
187