annotate examples/trac/trac/db/sqlite_backend.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # Author: Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 import os
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 import weakref
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 from trac.db.api import IDatabaseConnector
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from trac.db.util import ConnectionWrapper
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 _like_escape_re = re.compile(r'([/_%])')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 import pysqlite2.dbapi2 as sqlite
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 have_pysqlite = 2
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 _ver = sqlite.sqlite_version_info
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 sqlite_version = _ver[0] * 10000 + _ver[1] * 100 + int(_ver[2])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 class PyFormatCursor(sqlite.Cursor):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 def _rollback_on_error(self, function, *args, **kwargs):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 return function(self, *args, **kwargs)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 except sqlite.OperationalError, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 self.cnx.rollback()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 raise
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 def execute(self, sql, args=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 if args:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 sql = sql % (('?',) * len(args))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 return self._rollback_on_error(sqlite.Cursor.execute, sql,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 args or [])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 def executemany(self, sql, args=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 if args:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 sql = sql % (('?',) * len(args[0]))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 return self._rollback_on_error(sqlite.Cursor.executemany, sql,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 args or [])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 except ImportError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 import sqlite
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 have_pysqlite = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 _ver = sqlite._sqlite.sqlite_version_info()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 sqlite_version = _ver[0] * 10000 + _ver[1] * 100 + _ver[2]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 class SQLiteUnicodeCursor(sqlite.Cursor):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 def _convert_row(self, row):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 return tuple([(isinstance(v, str) and [v.decode('utf-8')] or [v])[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 for v in row])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 def fetchone(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 row = sqlite.Cursor.fetchone(self)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 return row and self._convert_row(row) or None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 def fetchmany(self, num):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 rows = sqlite.Cursor.fetchmany(self, num)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 return rows != None and [self._convert_row(row)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 for row in rows] or []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 def fetchall(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 rows = sqlite.Cursor.fetchall(self)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 return rows != None and [self._convert_row(row)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 for row in rows] or []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 except ImportError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 have_pysqlite = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 def _to_sql(table):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 sql = ["CREATE TABLE %s (" % table.name]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 coldefs = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 for column in table.columns:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 ctype = column.type.lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 if column.auto_increment:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 ctype = "integer PRIMARY KEY"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 elif len(table.key) == 1 and column.name in table.key:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 ctype += " PRIMARY KEY"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 elif ctype == "int":
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 ctype = "integer"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 coldefs.append(" %s %s" % (column.name, ctype))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 if len(table.key) > 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 coldefs.append(" UNIQUE (%s)" % ','.join(table.key))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 sql.append(',\n'.join(coldefs) + '\n);')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 yield '\n'.join(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 for index in table.indices:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 yield "CREATE INDEX %s_%s_idx ON %s (%s);" % (table.name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 '_'.join(index.columns), table.name, ','.join(index.columns))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 class SQLiteConnector(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 """SQLite database support."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 implements(IDatabaseConnector)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 def get_supported_schemes(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 return [('sqlite', 1)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 def get_connection(self, path, params={}):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 return SQLiteConnection(path, params)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 def init_db(cls, path, params={}):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 if path != ':memory:':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 # make the directory to hold the database
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 if os.path.exists(path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 raise TracError, 'Database already exists at %s' % path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 os.makedirs(os.path.split(path)[0])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 cnx = sqlite.connect(path, timeout=int(params.get('timeout', 10000)))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 cursor = cnx.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 from trac.db_default import schema
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 for table in schema:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 for stmt in cls.to_sql(table):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 cursor.execute(stmt)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 cnx.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 def to_sql(cls, table):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 return _to_sql(table)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 class SQLiteConnection(ConnectionWrapper):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 """Connection wrapper for SQLite."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 __slots__ = ['_active_cursors']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 poolable = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 def __init__(self, path, params={}):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 assert have_pysqlite > 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 self.cnx = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 if path != ':memory:':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 if not os.access(path, os.F_OK):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 raise TracError, 'Database "%s" not found.' % path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 dbdir = os.path.dirname(path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 if not os.access(path, os.R_OK + os.W_OK) or \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 not os.access(dbdir, os.R_OK + os.W_OK):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 from getpass import getuser
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 raise TracError, 'The user %s requires read _and_ write ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 'permission to the database file %s and the ' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 'directory it is located in.' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 % (getuser(), path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 if have_pysqlite == 2:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 self._active_cursors = weakref.WeakKeyDictionary()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 timeout = int(params.get('timeout', 10.0))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 cnx = sqlite.connect(path, detect_types=sqlite.PARSE_DECLTYPES,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 timeout=timeout)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 timeout = int(params.get('timeout', 10000))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 cnx = sqlite.connect(path, timeout=timeout, encoding='utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 ConnectionWrapper.__init__(self, cnx)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 if have_pysqlite == 2:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 def cursor(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 cursor = self.cnx.cursor(PyFormatCursor)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 self._active_cursors[cursor] = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 cursor.cnx = self
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 return cursor
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 def rollback(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 for cursor in self._active_cursors.keys():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 cursor.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 self.cnx.rollback()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 def cursor(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 self.cnx._checkNotClosed("cursor")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 return SQLiteUnicodeCursor(self.cnx, self.cnx.rowclass)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 def cast(self, column, type):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 return column
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 def like(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 if sqlite_version >= 30100:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 return "LIKE %s ESCAPE '/'"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 return 'LIKE %s'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 def like_escape(self, text):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 if sqlite_version >= 30100:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 return _like_escape_re.sub(r'/\1', text)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 return text
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 if have_pysqlite == 2:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 def get_last_id(self, cursor, table, column='id'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 return cursor.lastrowid
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 def get_last_id(self, cursor, table, column='id'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 return self.cnx.db.sqlite_last_insert_rowid()
Copyright (C) 2012-2017 Edgewall Software