summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/databases/sqlite.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-08-14 21:53:32 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-08-14 21:53:32 +0000
commit087f235c33c1be4e0778231e8344a50dc4005c59 (patch)
treed47c35d1e520e43c05ec869304870c0b6c87f736 /lib/sqlalchemy/databases/sqlite.py
parente58063aa91d893d76e9f34fbc3ea21818185844d (diff)
downloadsqlalchemy-087f235c33c1be4e0778231e8344a50dc4005c59.tar.gz
- merged "fasttypes" branch. this branch changes the signature
of convert_bind_param() and convert_result_value() to callable-returning bind_processor() and result_processor() methods. if no callable is returned, no pre/post processing function is called. - hooks added throughout base/sql/defaults to optimize the calling of bind param/result processors so that method call overhead is minimized. special cases added for executemany() scenarios such that unneeded "last row id" logic doesn't kick in, parameters aren't excessively traversed. - new performance tests show a combined mass-insert/mass-select test as having 68% fewer function calls than the same test run against 0.3. - general performance improvement of result set iteration is around 10-20%.
Diffstat (limited to 'lib/sqlalchemy/databases/sqlite.py')
-rw-r--r--lib/sqlalchemy/databases/sqlite.py74
1 files changed, 43 insertions, 31 deletions
diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py
index 7999cc403..3cc821a36 100644
--- a/lib/sqlalchemy/databases/sqlite.py
+++ b/lib/sqlalchemy/databases/sqlite.py
@@ -32,15 +32,17 @@ class SLSmallInteger(sqltypes.Smallinteger):
return "SMALLINT"
class DateTimeMixin(object):
- def convert_bind_param(self, value, dialect):
- if value is not None:
- if getattr(value, 'microsecond', None) is not None:
- return value.strftime(self.__format__ + "." + str(value.microsecond))
+ def bind_processor(self, dialect):
+ def process(value):
+ if value is not None:
+ if getattr(value, 'microsecond', None) is not None:
+ return value.strftime(self.__format__ + "." + str(value.microsecond))
+ else:
+ return value.strftime(self.__format__)
else:
- return value.strftime(self.__format__)
- else:
- return None
-
+ return None
+ return process
+
def _cvt(self, value, dialect):
if value is None:
return None
@@ -57,30 +59,36 @@ class SLDateTime(DateTimeMixin,sqltypes.DateTime):
def get_col_spec(self):
return "TIMESTAMP"
- def convert_result_value(self, value, dialect):
- tup = self._cvt(value, dialect)
- return tup and datetime.datetime(*tup)
-
+ def result_processor(self, dialect):
+ def process(value):
+ tup = self._cvt(value, dialect)
+ return tup and datetime.datetime(*tup)
+ return process
+
class SLDate(DateTimeMixin, sqltypes.Date):
__format__ = "%Y-%m-%d"
def get_col_spec(self):
return "DATE"
- def convert_result_value(self, value, dialect):
- tup = self._cvt(value, dialect)
- return tup and datetime.date(*tup[0:3])
-
+ def result_processor(self, dialect):
+ def process(value):
+ tup = self._cvt(value, dialect)
+ return tup and datetime.date(*tup[0:3])
+ return process
+
class SLTime(DateTimeMixin, sqltypes.Time):
__format__ = "%H:%M:%S"
def get_col_spec(self):
return "TIME"
- def convert_result_value(self, value, dialect):
- tup = self._cvt(value, dialect)
- return tup and datetime.time(*tup[3:7])
-
+ def result_processor(self, dialect):
+ def process(value):
+ tup = self._cvt(value, dialect)
+ return tup and datetime.time(*tup[3:7])
+ return process
+
class SLText(sqltypes.TEXT):
def get_col_spec(self):
return "TEXT"
@@ -101,16 +109,20 @@ class SLBoolean(sqltypes.Boolean):
def get_col_spec(self):
return "BOOLEAN"
- def convert_bind_param(self, value, dialect):
- if value is None:
- return None
- return value and 1 or 0
-
- def convert_result_value(self, value, dialect):
- if value is None:
- return None
- return value and True or False
-
+ def bind_processor(self, dialect):
+ def process(value):
+ if value is None:
+ return None
+ return value and 1 or 0
+ return process
+
+ def result_processor(self, dialect):
+ def process(value):
+ if value is None:
+ return None
+ return value and True or False
+ return process
+
colspecs = {
sqltypes.Integer : SLInteger,
sqltypes.Smallinteger : SLSmallInteger,
@@ -150,7 +162,7 @@ def descriptor():
class SQLiteExecutionContext(default.DefaultExecutionContext):
def post_exec(self):
- if self.compiled.isinsert:
+ if self.compiled.isinsert and not self.executemany:
if not len(self._last_inserted_ids) or self._last_inserted_ids[0] is None:
self._last_inserted_ids = [self.cursor.lastrowid] + self._last_inserted_ids[1:]