1- # $Id: back_sqlite.py,v 1.46 2006-08-30 09:05:30 schlatterbeck Exp $
1+ # $Id: back_sqlite.py,v 1.47 2006-10-04 01:12:00 richard Exp $
22'''Implements a backend for SQLite.
33
44See https://pysqlite.sourceforge.net/ for pysqlite info
1313
1414from roundup import hyperdb , date , password
1515from roundup .backends import rdbms_common
16+ is_sqlite3 = False
1617try :
1718 import sqlite
1819except ImportError :
19- from pysqlite2 import dbapi2 as sqlite
20+ try :
21+ from pysqlite2 import dbapi2 as sqlite
22+ except ImportError :
23+ import sqlite3 as sqlite
24+ is_sqlite3 = True
2025
2126def db_exists (config ):
2227 return os .path .exists (os .path .join (config .DATABASE , 'db' ))
@@ -26,7 +31,10 @@ def db_nuke(config):
2631
2732class Database (rdbms_common .Database ):
2833 # char to use for positional arguments
29- arg = '%s'
34+ if is_sqlite3 :
35+ arg = '?'
36+ else :
37+ arg = '%s'
3038
3139 # used by some code to switch styles of query
3240 implements_intersect = 1
@@ -88,10 +96,14 @@ def sql_open_connection(self):
8896
8997 db = os .path .join (self .config .DATABASE , 'db' )
9098 logging .getLogger ('hyperdb' ).info ('open database %r' % db )
91- conn = sqlite .connect (db = db )
9299 # set a 30 second timeout (extraordinarily generous) for handling
93100 # locked database
94- conn .db .sqlite_busy_handler (self .sqlite_busy_handler )
101+ if is_sqlite3 :
102+ conn = sqlite .connect (db , 30 )
103+ conn .row_factory = sqlite .Row
104+ else :
105+ conn = sqlite .connect (db = db )
106+ conn .db .sqlite_busy_handler (self .sqlite_busy_handler )
95107 cursor = conn .cursor ()
96108 return (conn , cursor )
97109
@@ -252,11 +264,21 @@ def update_class(self, spec, old_spec, force=0, adding_v2=0):
252264 # generate the new value for the Interval int column
253265 if name .endswith ('_int__' ):
254266 name = name [2 :- 6 ]
255- if entry .has_key (name ):
267+ if is_sqlite3 :
268+ try :
269+ v = hyperdb .Interval (entry [name ]).as_seconds ()
270+ except IndexError :
271+ v = None
272+ elif entry .has_key (name ):
256273 v = hyperdb .Interval (entry [name ]).as_seconds ()
257274 else :
258275 v = None
259- elif entry .has_key (name ):
276+ elif is_sqlite3 :
277+ try :
278+ v = entry [name ]
279+ except IndexError :
280+ v = None
281+ elif (not is_sqlite3 and entry .has_key (name )):
260282 v = entry [name ]
261283 else :
262284 v = None
@@ -342,10 +364,19 @@ def clear(self):
342364
343365 def create_class (self , spec ):
344366 rdbms_common .Database .create_class (self , spec )
345- sql = 'insert into ids (name, num) values (%s, %s)'
367+ sql = 'insert into ids (name, num) values (%s, %s)' % ( self . arg , self . arg )
346368 vals = (spec .classname , 1 )
347369 self .sql (sql , vals )
348370
371+ if is_sqlite3 :
372+ def load_journal (self , classname , cols , nodeid ):
373+ '''We need to turn the sqlite3.Row into a tuple so it can be
374+ unpacked'''
375+ l = rdbms_common .Database .load_journal (self ,
376+ classname , cols , nodeid )
377+ cols = range (5 )
378+ return [[row [col ] for col in cols ] for row in l ]
379+
349380class sqliteClass :
350381 def filter (self , search_matches , filterspec , sort = (None ,None ),
351382 group = (None ,None )):
0 commit comments