server/sources/native.py
changeset 10229 512ba8f37bd4
parent 10187 0df931eb08de
parent 10197 7c732d2abbc1
child 10272 3231fd2fa7a5
--- a/server/sources/native.py	Wed Feb 25 17:13:46 2015 +0100
+++ b/server/sources/native.py	Thu Mar 12 14:21:36 2015 +0100
@@ -1553,14 +1553,15 @@
     system database in a database independent format. The file is a
     Zip archive containing the following files:
 
-    * format.txt: the format of the archive. Currently '1.0'
+    * format.txt: the format of the archive. Currently '1.1'
     * tables.txt: list of filenames in the archive tables/ directory
     * sequences.txt: list of filenames in the archive sequences/ directory
+    * numranges.txt: list of filenames in the archive numrange/ directory
     * versions.txt: the list of cube versions from CWProperty
     * tables/<tablename>.<chunkno>: pickled data
     * sequences/<sequencename>: pickled data
 
-    The pickled data format for tables and sequences is a tuple of 3 elements:
+    The pickled data format for tables, numranges and sequences is a tuple of 3 elements:
     * the table name
     * a tuple of column names
     * a list of rows (as tuples with one element per column)
@@ -1598,6 +1599,9 @@
             for seq in self.get_sequences():
                 self.logger.info('processing sequence %s', seq)
                 self.write_sequence(archive, seq)
+            for numrange in self.get_numranges():
+                self.logger.info('processing numrange %s', numrange)
+                self.write_numrange(archive, numrange)
             for table in self.get_tables():
                 self.logger.info('processing table %s', table)
                 self.write_table(archive, table)
@@ -1628,12 +1632,16 @@
         return non_entity_tables + etype_tables + relation_tables
 
     def get_sequences(self):
+        return []
+
+    def get_numranges(self):
         return ['entities_id_seq']
 
     def write_metadata(self, archive):
-        archive.writestr('format.txt', '1.0')
+        archive.writestr('format.txt', '1.1')
         archive.writestr('tables.txt', '\n'.join(self.get_tables()))
         archive.writestr('sequences.txt', '\n'.join(self.get_sequences()))
+        archive.writestr('numranges.txt', '\n'.join(self.get_numranges()))
         versions = self._get_versions()
         versions_str = '\n'.join('%s %s' % (k, v)
                                  for k, v in versions)
@@ -1646,6 +1654,13 @@
         serialized = self._serialize(seq, columns, rows)
         archive.writestr('sequences/%s' % seq, serialized)
 
+    def write_numrange(self, archive, numrange):
+        sql = self.dbhelper.sql_numrange_current_state(numrange)
+        columns, rows_iterator = self._get_cols_and_rows(sql)
+        rows = list(rows_iterator)
+        serialized = self._serialize(numrange, columns, rows)
+        archive.writestr('numrange/%s' % numrange, serialized)
+
     def write_table(self, archive, table):
         nb_lines_sql = 'SELECT COUNT(*) FROM %s' % table
         self.cursor.execute(nb_lines_sql)
@@ -1682,10 +1697,13 @@
         archive = zipfile.ZipFile(backupfile, 'r', allowZip64=True)
         self.cnx = self.get_connection()
         self.cursor = self.cnx.cursor()
-        sequences, tables, table_chunks = self.read_metadata(archive, backupfile)
+        sequences, numranges, tables, table_chunks = self.read_metadata(archive, backupfile)
         for seq in sequences:
             self.logger.info('restoring sequence %s', seq)
             self.read_sequence(archive, seq)
+        for numrange in numranges:
+            self.logger.info('restoring numrange %s', seq)
+            self.read_numrange(archive, numrange)
         for table in tables:
             self.logger.info('restoring table %s', table)
             self.read_table(archive, table, sorted(table_chunks[table]))
@@ -1696,11 +1714,12 @@
     def read_metadata(self, archive, backupfile):
         formatinfo = archive.read('format.txt')
         self.logger.info('checking metadata')
-        if formatinfo.strip() != "1.0":
+        if formatinfo.strip() != "1.1":
             self.logger.critical('Unsupported format in archive: %s', formatinfo)
             raise ValueError('Unknown format in %s: %s' % (backupfile, formatinfo))
         tables = archive.read('tables.txt').splitlines()
         sequences = archive.read('sequences.txt').splitlines()
+        numranges = archive.read('numranges.txt').splitlines()
         file_versions = self._parse_versions(archive.read('versions.txt'))
         versions = set(self._get_versions())
         if file_versions != versions:
@@ -1717,7 +1736,7 @@
             filename = basename(name)
             tablename, _ext = filename.rsplit('.', 1)
             table_chunks.setdefault(tablename, []).append(name)
-        return sequences, tables, table_chunks
+        return sequences, numranges, tables, table_chunks
 
     def read_sequence(self, archive, seq):
         seqname, columns, rows = loads(archive.read('sequences/%s' % seq))
@@ -1729,6 +1748,16 @@
         self.cursor.execute(sql)
         self.cnx.commit()
 
+    def read_numrange(self, archive, numrange):
+        rangename, columns, rows = loads(archive.read('numrange/%s' % numrange))
+        assert rangename == numrange
+        assert len(rows) == 1
+        assert len(rows[0]) == 1
+        value = rows[0][0]
+        sql = self.dbhelper.sql_restart_numrange(numrange, value)
+        self.cursor.execute(sql)
+        self.cnx.commit()
+
     def read_table(self, archive, table, filenames):
         merge_args = self._source.merge_args
         self.cursor.execute('DELETE FROM %s' % table)