Project

General

Profile

« Previous | Next » 

Revision 1891

sql.py: Cache the results of queries (when all rows are read)

View differences:

lib/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