Commit d9b98671 authored by Julien Muchembled's avatar Julien Muchembled

storage: split _migrate2() for reusable _alterTable()

Future migration steps are likely to alter tables, possibly with
transformation of data, and this is complicated for both supported backend.
parent e2dacd6a
...@@ -237,20 +237,25 @@ class MySQLDatabaseManager(DatabaseManager): ...@@ -237,20 +237,25 @@ class MySQLDatabaseManager(DatabaseManager):
if e.args[0] != NO_SUCH_TABLE: if e.args[0] != NO_SUCH_TABLE:
raise raise
def _alterTable(self, schema_dict, table, select="*"):
q = self.query
new = 'new_' + table
if self.nonempty(table) is None:
if self.nonempty(new) is None:
return
else:
q("DROP TABLE IF EXISTS " + new)
q(schema_dict.pop(table) % new
+ " SELECT %s FROM %s" % (select, table))
q("DROP TABLE " + table)
q("ALTER TABLE %s RENAME TO %s" % (new, table))
def _migrate1(self, _): def _migrate1(self, _):
self._checkNoUnfinishedTransactions() self._checkNoUnfinishedTransactions()
self.query("DROP TABLE IF EXISTS ttrans") self.query("DROP TABLE IF EXISTS ttrans")
def _migrate2(self, schema_dict): def _migrate2(self, schema_dict):
q = self.query self._alterTable(schema_dict, 'obj')
if self.nonempty('obj') is None:
if self.nonempty('new_obj') is None:
return
else:
q("DROP TABLE IF EXISTS new_obj")
q(schema_dict.pop('obj') % 'new_obj' + " SELECT * FROM obj")
q("DROP TABLE obj")
q("ALTER TABLE new_obj RENAME TO obj")
def _setup(self, dedup=False): def _setup(self, dedup=False):
self._config.clear() self._config.clear()
......
...@@ -113,23 +113,27 @@ class SQLiteDatabaseManager(DatabaseManager): ...@@ -113,23 +113,27 @@ class SQLiteDatabaseManager(DatabaseManager):
if not e.args[0].startswith("no such table:"): if not e.args[0].startswith("no such table:"):
raise raise
def _migrate1(self, *_): def _alterTable(self, schema_dict, table, select="*"):
self._checkNoUnfinishedTransactions()
self.query("DROP TABLE IF EXISTS ttrans")
def _migrate2(self, schema_dict, index_dict):
# BBB: As explained in _setup, no transactional DDL # BBB: As explained in _setup, no transactional DDL
# so let's do the same dance as for MySQL. # so let's do the same dance as for MySQL.
q = self.query q = self.query
if self.nonempty('obj') is None: new = 'new_' + table
if self.nonempty('new_obj') is None: if self.nonempty(table) is None:
if self.nonempty(new) is None:
return return
else: else:
q("DROP TABLE IF EXISTS new_obj") q("DROP TABLE IF EXISTS " + new)
q(schema_dict.pop('obj') % 'new_obj') q(schema_dict.pop(table) % new)
q("INSERT INTO new_obj SELECT * FROM obj") q("INSERT INTO %s SELECT %s FROM %s" % (new, select, table))
q("DROP TABLE obj") q("DROP TABLE " + table)
q("ALTER TABLE new_obj RENAME TO obj") q("ALTER TABLE %s RENAME TO %s" % (new, table))
def _migrate1(self, *_):
self._checkNoUnfinishedTransactions()
self.query("DROP TABLE IF EXISTS ttrans")
def _migrate2(self, schema_dict, index_dict):
self._alterTable(schema_dict, 'obj')
def _setup(self, dedup=False): def _setup(self, dedup=False):
# BBB: SQLite has transactional DDL but before Python 3.6, # BBB: SQLite has transactional DDL but before Python 3.6,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment