cubicweb/server/sources/native.py
changeset 11129 97095348b3ee
parent 11127 6464edfa95bb
parent 11087 35b29f1eb37a
child 11135 421520f4d516
equal deleted inserted replaced
11128:9b4de34ad394 11129:97095348b3ee
    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)