from threading import Thread from Queue import Queue import apsw class SingleThreadOnly(object): def __init__(self, db): self.cnx = apsw.Connection(db) self.cursor = self.cnx.cursor() def execute(self, req, arg=None): self.cursor.execute(req, arg or tuple()) def select(self, req, arg=None): self.execute(req, arg) for raw in self.cursor: yield raw def close(self): self.cnx.close() class MultiThreadOK(Thread): def __init__(self, db): super(MultiThreadOK, self).__init__() self.db=db self.reqs=Queue() self.start() def run(self): cnx = apsw.Connection(self.db) cursor = cnx.cursor() while True: req, arg, res = self.reqs.get() if req=='--close--': break cursor.execute(req, arg) if res: for rec in cursor: res.put(rec) res.put('--no more--') cnx.close() def execute(self, req, arg=None, res=None): self.reqs.put((req, arg or tuple(), res)) def select(self, req, arg=None): res=Queue() self.execute(req, arg, res) while True: rec=res.get() if rec=='--no more--': break yield rec def close(self): self.execute('--close--') if __name__=='__main__': db='people.db' multithread=True if multithread: sql=MultiThreadOK(db) else: sql=SingleThreadOnly(db) sql.execute("create table people(name,first)") sql.execute("insert into people values('VAN ROSSUM','Guido')") sql.execute("insert into people values(?,?)", ('TORVALDS','Linus')) for f, n in sql.select("select first, name from people"): print f, n sql.close()