Revision 1891
Added by Aaron Marcuse-Kubitza over 12 years ago
sql.py | ||
---|---|---|
115 | 115 |
|
116 | 116 |
return self.__db |
117 | 117 |
|
118 |
class Cursor(Proxy): |
|
119 |
def __init__(self, inner): |
|
120 |
Proxy.__init__(self, inner) |
|
121 |
self.result = None |
|
118 |
class DbCursor(Proxy): |
|
119 |
def __init__(self, outer): |
|
120 |
Proxy.__init__(self, outer.db.cursor()) |
|
121 |
self.outer = outer |
|
122 |
self.result = [] |
|
122 | 123 |
|
123 |
def rows(cur): return iter(lambda: cur.fetchone(), None) |
|
124 |
def fetchone(self): |
|
125 |
row = self.inner.fetchone() |
|
126 |
if row == None: # fetched all rows |
|
127 |
self.outer.query_results[self.inner.query] = self.result |
|
128 |
else: self.result.append(row) |
|
129 |
return row |
|
124 | 130 |
|
131 |
class CacheCursor: |
|
132 |
def __init__(self, result): self.iter = iter(result) |
|
133 |
|
|
134 |
def fetchone(self): |
|
135 |
try: return self.iter.next() |
|
136 |
except StopIteration: return None |
|
137 |
|
|
125 | 138 |
def run_query(self, query, params=None): |
126 |
cur = self.db.cursor() |
|
127 |
try: cur.execute(query, params) |
|
128 |
except Exception, e: |
|
129 |
_add_cursor_info(e, cur) |
|
130 |
raise |
|
131 |
if self.debug: |
|
132 |
sys.stderr.write(strings.one_line(get_cur_query(cur))+'\n') |
|
133 |
return cur |
|
139 |
cur = self.DbCursor(self) |
|
140 |
query = cur.mogrify(query, params) |
|
141 |
try: return self.CacheCursor(self.query_results[query]) |
|
142 |
except KeyError: |
|
143 |
try: cur.execute(query) |
|
144 |
except Exception, e: |
|
145 |
_add_cursor_info(e, cur) |
|
146 |
raise |
|
147 |
if self.debug: |
|
148 |
sys.stderr.write(strings.one_line(get_cur_query(cur))+'\n') |
|
149 |
return cur |
|
134 | 150 |
|
135 | 151 |
connect = DbConn |
136 | 152 |
|
Also available in: Unified diff
sql.py: Cache the results of queries (when all rows are read)