server/migractions.py
changeset 3720 5376aaadd16b
parent 3659 993997b4b41d
parent 3715 e3ccadb126d7
child 3890 d7a270f50f54
--- a/server/migractions.py	Thu Oct 15 11:20:26 2009 +0200
+++ b/server/migractions.py	Mon Oct 19 15:16:41 2009 +0200
@@ -54,6 +54,7 @@
     def __init__(self, config, schema, interactive=True,
                  repo=None, cnx=None, verbosity=1, connect=True):
         MigrationHelper.__init__(self, config, interactive, verbosity)
+        # no config on shell to a remote instance
         if not interactive:
             assert cnx
             assert repo
@@ -61,7 +62,8 @@
             assert repo
             self._cnx = cnx
             self.repo = repo
-            self.session.data['rebuild-infered'] = False
+            if config is not None:
+                self.session.data['rebuild-infered'] = False
         elif connect:
             self.repo_connect()
         if not schema:
@@ -93,7 +95,7 @@
                 self.backup_database(askconfirm=False)
         super(ServerMigrationHelper, self).migrate(vcconf, toupgrade, options)
 
-    def process_script(self, migrscript, funcname=None, *args, **kwargs):
+    def cmd_process_script(self, migrscript, funcname=None, *args, **kwargs):
         """execute a migration script
         in interactive mode,  display the migration script path, ask for
         confirmation and execute it if confirmed
@@ -103,7 +105,7 @@
                 if self.execscript_confirm(migrscript):
                     sqlexec(open(migrscript).read(), self.session.system_sql)
             else:
-                return super(ServerMigrationHelper, self).process_script(
+                return super(ServerMigrationHelper, self).cmd_process_script(
                     migrscript, funcname, *args, **kwargs)
             self.commit()
         except:
@@ -233,7 +235,10 @@
 
     @property
     def session(self):
-        return self.repo._get_session(self.cnx.sessionid)
+        if self.config is not None:
+            return self.repo._get_session(self.cnx.sessionid)
+        # no access to session on remote instance
+        return None
 
     def commit(self):
         if hasattr(self, '_cnx'):
@@ -255,7 +260,8 @@
                         'sql': self.sqlexec,
                         'rql': self.rqlexec,
                         'rqliter': self.rqliter,
-                        'schema': self.repo.schema,
+                        'schema': self.repo.get_schema(),
+                        'cnx': self.cnx,
                         'fsschema': self.fs_schema,
                         'session' : self.session,
                         'repo' : self.repo,
@@ -268,8 +274,7 @@
     @cached
     def group_mapping(self):
         """cached group mapping"""
-        self.session.set_pool()
-        return ss.group_mapping(self.session)
+        return ss.group_mapping(self._cw)
 
     def exec_event_script(self, event, cubepath=None, funcname=None,
                           *args, **kwargs):
@@ -289,7 +294,7 @@
             self.confirm = yes
             self.execscript_confirm = yes
             try:
-                return self.process_script(apc, funcname, *args, **kwargs)
+                return self.cmd_process_script(apc, funcname, *args, **kwargs)
             finally:
                 self.confirm = confirm
                 self.execscript_confirm = execscript_confirm
@@ -306,7 +311,7 @@
             return
         newrschema = self.fs_schema[ertype]
         teid = self.repo.schema[ertype].eid
-        if 'update' in newrschema.ACTIONS or newrschema.is_final():
+        if 'update' in newrschema.ACTIONS or newrschema.final:
             # entity type
             exprtype = u'ERQLExpression'
         else:
@@ -643,7 +648,7 @@
             # XXX (syt) plz explain: if we're adding an entity type, it should
             # not be there...
             eschema = instschema[etype]
-            if eschema.is_final():
+            if eschema.final:
                 instschema.del_entity_type(etype)
         else:
             eschema = self.fs_schema.eschema(etype)
@@ -686,7 +691,7 @@
                         if role == 'subject':
                             subjschema = spschema
                             objschema = tschema
-                            if rschema.final and instspschema.has_subject_relation(rschema):
+                            if rschema.final and rschema in instspschema.subjrels:
                                 # attribute already set, has_rdef would check if
                                 # it's of the same type, we don't want this so
                                 # simply skip here
@@ -852,7 +857,7 @@
         """unregister an existing relation definition"""
         rschema = self.repo.schema.rschema(rtype)
         # unregister the definition from CWAttribute or CWRelation
-        if rschema.is_final():
+        if rschema.final:
             etype = 'CWAttribute'
         else:
             etype = 'CWRelation'
@@ -981,7 +986,6 @@
 
          :rtype: `Workflow`
         """
-        self.session.set_pool() # ensure pool is set
         wf = self.cmd_create_entity('Workflow', name=unicode(name),
                                     **kwargs)
         if not isinstance(wfof, (list, tuple)):
@@ -1001,7 +1005,6 @@
 
     # XXX remove once cmd_add_[state|transition] are removed
     def _get_or_create_wf(self, etypes):
-        self.session.set_pool() # ensure pool is set
         if not isinstance(etypes, (list, tuple)):
             etypes = (etypes,)
         rset = self.rqlexec('Workflow X WHERE X workflow_of ET, ET name %(et)s',
@@ -1041,16 +1044,14 @@
         """set or add (if `reset` is False) groups and conditions for a
         transition
         """
-        self.session.set_pool() # ensure pool is set
-        tr = self.session.entity_from_eid(treid)
+        tr = self._cw.entity_from_eid(treid)
         tr.set_transition_permissions(requiredgroups, conditions, reset)
         if commit:
             self.commit()
 
     @deprecated('[3.5] use entity.fire_transition("transition") or entity.change_state("state")')
     def cmd_set_state(self, eid, statename, commit=False):
-        self.session.set_pool() # ensure pool is set
-        self.session.entity_from_eid(eid).change_state(statename)
+        self._cw.entity_from_eid(eid).change_state(statename)
         if commit:
             self.commit()
 
@@ -1074,11 +1075,18 @@
 
     # other data migration commands ###########################################
 
-    def cmd_create_entity(self, etype, *args, **kwargs):
+    @property
+    def _cw(self):
+        session = self.session
+        if session is not None:
+            session.set_pool()
+            return session
+        return self.cnx.request()
+
+    def cmd_create_entity(self, etype, **kwargs):
         """add a new entity of the given type"""
         commit = kwargs.pop('commit', False)
-        self.session.set_pool()
-        entity = self.session.create_entity(etype, *args, **kwargs)
+        entity = self._cw.create_entity(etype, **kwargs)
         if commit:
             self.commit()
         return entity
@@ -1114,7 +1122,6 @@
         if not isinstance(rql, (tuple, list)):
             rql = ( (rql, kwargs), )
         res = None
-        self.session.set_pool()
         for rql, kwargs in rql:
             if kwargs:
                 msg = '%s (%s)' % (rql, kwargs)
@@ -1122,7 +1129,7 @@
                 msg = rql
             if not ask_confirm or self.confirm('execute rql: %s ?' % msg):
                 try:
-                    res = self.session.execute(rql, kwargs, cachekey)
+                    res = self._cw.execute(rql, kwargs, cachekey)
                 except Exception, ex:
                     if self.confirm('error: %s\nabort?' % ex):
                         raise
@@ -1211,9 +1218,8 @@
         if self.ask_confirm:
             if not self._h.confirm('execute rql: %s ?' % msg):
                 raise StopIteration
-        self._h.session.set_pool()
         try:
-            rset = self._h.session.execute(rql, kwargs)
+            rset = self._h._cw.execute(rql, kwargs)
         except Exception, ex:
             if self._h.confirm('error: %s\nabort?' % ex):
                 raise