server/migractions.py
branchtls-sprint
changeset 1477 b056a49c16dc
parent 1414 448c9802d7df
parent 1278 10fa95dd91ab
child 1790 a3e2b079de00
--- a/server/migractions.py	Fri Apr 24 16:48:38 2009 +0200
+++ b/server/migractions.py	Fri Apr 24 17:04:14 2009 +0200
@@ -40,7 +40,7 @@
 except ImportError: # LAX
     pass
 
-        
+
 class ServerMigrationHelper(MigrationHelper):
     """specific migration helper for server side  migration scripts,
     providind actions related to schema/data migration
@@ -67,11 +67,11 @@
     def repo_connect(self):
         self.repo = get_repository(method='inmemory', config=self.config)
         return self.repo
-    
+
     def shutdown(self):
         if self.repo is not None:
             self.repo.shutdown()
-        
+
     def rewrite_vcconfiguration(self):
         """write current installed versions (of cubicweb software
         and of each used cube) into the database
@@ -81,7 +81,7 @@
             pkgversion = self.config.cube_version(pkg)
             self.cmd_set_property('system.version.%s' % pkg.lower(), pkgversion)
         self.commit()
-        
+
     def backup_database(self, backupfile=None, askconfirm=True):
         config = self.config
         source = config.sources()['system']
@@ -113,7 +113,7 @@
                 print 'database backup:', backupfile
                 restrict_perms_to_user(backupfile, self.info)
                 break
-        
+
     def restore_database(self, backupfile, drop=True):
         config = self.config
         source = config.sources()['system']
@@ -139,7 +139,7 @@
                     else:
                         break
             print 'database restored'
-        
+
     def migrate(self, vcconf, toupgrade, options):
         if not options.fs_only:
             if options.backup_db is None:
@@ -147,7 +147,7 @@
             elif options.backup_db:
                 self.backup_database(askconfirm=False)
         super(ServerMigrationHelper, self).migrate(vcconf, toupgrade, options)
-    
+
     def process_script(self, migrscript, funcname=None, *args, **kwargs):
         """execute a migration script
         in interactive mode,  display the migration script path, ask for
@@ -159,7 +159,7 @@
         else:
             return super(ServerMigrationHelper, self).process_script(
                 migrscript, funcname, *args, **kwargs)
-        
+
     @property
     def cnx(self):
         """lazy connection"""
@@ -194,7 +194,7 @@
     @property
     def session(self):
         return self.repo._get_session(self.cnx.sessionid)
-    
+
     @property
     @cached
     def rqlcursor(self):
@@ -203,15 +203,15 @@
         # some query while no pool is set on the session (eg on entity attribute
         # access for instance)
         return self.cnx.cursor()
-    
+
     def commit(self):
         if hasattr(self, '_cnx'):
             self._cnx.commit()
-            
+
     def rollback(self):
         if hasattr(self, '_cnx'):
             self._cnx.rollback()
-                   
+
     def rqlexecall(self, rqliter, cachekey=None, ask_confirm=True):
         for rql, kwargs in rqliter:
             self.rqlexec(rql, kwargs, cachekey, ask_confirm)
@@ -238,9 +238,9 @@
     def group_mapping(self):
         """cached group mapping"""
         return ss.group_mapping(self.rqlcursor)
-        
+
     def exec_event_script(self, event, cubepath=None, funcname=None,
-                          *args, **kwargs):            
+                          *args, **kwargs):
         if cubepath:
             apc = join(cubepath, 'migration', '%s.py' % event)
         else:
@@ -265,9 +265,9 @@
                     self.repo.hm.register_hook(setowner_after_add_entity,
                                                'after_add_entity', '')
                     self.reactivate_verification_hooks()
-    
+
     # schema synchronization internals ########################################
-    
+
     def _synchronize_permissions(self, ertype):
         """permission synchronization for an entity or relation type"""
         if ertype in ('eid', 'has_text', 'identity'):
@@ -332,17 +332,17 @@
                                  {'expr': expr, 'exprtype': exprtype,
                                   'vars': expression.mainvars, 'x': teid}, 'x',
                                  ask_confirm=False)
-        
+
     def _synchronize_rschema(self, rtype, syncrdefs=True, syncperms=True):
         """synchronize properties of the persistent relation schema against its
         current definition:
-        
+
         * description
         * symetric, meta
         * inlined
         * relation definitions if `syncrdefs`
         * permissions if `syncperms`
-        
+
         physical schema changes should be handled by repository's schema hooks
         """
         rtype = str(rtype)
@@ -360,11 +360,11 @@
                 self._synchronize_rdef_schema(subj, rschema, obj)
         if syncperms:
             self._synchronize_permissions(rtype)
-                
+
     def _synchronize_eschema(self, etype, syncperms=True):
         """synchronize properties of the persistent entity schema against
         its current definition:
-        
+
         * description
         * internationalizable, fulltextindexed, indexed, meta
         * relations from/to this entity
@@ -458,7 +458,7 @@
             self.rqlexecall(ss.constraint2rql(rschema, subjtype, objtype,
                                               newcstr),
                             ask_confirm=confirm)
-            
+
     # base actions ############################################################
 
     def checkpoint(self):
@@ -468,7 +468,7 @@
 
     def cmd_add_cube(self, cube, update_database=True):
         self.cmd_add_cubes( (cube,), update_database)
-    
+
     def cmd_add_cubes(self, cubes, update_database=True):
         """update_database is telling if the database schema should be updated
         or if only the relevant eproperty should be inserted (for the case where
@@ -507,13 +507,13 @@
                 # check we should actually add the relation definition
                 if not (fromtype in new or totype in new or rschema in new):
                     continue
-                self.cmd_add_relation_definition(str(fromtype), rschema.type, 
+                self.cmd_add_relation_definition(str(fromtype), rschema.type,
                                                  str(totype))
         # execute post-create files
         for pack in reversed(newcubes):
             self.exec_event_script('postcreate', self.config.cube_dir(pack))
-            self.commit()        
-                
+            self.commit()
+
     def cmd_remove_cube(self, cube):
         removedcubes = super(ServerMigrationHelper, self).cmd_remove_cube(cube)
         if not removedcubes:
@@ -532,8 +532,8 @@
             if not eschema in removedcubes_schema and eschema in reposchema:
                 self.cmd_drop_entity_type(eschema.type)
         for rschema in fsschema.relations():
-            if rschema in removedcubes_schema and rschema in reposchema: 
-                # check if attributes/relations has been added to entities from 
+            if rschema in removedcubes_schema and rschema in reposchema:
+                # check if attributes/relations has been added to entities from
                 # other cubes
                 for fromtype, totype in rschema.iter_rdefs():
                     if not removedcubes_schema[rschema.type].has_rdef(fromtype, totype) and \
@@ -546,19 +546,19 @@
             self.rqlexec('DELETE CWProperty X WHERE X pkey %(pk)s',
                          {'pk': u'system.version.'+pack}, ask_confirm=False)
             self.commit()
-            
+
     # schema migration actions ################################################
-    
+
     def cmd_add_attribute(self, etype, attrname, attrtype=None, commit=True):
         """add a new attribute on the given entity type"""
         if attrtype is None:
             rschema = self.fs_schema.rschema(attrname)
             attrtype = rschema.objects(etype)[0]
         self.cmd_add_relation_definition(etype, attrname, attrtype, commit=commit)
-        
+
     def cmd_drop_attribute(self, etype, attrname, commit=True):
         """drop an existing attribute from the given entity type
-        
+
         `attrname` is a string giving the name of the attribute to drop
         """
         rschema = self.repo.schema.rschema(attrname)
@@ -567,7 +567,7 @@
 
     def cmd_rename_attribute(self, etype, oldname, newname, commit=True):
         """rename an existing attribute of the given entity type
-        
+
         `oldname` is a string giving the name of the existing attribute
         `newname` is a string giving the name of the renamed attribute
         """
@@ -583,10 +583,10 @@
             rql += ', NOT X %s NULL' % oldname
         self.rqlexec(rql, ask_confirm=self.verbosity>=2)
         self.cmd_drop_attribute(etype, oldname, commit=commit)
-            
+
     def cmd_add_entity_type(self, etype, auto=True, commit=True):
         """register a new entity type
-        
+
         in auto mode, automatically register entity's relation where the
         targeted type is known
         """
@@ -624,7 +624,7 @@
             for rschema in eschema.subject_relations():
                 # attribute relation have already been processed and
                 # 'owned_by'/'created_by' will be automatically added
-                if rschema.final or rschema.type in ('owned_by', 'created_by', 'is', 'is_instance_of'): 
+                if rschema.final or rschema.type in ('owned_by', 'created_by', 'is', 'is_instance_of'):
                     continue
                 rtypeadded = rschema.type in applschema
                 for targetschema in rschema.objects(etype):
@@ -667,10 +667,10 @@
                                     ask_confirm=confirm)
         if commit:
             self.commit()
-                
+
     def cmd_drop_entity_type(self, etype, commit=True):
         """unregister an existing entity type
-        
+
         This will trigger deletion of necessary relation types and definitions
         """
         # XXX what if we delete an entity type which is specialized by other types
@@ -682,7 +682,7 @@
 
     def cmd_rename_entity_type(self, oldname, newname, commit=True):
         """rename an existing entity type in the persistent schema
-        
+
         `oldname` is a string giving the name of the existing entity type
         `newname` is a string giving the name of the renamed entity type
         """
@@ -690,7 +690,7 @@
                      {'newname' : unicode(newname), 'oldname' : oldname})
         if commit:
             self.commit()
-        
+
     def cmd_add_relation_type(self, rtype, addrdef=True, commit=True):
         """register a new relation type named `rtype`, as described in the
         schema description file.
@@ -700,7 +700,7 @@
         implies an intermediate "commit" which commits the relation type
         creation (but not the relation definitions themselves, for which
         committing depends on the `commit` argument value).
-        
+
         """
         rschema = self.fs_schema.rschema(rtype)
         # register the relation into CWRType and insert necessary relation
@@ -716,7 +716,7 @@
                             ask_confirm=self.verbosity>=2)
         if commit:
             self.commit()
-        
+
     def cmd_drop_relation_type(self, rtype, commit=True):
         """unregister an existing relation type"""
         # unregister the relation from CWRType
@@ -724,10 +724,10 @@
                      ask_confirm=self.verbosity>=2)
         if commit:
             self.commit()
-        
+
     def cmd_rename_relation(self, oldname, newname, commit=True):
         """rename an existing relation
-        
+
         `oldname` is a string giving the name of the existing relation
         `newname` is a string giving the name of the renamed relation
         """
@@ -747,7 +747,7 @@
                         ask_confirm=self.verbosity>=2)
         if commit:
             self.commit()
-        
+
     def cmd_drop_relation_definition(self, subjtype, rtype, objtype, commit=True):
         """unregister an existing relation definition"""
         rschema = self.repo.schema.rschema(rtype)
@@ -762,12 +762,12 @@
                      ask_confirm=self.verbosity>=2)
         if commit:
             self.commit()
-        
+
     def cmd_sync_schema_props_perms(self, ertype=None, syncperms=True,
                                     syncprops=True, syncrdefs=True, commit=True):
         """synchronize the persistent schema against the current definition
         schema.
-        
+
         It will synch common stuff between the definition schema and the
         actual persistent schema, it won't add/remove any entity or relation.
         """
@@ -794,7 +794,7 @@
                     self._synchronize_permissions(etype)
         if commit:
             self.commit()
-                
+
     def cmd_change_relation_props(self, subjtype, rtype, objtype,
                                   commit=True, **kwargs):
         """change some properties of a relation definition
@@ -824,8 +824,8 @@
         """set change size constraint of a string attribute
 
         if size is None any size constraint will be removed.
-        
-        you usually want to use sync_schema_props_perms instead.        
+
+        you usually want to use sync_schema_props_perms instead.
         """
         oldvalue = None
         for constr in self.repo.schema.eschema(etype).constraints(rtype):
@@ -861,9 +861,9 @@
     @obsolete('use sync_schema_props_perms(ertype, syncprops=False)')
     def cmd_synchronize_permissions(self, ertype, commit=True):
         self.cmd_sync_schema_props_perms(ertype, syncprops=False, commit=commit)
-    
+
     # Workflows handling ######################################################
-    
+
     def cmd_add_state(self, name, stateof, initial=False, commit=False, **kwargs):
         """method to ease workflow definition: add a state for one or more
         entity type(s)
@@ -881,7 +881,7 @@
         if commit:
             self.commit()
         return stateeid
-    
+
     def cmd_add_transition(self, name, transitionof, fromstates, tostate,
                            requiredgroups=(), conditions=(), commit=False, **kwargs):
         """method to ease workflow definition: add a transition for one or more
@@ -938,7 +938,7 @@
         entity.change_state(entity.wf_state(statename).eid)
         if commit:
             self.commit()
-        
+
     # CWProperty handling ######################################################
 
     def cmd_property_value(self, pkey):
@@ -958,7 +958,7 @@
                          {'k': pkey, 'v': value}, ask_confirm=False)
 
     # other data migration commands ###########################################
-        
+
     def cmd_add_entity(self, etype, *args, **kwargs):
         """add a new entity of the given type"""
         rql = 'INSERT %s X' % etype
@@ -978,10 +978,10 @@
         if commit:
             self.commit()
         return eid
-    
+
     def sqlexec(self, sql, args=None, ask_confirm=True):
         """execute the given sql if confirmed
-        
+
         should only be used for low level stuff undoable with existing higher
         level actions
         """
@@ -999,7 +999,7 @@
             except:
                 # no result to fetch
                 return
-    
+
     def rqlexec(self, rql, kwargs=None, cachekey=None, ask_confirm=True):
         """rql action"""
         if not isinstance(rql, (tuple, list)):
@@ -1026,7 +1026,7 @@
 
     def cmd_reactivate_verification_hooks(self):
         self.repo.hm.reactivate_verification_hooks()
-        
+
     # broken db commands ######################################################
 
     def cmd_change_attribute_type(self, etype, attr, newtype, commit=True):
@@ -1049,7 +1049,7 @@
         self.sqlexec(sql, ask_confirm=False)
         if commit:
             self.commit()
-        
+
     def cmd_add_entity_type_table(self, etype, commit=True):
         """low level method to create the sql table for an existing entity.
         This may be useful on accidental desync between the repository schema
@@ -1063,7 +1063,7 @@
                 self.sqlexec(sql)
         if commit:
             self.commit()
-            
+
     def cmd_add_relation_type_table(self, rtype, commit=True):
         """low level method to create the sql table for an existing relation.
         This may be useful on accidental desync between the repository schema
@@ -1076,7 +1076,7 @@
                 self.sqlexec(sql)
         if commit:
             self.commit()
-            
+
 
 class ForRqlIterator:
     """specific rql iterator to make the loop skipable"""
@@ -1086,10 +1086,10 @@
         self.kwargs = kwargs
         self.ask_confirm = ask_confirm
         self._rsetit = None
-        
+
     def __iter__(self):
         return self
-    
+
     def next(self):
         if self._rsetit is not None:
             return self._rsetit.next()