--- 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/'):