server/migractions.py
branchtls-sprint
changeset 1263 01152fffd593
parent 1036 593df4919845
parent 1262 abaadb570626
child 1398 5fe84a5f7035
equal deleted inserted replaced
1246:76b3cd5d4f31 1263:01152fffd593
    32 from cubicweb.common.migration import MigrationHelper, yes
    32 from cubicweb.common.migration import MigrationHelper, yes
    33 
    33 
    34 try:
    34 try:
    35     from cubicweb.server import schemaserial as ss
    35     from cubicweb.server import schemaserial as ss
    36     from cubicweb.server.utils import manager_userpasswd
    36     from cubicweb.server.utils import manager_userpasswd
    37     from cubicweb.server.sqlutils import sqlexec
    37     from cubicweb.server.sqlutils import sqlexec, SQL_PREFIX
    38 except ImportError: # LAX
    38 except ImportError: # LAX
    39     pass
    39     pass
    40 
    40 
       
    41 def set_sql_prefix(prefix):
       
    42     """3.1.5 migration function: allow to unset/reset SQL_PREFIX"""
       
    43     for module in ('checkintegrity', 'migractions', 'schemahooks',
       
    44                    'sources.rql2sql', 'sources.native'):
       
    45         try:
       
    46             sys.modules['cubicweb.server.%s' % module].SQL_PREFIX = prefix
       
    47             print 'changed SQL_PREFIX for %s' % module
       
    48         except KeyError:
       
    49             pass
       
    50         
       
    51 def update_database(repo):
       
    52     """3.1.3 migration function: update database schema by adding SQL_PREFIX to
       
    53     entity type tables and columns
       
    54     """
       
    55     pool = repo._get_pool()
       
    56     source = repo.system_source
       
    57     sqlcu = pool['system']
       
    58     for etype in repo.schema.entities():
       
    59         if etype.is_final():
       
    60             continue
       
    61         try:
       
    62             sqlcu.execute('ALTER TABLE %s RENAME TO cw_%s' % (etype, etype))
       
    63             print 'renamed %s table for source %s' % (etype, uri)
       
    64         except:
       
    65             pass
       
    66         for rschema in etype.subject_relations():
       
    67             if rschema == 'has_text':
       
    68                 continue
       
    69             if rschema.is_final() or rschema.inlined:
       
    70                 sqlcu.execute('ALTER TABLE cw_%s RENAME %s TO cw_%s'
       
    71                               % (etype, rschema, rschema))
       
    72                 print 'renamed %s.%s column for source %s' % (
       
    73                     etype, rschema, uri)
       
    74     pool.commit()
       
    75     repo._free_pool(pool)
       
    76 
       
    77         
    41 class ServerMigrationHelper(MigrationHelper):
    78 class ServerMigrationHelper(MigrationHelper):
    42     """specific migration helper for server side  migration scripts,
    79     """specific migration helper for server side  migration scripts,
    43     providind actions related to schema/data migration
    80     providind actions related to schema/data migration
    44     """
    81     """
    45 
    82 
    60         self.fs_schema = schema
    97         self.fs_schema = schema
    61         self._synchronized = set()
    98         self._synchronized = set()
    62 
    99 
    63     @cached
   100     @cached
    64     def repo_connect(self):
   101     def repo_connect(self):
    65         self.repo = get_repository(method='inmemory', config=self.config)
   102         try:
       
   103             self.repo = get_repository(method='inmemory', config=self.config)
       
   104         except:
       
   105             import traceback
       
   106             traceback.print_exc()
       
   107             print '3.1.5 migration'
       
   108             # XXX 3.1.5 migration
       
   109             set_sql_prefix('')
       
   110             self.repo = get_repository(method='inmemory', config=self.config)
       
   111             update_database(self.repo)
       
   112             set_sql_prefix('cw_')
    66         return self.repo
   113         return self.repo
    67     
   114     
    68     def shutdown(self):
   115     def shutdown(self):
    69         if self.repo is not None:
   116         if self.repo is not None:
    70             self.repo.shutdown()
   117             self.repo.shutdown()
   104                 if not answer:
   151                 if not answer:
   105                     raise SystemExit(1)
   152                     raise SystemExit(1)
   106                 if answer == 1: # 1: continue, 2: retry
   153                 if answer == 1: # 1: continue, 2: retry
   107                     break
   154                     break
   108             else:
   155             else:
       
   156                 from cubicweb.toolsutils import restrict_perms_to_user
   109                 print 'database backup:', backupfile
   157                 print 'database backup:', backupfile
       
   158                 restrict_perms_to_user(backupfile, self.info)
   110                 break
   159                 break
   111         
   160         
   112     def restore_database(self, backupfile, drop=True):
   161     def restore_database(self, backupfile, drop=True):
   113         config = self.config
   162         config = self.config
   114         source = config.sources()['system']
   163         source = config.sources()['system']
   192     
   241     
   193     @property
   242     @property
   194     @cached
   243     @cached
   195     def rqlcursor(self):
   244     def rqlcursor(self):
   196         """lazy rql cursor"""
   245         """lazy rql cursor"""
   197         return self.cnx.cursor(self.session)    
   246         # should not give session as cnx.cursor(), else we may try to execute
       
   247         # some query while no pool is set on the session (eg on entity attribute
       
   248         # access for instance)
       
   249         return self.cnx.cursor()
   198     
   250     
   199     def commit(self):
   251     def commit(self):
   200         if hasattr(self, '_cnx'):
   252         if hasattr(self, '_cnx'):
   201             self._cnx.commit()
   253             self._cnx.commit()
   202             
   254             
  1027         """low level method to create the sql table for an existing entity.
  1079         """low level method to create the sql table for an existing entity.
  1028         This may be useful on accidental desync between the repository schema
  1080         This may be useful on accidental desync between the repository schema
  1029         and a sql database
  1081         and a sql database
  1030         """
  1082         """
  1031         dbhelper = self.repo.system_source.dbhelper
  1083         dbhelper = self.repo.system_source.dbhelper
  1032         tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype))
  1084         tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype),
       
  1085                                prefix=SQL_PREFIX)
  1033         for sql in tablesql.split(';'):
  1086         for sql in tablesql.split(';'):
  1034             if sql.strip():
  1087             if sql.strip():
  1035                 self.sqlexec(sql)
  1088                 self.sqlexec(sql)
  1036         if commit:
  1089         if commit:
  1037             self.commit()
  1090             self.commit()