From 6cd05ed6feff87567ddc728dcea40ede6e8c8cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 28 Jul 2015 08:04:29 +0200 Subject: [PATCH] Add has_multirow_insert There are still many databases that doesn't support this SQL-92 syntax. issue4881 review19331002 --- trytond/backend/database.py | 4 ++++ trytond/backend/mysql/database.py | 3 +++ trytond/backend/postgresql/database.py | 3 +++ trytond/backend/sqlite/database.py | 3 +++ trytond/model/modelsql.py | 10 ++++++++-- 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/trytond/backend/database.py b/trytond/backend/database.py index 400117690d..06f618f536 100644 --- a/trytond/backend/database.py +++ b/trytond/backend/database.py @@ -220,6 +220,10 @@ class CursorInterface(object): :return: a boolean ''' + def has_multirow_insert(self): + 'Return True if database supports multirow insert' + return False + def __build_dict(self, row): return dict((desc[0], row[i]) for i, desc in enumerate(self.description)) diff --git a/trytond/backend/mysql/database.py b/trytond/backend/mysql/database.py index 5f034dcadc..0c6d349fa8 100644 --- a/trytond/backend/mysql/database.py +++ b/trytond/backend/mysql/database.py @@ -308,6 +308,9 @@ class Cursor(CursorInterface): def has_constraint(self): return False + def has_multirow_insert(self): + return True + def limit_clause(self, select, limit=None, offset=None): if offset and limit is None: limit = 18446744073709551610 # max bigint diff --git a/trytond/backend/postgresql/database.py b/trytond/backend/postgresql/database.py index ef59545cbf..3ef34cb3e1 100644 --- a/trytond/backend/postgresql/database.py +++ b/trytond/backend/postgresql/database.py @@ -361,6 +361,9 @@ class Cursor(CursorInterface): # RETURNING clause is available since PostgreSQL 8.2 return self._database.get_version(self) >= (8, 2) + def has_multirow_insert(self): + return True + register_type(UNICODE) if PYDATE: register_type(PYDATE) diff --git a/trytond/backend/sqlite/database.py b/trytond/backend/sqlite/database.py index 5fb6691b8e..91346b09ec 100644 --- a/trytond/backend/sqlite/database.py +++ b/trytond/backend/sqlite/database.py @@ -392,6 +392,9 @@ class Cursor(CursorInterface): def has_constraint(self): return False + def has_multirow_insert(self): + return True + sqlite.register_converter('NUMERIC', lambda val: Decimal(val.decode('utf-8'))) if sys.version_info[0] == 2: sqlite.register_adapter(Decimal, lambda val: buffer(str(val))) diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py index 251f96f99e..7ac7dfc5f5 100644 --- a/trytond/model/modelsql.py +++ b/trytond/model/modelsql.py @@ -353,8 +353,14 @@ class ModelSQL(ModelStorage): cursor.execute(*history.insert(hcolumns, table.select(*columns, where=where))) else: - cursor.execute(*history.insert(hcolumns, - [[id_, CurrentTimestamp(), user] for id_ in sub_ids])) + if cursor.has_multirow_insert(): + cursor.execute(*history.insert(hcolumns, + [[id_, CurrentTimestamp(), user] + for id_ in sub_ids])) + else: + for id_ in sub_ids: + cursor.execute(*history.insert(hcolumns, + [[id_, CurrentTimestamp(), user]])) @classmethod def _restore_history(cls, ids, datetime, _before=False):