Code

7dae5df67776641c5b47b78801bbe8e6495ffa7f
[roundup.git] / roundup / backends / back_sqlite.py
1 # $Id: back_sqlite.py,v 1.1 2002-09-18 05:07:47 richard Exp $
2 __doc__ = '''
3 See https://pysqlite.sourceforge.net/ for pysqlite info
4 '''
5 import base64, marshal
6 from roundup.backends.rdbms_common import *
7 import sqlite
9 class Database(Database):
10     # char to use for positional arguments
11     arg = '%s'
13     def open_connection(self):
14         # ensure files are group readable and writable
15         os.umask(0002)
16         db = os.path.join(self.config.DATABASE, 'db')
17         self.conn = sqlite.connect(db=db)
18         cursor = self.conn.cursor()
19         try:
20             self.database_schema = self.load_dbschema(cursor)
21         except sqlite.DatabaseError, error:
22             if str(error) != 'no such table: schema':
23                 raise
24             self.database_schema = {}
25             cursor = self.conn.cursor()
26             cursor.execute('create table schema (schema varchar)')
27             cursor.execute('create table ids (name varchar, num integer)')
29     def __repr__(self):
30         return '<roundlite 0x%x>'%id(self)
32     def sql_fetchone(self, cursor):
33         ''' Fetch a single row. If there's nothing to fetch, return None.
34         '''
35         return cursor.fetchone()
37     def sql_commit(self):
38         ''' Actually commit to the database.
40             Ignore errors if there's nothing to commit.
41         '''
42         try:
43             self.conn.commit()
44         except sqlite.DatabaseError, error:
45             if str(error) != 'cannot commit - no transaction is active':
46                 raise
48     def save_dbschema(self, cursor, schema):
49         ''' Save the schema definition that the database currently implements
50         '''
51         s = repr(self.database_schema)
52         self.sql(cursor, 'insert into schema values (%s)', (s,))
54     def load_dbschema(self, cursor):
55         ''' Load the schema definition that the database currently implements
56         '''
57         cursor.execute('select schema from schema')
58         return eval(cursor.fetchone()[0])
60     def save_journal(self, cursor, classname, cols, nodeid, journaldate,
61             journaltag, action, params):
62         ''' Save the journal entry to the database
63         '''
64         # make the params db-friendly
65         params = repr(params)
66         entry = (nodeid, journaldate, journaltag, action, params)
68         # do the insert
69         a = self.arg
70         sql = 'insert into %s__journal (%s) values (%s,%s,%s,%s,%s)'%(classname,
71             cols, a, a, a, a, a)
72         if __debug__:
73             print >>hyperdb.DEBUG, 'addjournal', (self, sql, entry)
74         cursor.execute(sql, entry)
76     def load_journal(self, cursor, classname, cols, nodeid):
77         ''' Load the journal from the database
78         '''
79         # now get the journal entries
80         sql = 'select %s from %s__journal where nodeid=%s'%(cols, classname,
81             self.arg)
82         if __debug__:
83             print >>hyperdb.DEBUG, 'getjournal', (self, sql, nodeid)
84         cursor.execute(sql, (nodeid,))
85         res = []
86         for nodeid, date_stamp, user, action, params in cursor.fetchall():
87             params = eval(params)
88             res.append((nodeid, date.Date(date_stamp), user, action, params))
89         return res