server/migractions.py
changeset 1251 af40e615dc89
parent 1240 6a9f621e07cc
child 1262 abaadb570626
equal deleted inserted replaced
1250:5c20a7f13c84 1251:af40e615dc89
    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                 if isinstance(source, SQLiteAbstractSource):
       
    71                     sqlcu.execute('ALTER TABLE cw_%s ADD COLUMN cw_%s'
       
    72                                   % (etype, rschema))
       
    73                     sqlcu.execute('UPDATE cw_%s SET %s=cw_%s'
       
    74                                   % (etype, rschema, rschema))
       
    75                     print 'added %s.cw_%s column for source %s' % (
       
    76                         etype, rschema, uri)
       
    77                 else:
       
    78                     sqlcu.execute('ALTER TABLE cw_%s RENAME %s TO cw_%s'
       
    79                                   % (etype, rschema, rschema))
       
    80                     print 'renamed %s.%s column for source %s' % (
       
    81                         etype, rschema, uri)
       
    82     pool.commit()
       
    83     repo._free_pool(pool)
       
    84 
       
    85         
    41 class ServerMigrationHelper(MigrationHelper):
    86 class ServerMigrationHelper(MigrationHelper):
    42     """specific migration helper for server side  migration scripts,
    87     """specific migration helper for server side  migration scripts,
    43     providind actions related to schema/data migration
    88     providind actions related to schema/data migration
    44     """
    89     """
    45 
    90 
    60         self.fs_schema = schema
   105         self.fs_schema = schema
    61         self._synchronized = set()
   106         self._synchronized = set()
    62 
   107 
    63     @cached
   108     @cached
    64     def repo_connect(self):
   109     def repo_connect(self):
    65         self.repo = get_repository(method='inmemory', config=self.config)
   110         try:
       
   111             self.repo = get_repository(method='inmemory', config=self.config)
       
   112         except:
       
   113             import traceback
       
   114             traceback.print_exc()
       
   115             print '3.1.5 migration'
       
   116             # XXX 3.1.5 migration
       
   117             set_sql_prefix('')
       
   118             self.repo = get_repository(method='inmemory', config=self.config)
       
   119             update_database(self.repo)
       
   120             set_sql_prefix('cw_')
    66         return self.repo
   121         return self.repo
    67     
   122     
    68     def shutdown(self):
   123     def shutdown(self):
    69         if self.repo is not None:
   124         if self.repo is not None:
    70             self.repo.shutdown()
   125             self.repo.shutdown()
  1032         """low level method to create the sql table for an existing entity.
  1087         """low level method to create the sql table for an existing entity.
  1033         This may be useful on accidental desync between the repository schema
  1088         This may be useful on accidental desync between the repository schema
  1034         and a sql database
  1089         and a sql database
  1035         """
  1090         """
  1036         dbhelper = self.repo.system_source.dbhelper
  1091         dbhelper = self.repo.system_source.dbhelper
  1037         tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype))
  1092         tablesql = eschema2sql(dbhelper, self.repo.schema.eschema(etype),
       
  1093                                prefix=SQL_PREFIX)
  1038         for sql in tablesql.split(';'):
  1094         for sql in tablesql.split(';'):
  1039             if sql.strip():
  1095             if sql.strip():
  1040                 self.sqlexec(sql)
  1096                 self.sqlexec(sql)
  1041         if commit:
  1097         if commit:
  1042             self.commit()
  1098             self.commit()