From 444a09b0b265ec7779176bad478a4559140be8b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Sat, 2 Aug 2014 10:52:47 +0100 Subject: [PATCH] Refactored BaseAdapter delete method - Special case code for sqlite and spatialite should not be in the BaseAdapter it should be in SQLiteAdapter, this should also provide a negligible performance boost in delete operations for most adapters including SQLiteAdapter. --- gluon/dal.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/gluon/dal.py b/gluon/dal.py index b9301a44..ab80bcc9 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -1638,24 +1638,11 @@ class BaseAdapter(ConnectionPool): def delete(self, tablename, query): sql = self._delete(tablename, query) - ### special code to handle CASCADE in SQLite & SpatiaLite - db = self.db - table = db[tablename] - if self.dbengine in ('sqlite', 'spatialite') and table._referenced_by: - deleted = [x[table._id.name] for x in db(query).select(table._id)] - ### end special code to handle CASCADE in SQLite & SpatiaLite self.execute(sql) try: counter = self.cursor.rowcount except: counter = None - ### special code to handle CASCADE in SQLite & SpatiaLite - if self.dbengine in ('sqlite', 'spatialite') and counter: - for field in table._referenced_by: - if field.type == 'reference '+table._tablename \ - and field.ondelete == 'CASCADE': - db(field.belongs(deleted)).delete() - ### end special code to handle CASCADE in SQLite & SpatiaLite return counter def get_table(self, query): @@ -2451,6 +2438,27 @@ class SQLiteAdapter(BaseAdapter): return '(%s REGEXP %s)' % (self.expand(first), self.expand(second, 'string')) + def delete(self, tablename, query): + sql = self._delete(tablename, query) + ### Special code to Handle CASCADE in SQLite & SpatiaLite + db = self.db + table = db[tablename] + deleted = [x[table._id.name] for x in db(query).select(table._id)] + ### end special code to handle CASCADE in SQLite & SpatiaLite + self.execute(sql) + try: + counter = self.cursor.rowcount + except: + counter = None + ### special code to handle CASCADE in SQLite & SpatiaLite + if counter: + for field in table._referenced_by: + if field.type == 'reference '+table._tablename \ + and field.ondelete == 'CASCADE': + db(field.belongs(deleted)).delete() + ### end special code to handle CASCADE in SQLite & SpatiaLite + return counter + def select(self, query, fields, attributes): """ Simulate `SELECT ... FOR UPDATE` with `BEGIN IMMEDIATE TRANSACTION`.