diff -r 9b4de34ad394 -r 97095348b3ee cubicweb/server/sources/native.py --- a/cubicweb/server/sources/native.py Thu Feb 11 21:59:49 2016 +0100 +++ b/cubicweb/server/sources/native.py Wed Feb 17 13:45:34 2016 +0100 @@ -43,7 +43,7 @@ from logilab.common.decorators import cached, clear_cache from logilab.common.configuration import Method -from logilab.common.shellutils import getlogin +from logilab.common.shellutils import getlogin, ASK from logilab.database import get_db_helper, sqlgen from yams.schema import role_name @@ -56,7 +56,7 @@ from cubicweb.cwconfig import CubicWebNoAppConfiguration from cubicweb.server import hook from cubicweb.server import schema2sql as y2sql -from cubicweb.server.utils import crypt_password, eschema_eid, verify_and_update +from cubicweb.server.utils import crypt_password, verify_and_update from cubicweb.server.sqlutils import SQL_PREFIX, SQLAdapterMixIn from cubicweb.server.rqlannotation import set_qdata from cubicweb.server.hook import CleanupDeletedEidsCacheOp @@ -915,17 +915,14 @@ 'asource': text_type(source.uri)} self._handle_insert_entity_sql(cnx, self.sqlgen.insert('entities', attrs), attrs) # insert core relations: is, is_instance_of and cw_source - try: + + if entity.e_schema.eid is not None: # else schema has not yet been serialized self._handle_is_relation_sql(cnx, 'INSERT INTO is_relation(eid_from,eid_to) VALUES (%s,%s)', - (entity.eid, eschema_eid(cnx, entity.e_schema))) - except IndexError: - # during schema serialization, skip - pass - else: + (entity.eid, entity.e_schema.eid)) for eschema in entity.e_schema.ancestors() + [entity.e_schema]: self._handle_is_relation_sql(cnx, 'INSERT INTO is_instance_of_relation(eid_from,eid_to) VALUES (%s,%s)', - (entity.eid, eschema_eid(cnx, eschema))) + (entity.eid, eschema.eid)) if 'CWSource' in self.schema and source.eid is not None: # else, cw < 3.10 self._handle_is_relation_sql(cnx, 'INSERT INTO cw_source_relation(eid_from,eid_to) VALUES (%s,%s)', (entity.eid, source.eid)) @@ -1742,15 +1739,20 @@ 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: - self.logger.critical('Unable to restore : versions do not match') - self.logger.critical('Expected:\n%s', '\n'.join('%s : %s' % (cube, ver) - for cube, ver in sorted(versions))) - self.logger.critical('Found:\n%s', '\n'.join('%s : %s' % (cube, ver) - for cube, ver in sorted(file_versions))) - raise ValueError('Unable to restore : versions do not match') + archive_versions = self._parse_versions(archive.read('versions.txt')) + db_versions = set(self._get_versions()) + if archive_versions != db_versions: + self.logger.critical('Restore warning: versions do not match') + new_cubes = db_versions - archive_versions + if new_cubes: + self.logger.critical('In the db:\n%s', '\n'.join('%s: %s' % (cube, ver) + for cube, ver in sorted(new_cubes))) + old_cubes = archive_versions - db_versions + if old_cubes: + self.logger.critical('In the archive:\n%s', '\n'.join('%s: %s' % (cube, ver) + for cube, ver in sorted(old_cubes))) + if not ASK.confirm('Versions mismatch: continue anyway ?', False): + raise ValueError('Unable to restore: versions do not match') table_chunks = {} for name in archive.namelist(): if not name.startswith('tables/'):