33 import pickle |
33 import pickle |
34 from threading import Lock |
34 from threading import Lock |
35 from datetime import datetime |
35 from datetime import datetime |
36 from base64 import b64decode, b64encode |
36 from base64 import b64decode, b64encode |
37 from contextlib import contextmanager |
37 from contextlib import contextmanager |
38 from os.path import abspath, basename |
38 from os.path import basename |
39 import re |
39 import re |
40 import itertools |
40 import itertools |
41 import zipfile |
41 import zipfile |
42 import logging |
42 import logging |
43 import sys |
43 import sys |
50 |
50 |
51 from yams import schema2sql as y2sql |
51 from yams import schema2sql as y2sql |
52 from yams.schema import role_name |
52 from yams.schema import role_name |
53 |
53 |
54 from cubicweb import (UnknownEid, AuthenticationError, ValidationError, Binary, |
54 from cubicweb import (UnknownEid, AuthenticationError, ValidationError, Binary, |
55 UniqueTogetherError, QueryError, UndoTransactionException) |
55 UniqueTogetherError, UndoTransactionException) |
56 from cubicweb import transaction as tx, server, neg_role |
56 from cubicweb import transaction as tx, server, neg_role |
57 from cubicweb.utils import QueryCache |
57 from cubicweb.utils import QueryCache |
58 from cubicweb.schema import VIRTUAL_RTYPES |
58 from cubicweb.schema import VIRTUAL_RTYPES |
59 from cubicweb.cwconfig import CubicWebNoAppConfiguration |
59 from cubicweb.cwconfig import CubicWebNoAppConfiguration |
60 from cubicweb.server import hook |
60 from cubicweb.server import hook |
1552 def backup(self, backupfile): |
1552 def backup(self, backupfile): |
1553 archive = zipfile.ZipFile(backupfile, 'w', allowZip64=True) |
1553 archive = zipfile.ZipFile(backupfile, 'w', allowZip64=True) |
1554 self.cnx = self.get_connection() |
1554 self.cnx = self.get_connection() |
1555 try: |
1555 try: |
1556 self.cursor = self.cnx.cursor() |
1556 self.cursor = self.cnx.cursor() |
1557 self.cursor.arraysize=100 |
1557 self.cursor.arraysize = 100 |
1558 self.logger.info('writing metadata') |
1558 self.logger.info('writing metadata') |
1559 self.write_metadata(archive) |
1559 self.write_metadata(archive) |
1560 for seq in self.get_sequences(): |
1560 for seq in self.get_sequences(): |
1561 self.logger.info('processing sequence %s', seq) |
1561 self.logger.info('processing sequence %s', seq) |
1562 self.write_sequence(archive, seq) |
1562 self.write_sequence(archive, seq) |
1595 def write_metadata(self, archive): |
1595 def write_metadata(self, archive): |
1596 archive.writestr('format.txt', '1.0') |
1596 archive.writestr('format.txt', '1.0') |
1597 archive.writestr('tables.txt', '\n'.join(self.get_tables())) |
1597 archive.writestr('tables.txt', '\n'.join(self.get_tables())) |
1598 archive.writestr('sequences.txt', '\n'.join(self.get_sequences())) |
1598 archive.writestr('sequences.txt', '\n'.join(self.get_sequences())) |
1599 versions = self._get_versions() |
1599 versions = self._get_versions() |
1600 versions_str = '\n'.join('%s %s' % (k,v) |
1600 versions_str = '\n'.join('%s %s' % (k, v) |
1601 for k,v in versions) |
1601 for k, v in versions) |
1602 archive.writestr('versions.txt', versions_str) |
1602 archive.writestr('versions.txt', versions_str) |
1603 |
1603 |
1604 def write_sequence(self, archive, seq): |
1604 def write_sequence(self, archive, seq): |
1605 sql = self.dbhelper.sql_sequence_current_state(seq) |
1605 sql = self.dbhelper.sql_sequence_current_state(seq) |
1606 columns, rows_iterator = self._get_cols_and_rows(sql) |
1606 columns, rows_iterator = self._get_cols_and_rows(sql) |