41 from six import PY2, text_type, binary_type, string_types |
41 from six import PY2, text_type, binary_type, string_types |
42 from six.moves import range, cPickle as pickle |
42 from six.moves import range, cPickle as pickle |
43 |
43 |
44 from logilab.common.decorators import cached, clear_cache |
44 from logilab.common.decorators import cached, clear_cache |
45 from logilab.common.configuration import Method |
45 from logilab.common.configuration import Method |
46 from logilab.common.shellutils import getlogin |
46 from logilab.common.shellutils import getlogin, ASK |
47 from logilab.database import get_db_helper, sqlgen |
47 from logilab.database import get_db_helper, sqlgen |
48 |
48 |
49 from yams.schema import role_name |
49 from yams.schema import role_name |
50 |
50 |
51 from cubicweb import (UnknownEid, AuthenticationError, ValidationError, Binary, |
51 from cubicweb import (UnknownEid, AuthenticationError, ValidationError, Binary, |
54 from cubicweb.utils import QueryCache |
54 from cubicweb.utils import QueryCache |
55 from cubicweb.schema import VIRTUAL_RTYPES |
55 from cubicweb.schema import VIRTUAL_RTYPES |
56 from cubicweb.cwconfig import CubicWebNoAppConfiguration |
56 from cubicweb.cwconfig import CubicWebNoAppConfiguration |
57 from cubicweb.server import hook |
57 from cubicweb.server import hook |
58 from cubicweb.server import schema2sql as y2sql |
58 from cubicweb.server import schema2sql as y2sql |
59 from cubicweb.server.utils import crypt_password, eschema_eid, verify_and_update |
59 from cubicweb.server.utils import crypt_password, verify_and_update |
60 from cubicweb.server.sqlutils import SQL_PREFIX, SQLAdapterMixIn |
60 from cubicweb.server.sqlutils import SQL_PREFIX, SQLAdapterMixIn |
61 from cubicweb.server.rqlannotation import set_qdata |
61 from cubicweb.server.rqlannotation import set_qdata |
62 from cubicweb.server.hook import CleanupDeletedEidsCacheOp |
62 from cubicweb.server.hook import CleanupDeletedEidsCacheOp |
63 from cubicweb.server.edition import EditedEntity |
63 from cubicweb.server.edition import EditedEntity |
64 from cubicweb.server.sources import AbstractSource, dbg_st_search, dbg_results |
64 from cubicweb.server.sources import AbstractSource, dbg_st_search, dbg_results |
913 extid = b64encode(extid).decode('ascii') |
913 extid = b64encode(extid).decode('ascii') |
914 attrs = {'type': text_type(entity.cw_etype), 'eid': entity.eid, 'extid': extid, |
914 attrs = {'type': text_type(entity.cw_etype), 'eid': entity.eid, 'extid': extid, |
915 'asource': text_type(source.uri)} |
915 'asource': text_type(source.uri)} |
916 self._handle_insert_entity_sql(cnx, self.sqlgen.insert('entities', attrs), attrs) |
916 self._handle_insert_entity_sql(cnx, self.sqlgen.insert('entities', attrs), attrs) |
917 # insert core relations: is, is_instance_of and cw_source |
917 # insert core relations: is, is_instance_of and cw_source |
918 try: |
918 |
|
919 if entity.e_schema.eid is not None: # else schema has not yet been serialized |
919 self._handle_is_relation_sql(cnx, 'INSERT INTO is_relation(eid_from,eid_to) VALUES (%s,%s)', |
920 self._handle_is_relation_sql(cnx, 'INSERT INTO is_relation(eid_from,eid_to) VALUES (%s,%s)', |
920 (entity.eid, eschema_eid(cnx, entity.e_schema))) |
921 (entity.eid, entity.e_schema.eid)) |
921 except IndexError: |
|
922 # during schema serialization, skip |
|
923 pass |
|
924 else: |
|
925 for eschema in entity.e_schema.ancestors() + [entity.e_schema]: |
922 for eschema in entity.e_schema.ancestors() + [entity.e_schema]: |
926 self._handle_is_relation_sql(cnx, |
923 self._handle_is_relation_sql(cnx, |
927 'INSERT INTO is_instance_of_relation(eid_from,eid_to) VALUES (%s,%s)', |
924 'INSERT INTO is_instance_of_relation(eid_from,eid_to) VALUES (%s,%s)', |
928 (entity.eid, eschema_eid(cnx, eschema))) |
925 (entity.eid, eschema.eid)) |
929 if 'CWSource' in self.schema and source.eid is not None: # else, cw < 3.10 |
926 if 'CWSource' in self.schema and source.eid is not None: # else, cw < 3.10 |
930 self._handle_is_relation_sql(cnx, 'INSERT INTO cw_source_relation(eid_from,eid_to) VALUES (%s,%s)', |
927 self._handle_is_relation_sql(cnx, 'INSERT INTO cw_source_relation(eid_from,eid_to) VALUES (%s,%s)', |
931 (entity.eid, source.eid)) |
928 (entity.eid, source.eid)) |
932 # now we can update the full text index |
929 # now we can update the full text index |
933 if self.need_fti_indexation(entity.cw_etype): |
930 if self.need_fti_indexation(entity.cw_etype): |
1740 self.logger.critical('Unsupported format in archive: %s', formatinfo) |
1737 self.logger.critical('Unsupported format in archive: %s', formatinfo) |
1741 raise ValueError('Unknown format in %s: %s' % (backupfile, formatinfo)) |
1738 raise ValueError('Unknown format in %s: %s' % (backupfile, formatinfo)) |
1742 tables = archive.read('tables.txt').splitlines() |
1739 tables = archive.read('tables.txt').splitlines() |
1743 sequences = archive.read('sequences.txt').splitlines() |
1740 sequences = archive.read('sequences.txt').splitlines() |
1744 numranges = archive.read('numranges.txt').splitlines() |
1741 numranges = archive.read('numranges.txt').splitlines() |
1745 file_versions = self._parse_versions(archive.read('versions.txt')) |
1742 archive_versions = self._parse_versions(archive.read('versions.txt')) |
1746 versions = set(self._get_versions()) |
1743 db_versions = set(self._get_versions()) |
1747 if file_versions != versions: |
1744 if archive_versions != db_versions: |
1748 self.logger.critical('Unable to restore : versions do not match') |
1745 self.logger.critical('Restore warning: versions do not match') |
1749 self.logger.critical('Expected:\n%s', '\n'.join('%s : %s' % (cube, ver) |
1746 new_cubes = db_versions - archive_versions |
1750 for cube, ver in sorted(versions))) |
1747 if new_cubes: |
1751 self.logger.critical('Found:\n%s', '\n'.join('%s : %s' % (cube, ver) |
1748 self.logger.critical('In the db:\n%s', '\n'.join('%s: %s' % (cube, ver) |
1752 for cube, ver in sorted(file_versions))) |
1749 for cube, ver in sorted(new_cubes))) |
1753 raise ValueError('Unable to restore : versions do not match') |
1750 old_cubes = archive_versions - db_versions |
|
1751 if old_cubes: |
|
1752 self.logger.critical('In the archive:\n%s', '\n'.join('%s: %s' % (cube, ver) |
|
1753 for cube, ver in sorted(old_cubes))) |
|
1754 if not ASK.confirm('Versions mismatch: continue anyway ?', False): |
|
1755 raise ValueError('Unable to restore: versions do not match') |
1754 table_chunks = {} |
1756 table_chunks = {} |
1755 for name in archive.namelist(): |
1757 for name in archive.namelist(): |
1756 if not name.startswith('tables/'): |
1758 if not name.startswith('tables/'): |
1757 continue |
1759 continue |
1758 filename = basename(name) |
1760 filename = basename(name) |