commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r7019 - in trunk/gnue-appserver/src: . classrep language


From: johannes
Subject: [gnue] r7019 - in trunk/gnue-appserver/src: . classrep language
Date: Sun, 13 Feb 2005 09:39:52 -0600 (CST)

Author: johannes
Date: 2005-02-13 09:39:50 -0600 (Sun, 13 Feb 2005)
New Revision: 7019

Modified:
   trunk/gnue-appserver/src/classrep/Base.py
   trunk/gnue-appserver/src/classrep/Class.py
   trunk/gnue-appserver/src/classrep/Module.py
   trunk/gnue-appserver/src/classrep/Parameter.py
   trunk/gnue-appserver/src/classrep/Procedure.py
   trunk/gnue-appserver/src/classrep/Property.py
   trunk/gnue-appserver/src/data.py
   trunk/gnue-appserver/src/geasSession.py
   trunk/gnue-appserver/src/geasSessionManager.py
   trunk/gnue-appserver/src/language/Object.py
   trunk/gnue-appserver/src/language/Procedure.py
   trunk/gnue-appserver/src/language/Session.py
Log:
Some (of the first) optimizations


Modified: trunk/gnue-appserver/src/classrep/Base.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Base.py   2005-02-12 23:29:37 UTC (rev 
7018)
+++ trunk/gnue-appserver/src/classrep/Base.py   2005-02-13 15:39:50 UTC (rev 
7019)
@@ -78,12 +78,16 @@
     This function fetches a list of all available items of the dictionaries
     table and merges them into the objectlist.
     """
+    gBeginFunc (6)
+
     rlist = self._session.find (self.table, self._getReloadCondition (),
                                             self._getSortorder (),
                                             self._getColumns ())
     self.mergeIntoList (rlist, idAsKey)
 
+    gEndFunc (6, hasResult = False)
 
+
   # ---------------------------------------------------------------------------
   # Merge a given object list with the dictionaries list
   # ---------------------------------------------------------------------------
@@ -94,6 +98,8 @@
     objectlist. If an object is new in the list, use _getNewItem () to build a
     new instance for the object.
     """
+    gBeginFunc (6)
+
     for obj in addList:
       found = 0
 
@@ -111,7 +117,9 @@
         key = idAsKey and newItem.gnue_id or newItem.fullName
         self [key] = newItem
 
+    gEndFunc (6, hasResult = False)
 
+
   # ---------------------------------------------------------------------------
   # Return the conditions to be used on reload ()
   # ---------------------------------------------------------------------------
@@ -121,6 +129,7 @@
     Descendants override this method to specify a condition for reloading all
     elements of the dictionary.
     """
+    gEndFunc (6, [])
     return []
 
 
@@ -132,9 +141,12 @@
     """
     Specify a list of fields to be fetched on a reload ().
     """
-    return [u'gnue_name']
+    result = [u'gnue_name']
+    gEndFunc (6, result)
 
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Return the sortorder to be used on reload ()
   # ---------------------------------------------------------------------------
@@ -143,9 +155,12 @@
     """
     Specify a list of fields used as sort-order.
     """
-    return [u'gnue_id']
+    result = [u'gnue_id']
+    gEndFunc (6, result)
 
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Get a condition to fetch a single item for the dictionary
   # ---------------------------------------------------------------------------
@@ -258,10 +273,12 @@
     found in the dictionary, it will be looked up via language interface. If
     it is not found in the datasource, an _itemNotFoundError will be raised.
     """
+
+    result = None
+
     if self.has_key (key):
-      return self._items [key.lower ()]
+      result = self._items [key.lower ()]
     else:
-      self._session.rollback ()
       list = self._session.find (self.table, self._getSingleCondition (key),
                                              self._getSortorder (),
                                              self._getColumns ())
@@ -275,11 +292,14 @@
           raise self._validationError (newItem, verr)
 
         self._items [key.lower ()] = newItem
-        return newItem
+        result = newItem
 
-    raise self._itemNotFoundError (key)
+    if result is None:
+      raise self._itemNotFoundError (key)
 
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Remove a key from the internal dictionary
   # ---------------------------------------------------------------------------
@@ -311,6 +331,7 @@
   # ---------------------------------------------------------------------------
 
   def __init__ (self, session, classname, aObject = None, pDefs = None):
+
     self.classname    = classname
     self._session     = session
 
@@ -322,17 +343,24 @@
         if key in ["gnue_length", "gnue_scale"]:
           if pDefs [key]:
             self.__predefined [key] = int (pDefs [key])
+            self.__dict__ [key] = int (pDefs [key])
           else:
+            self.__dict__ [key] = None
             self.__predefined [key] = None
+
         elif key in ["gnue_nullable"]:
           if pDefs [key] == "FALSE":
+            self.__dict__ [key] = False
             self.__predefined [key] = False
           else:
+            self.__dict__ [key] = True
             self.__predefined [key] = True
         else:
+          self.__dict__ [key] = pDefs [key]
           self.__predefined [key] = pDefs [key]
 
 
+
   # ---------------------------------------------------------------------------
   # Return an attributes value
   # ---------------------------------------------------------------------------
@@ -342,12 +370,15 @@
     If an attribute is not a 'predefined' value it is delegated to the language
     interface object of the instance.
     """
+
     if self.__predefined.has_key (attr):
-      return self.__predefined [attr]
+      result = self.__predefined [attr]
     else:
-      return getattr (self._getObject (), attr)
+      result = getattr (self._getObject (), attr)
 
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Get a language interface object
   # ---------------------------------------------------------------------------
@@ -357,12 +388,15 @@
     This function returns the corresponding language interface object of this
     instance. It will be created the first time this function is called.
     """
+
     if self.__object is None:
       self.__object = Object (self._session, self.classname, self.gnue_id)
 
-    return self.__object
+    result = self.__object
 
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Validate an instance
   # ---------------------------------------------------------------------------
@@ -385,11 +419,16 @@
     This function replaces all references to @aObject in it's predefined
     dictionary.
     """
+    gBeginFunc (6)
+
     for (key, value) in self.__predefined.items ():
       if isinstance (value, types.UnicodeType) and value == aObject.objectId:
+        self.__dict__ [key]     = aObject
         self.__predefined [key] = aObject
 
+    gEndFunc (6, hasResult = False)
 
+
   # ---------------------------------------------------------------------------
   # Complete an instance
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/classrep/Class.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Class.py  2005-02-12 23:29:37 UTC (rev 
7018)
+++ trunk/gnue-appserver/src/classrep/Class.py  2005-02-13 15:39:50 UTC (rev 
7019)
@@ -149,12 +149,15 @@
     all classes of the bound module, otherwise no condition is given.
     """
     if self.__module is not None:
-      return ['eq', ['field', u'gnue_module'],
+      result = ['eq', ['field', u'gnue_module'],
                     ['const', self.__module.gnue_id]]
     else:
-      return []
+      result = []
 
+    gEndFunc (6, result)
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Create a condition to retrieve the klass specified by 'key'
   # ---------------------------------------------------------------------------
@@ -189,7 +192,9 @@
     """
     Fields to be fetched on reloads.
     """
-    return [u"gnue_module", u"gnue_name", u"gnue_filter"]
+    result = [u"gnue_module", u"gnue_name", u"gnue_filter"]
+    gEndFunc (6, result)
+    return result
 
 
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/classrep/Module.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Module.py 2005-02-12 23:29:37 UTC (rev 
7018)
+++ trunk/gnue-appserver/src/classrep/Module.py 2005-02-13 15:39:50 UTC (rev 
7019)
@@ -140,6 +140,7 @@
     classes of this module will be created. All other attributes are delegated
     to the BaseObject's __getattr__ ().
     """
+
     if attr == 'classes':
       self.__dict__ ['classes'] = ClassDict (self._session, self.modules, self)
 
@@ -149,15 +150,17 @@
             self.classes [aClass.fullName] = aClass
       else:
         # Make sure the created class-dictionary is up to date
-        gDebug (2, "FORCE a classdict-reload through moduledict.classes ()")
+        gDebug (6, "FORCE a classdict-reload through moduledict.classes ()")
         self.classes.reload ()
 
-      return self.classes
+      result = self.classes
 
     else:
-      return BaseObject.__getattr__ (self, attr)
+      result = BaseObject.__getattr__ (self, attr)
 
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Validate a module
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/classrep/Parameter.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Parameter.py      2005-02-12 23:29:37 UTC 
(rev 7018)
+++ trunk/gnue-appserver/src/classrep/Parameter.py      2005-02-13 15:39:50 UTC 
(rev 7019)
@@ -66,11 +66,14 @@
 
   def _getReloadCondition (self):
     if self.__proc is not None:
-      return ['eq', ['field', u'gnue_procedure'], 
['const',self.__proc.gnue_id]]
+      result = ['eq', ['field', u'gnue_procedure'], 
['const',self.__proc.gnue_id]]
     else:
-      return []
+      result = []
 
+    gEndFunc (6, result)
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Get a condition to match a single parameter
   # ---------------------------------------------------------------------------
@@ -85,8 +88,10 @@
   # ---------------------------------------------------------------------------
 
   def _getColumns (self):
-    return [u"gnue_procedure", u"gnue_name", u"gnue_type", u"gnue_length",
+    result = [u"gnue_procedure", u"gnue_name", u"gnue_type", u"gnue_length",
             u"gnue_scale"]
+    gEndFunc (6, result)
+    return (result)
 
 
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/classrep/Procedure.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Procedure.py      2005-02-12 23:29:37 UTC 
(rev 7018)
+++ trunk/gnue-appserver/src/classrep/Procedure.py      2005-02-13 15:39:50 UTC 
(rev 7019)
@@ -76,11 +76,14 @@
   # ---------------------------------------------------------------------------
   def _getReloadCondition (self):
     if self.__class is not None:
-      return ['eq', ['field', u'gnue_class'], ['const', self.__class.gnue_id]]
+      result = ['eq', ['field', u'gnue_class'], ['const', 
self.__class.gnue_id]]
     else:
-      return []
+      result = []
 
+    gEndFunc (6, result)
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Get a condition to match a given procedure
   # ---------------------------------------------------------------------------
@@ -97,9 +100,11 @@
   # Get a list of columns to be prepared on a find () 
   # ---------------------------------------------------------------------------
   def _getColumns (self):
-    return [u"gnue_module", u"gnue_class", u"gnue_name", u"gnue_language",
+    result = [u"gnue_module", u"gnue_class", u"gnue_name", u"gnue_language",
             u"gnue_type", u"gnue_length", u"gnue_scale", u"gnue_comment",
             u"gnue_nullable"]
+    gEndFunc (result)
+    return result
 
   # ---------------------------------------------------------------------------
   # Create a key-not-found exception

Modified: trunk/gnue-appserver/src/classrep/Property.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Property.py       2005-02-12 23:29:37 UTC 
(rev 7018)
+++ trunk/gnue-appserver/src/classrep/Property.py       2005-02-13 15:39:50 UTC 
(rev 7019)
@@ -86,9 +86,11 @@
   # ---------------------------------------------------------------------------
   def _getReloadCondition (self):
     if self.__class is not None:
-      return ['eq', ['field', u'gnue_class'], ['const', self.__class.gnue_id]]
+      result = ['eq', ['field', u'gnue_class'], ['const', 
self.__class.gnue_id]]
     else:
-      return []
+      result = []
+    gEndFunc (6, result)
+    return result
 
 
   # ---------------------------------------------------------------------------
@@ -108,8 +110,10 @@
   # Return a list of columns to be prepared by a find ()
   # ---------------------------------------------------------------------------
   def _getColumns (self):
-    return [u"gnue_module", u"gnue_class", u"gnue_name", u"gnue_type",
+    result = [u"gnue_module", u"gnue_class", u"gnue_name", u"gnue_type",
             u"gnue_length", u"gnue_scale", u"gnue_comment", u"gnue_nullable"]
+    gEndFunc (6, result)
+    return result
 
 
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/data.py
===================================================================
--- trunk/gnue-appserver/src/data.py    2005-02-12 23:29:37 UTC (rev 7018)
+++ trunk/gnue-appserver/src/data.py    2005-02-13 15:39:50 UTC (rev 7019)
@@ -119,21 +119,16 @@
 
   def __has (self, table, row, field, dirty):
 
-    result = False
-
     if dirty:
       tables = self.__new
     else:
       tables = self.__old
 
-    if tables.has_key (table):
-      rows = tables [table]
-      if rows.has_key (row):
-        fields = rows [row]
-        if fields.has_key (field):
-          result = True
+    # We concatenate all has_key () checks so it can return as early as
+    # possible. The function is about 3 times faster than using normal if's
+    return tables.has_key (table) and tables [table].has_key (row) and \
+        tables [table][row].has_key (field)
 
-    return result
 
   # ---------------------------------------------------------------------------
   # Return whether a certain value is stored in the cache or not
@@ -149,11 +144,22 @@
     checktype (field, UnicodeType)
 
     if dirty is None:
-      return self.__has (table, row, field, True) or \
-             self.__has (table, row, field, False)
+      # We could use self.__has (), here but avoiding an additional function
+      # call here is a big deal regarding performance, as this function is
+      # called about 100000 times for a (quite small) classrepository
+      return (self.__old.has_key (table) and self.__old [table].has_key (row) \
+              and self.__old [table][row].has_key (field)) or \
+             (self.__new.has_key (table) and self.__new [table].has_key (row) \
+              and self.__new [table][row].has_key (field))
     else:
-      return self.__has (table, row, field, dirty)
+      if dirty:
+        tables = self.__new
+      else:
+        tables = self.__old
+      return tables.has_key (table) and tables [table].has_key (row) and \
+        tables [table][row].has_key (field)
 
+
   # ---------------------------------------------------------------------------
   # Read data from the cache
   # ---------------------------------------------------------------------------
@@ -883,6 +889,9 @@
     cancelChanges () function restores to this state.
     """
 
+    # Doing a deepcopy here is a 'no-go' for performance. If we're creating
+    # larger transaction (with a lot of records) this call will slow down
+    # everything with every record added.
     self.__confirmedCache   = copy.deepcopy (self.__cache)
     self.__confirmedInserts = self.__inserted [:]
     self.__confirmedDeletes = self.__deleted [:]

Modified: trunk/gnue-appserver/src/geasSession.py
===================================================================
--- trunk/gnue-appserver/src/geasSession.py     2005-02-12 23:29:37 UTC (rev 
7018)
+++ trunk/gnue-appserver/src/geasSession.py     2005-02-13 15:39:50 UTC (rev 
7019)
@@ -477,13 +477,13 @@
 
     table = classdef.table
     # Only query the main table here.  geasInstance.get will do the rest.
-    fieldlist = []
+    fields = {}
     for p in propertylist:
       pdef = classdef.properties [string.split (p, '.') [0]]
-      if not pdef.isCalculated and not pdef.column in fieldlist:
-        fieldlist.append (pdef.column)
+      if not fields.has_key (pdef.column) and not pdef.isCalculated:
+        fields [pdef.column] = True
 
-    record = self.__connection.findRecord (table, object_id, fieldlist)
+    record = self.__connection.findRecord (table, object_id, fields.keys ())
     if record is None:
       raise InstanceNotFoundError, (classdef.fullName, object_id)
 

Modified: trunk/gnue-appserver/src/geasSessionManager.py
===================================================================
--- trunk/gnue-appserver/src/geasSessionManager.py      2005-02-12 23:29:37 UTC 
(rev 7018)
+++ trunk/gnue-appserver/src/geasSessionManager.py      2005-02-13 15:39:50 UTC 
(rev 7019)
@@ -64,6 +64,11 @@
     self._modulepath  = modulepath or \
                         os.path.join (paths.data, "share", "gnue", "appserver")
 
+    #import profile
+    #prof = profile.Profile ()
+    #prof.runctx ('self.updateRepository (haltOnError = True)', globals (),
+        #locals ())
+    #prof.dump_stats ('appserver.profile')
     self.updateRepository (haltOnError = True)
 
     cfg = gConfigDict (section = 'appserver')
@@ -266,12 +271,12 @@
   def request (self, session_id, classname, conditions, sortorder,
                propertylist):
 
-    gBeginFunc ()
+    gBeginFunc (4)
 
     s = self._getSession (session_id)
     result = s.request (classname, conditions, sortorder, propertylist)
 
-    gEndFunc (1, result)
+    gEndFunc (4, result)
     return result
 
 
@@ -281,11 +286,11 @@
 
   def count (self, session_id, list_id):
 
-    gBeginFunc ()
+    gBeginFunc (4)
     s = self._getSession (session_id)
 
     result = s.count (list_id)
-    gEndFunc (1, result)
+    gEndFunc (4, result)
 
     return result
 
@@ -295,11 +300,11 @@
 
   def fetch (self, session_id, list_id, start, count, close = False):
 
-    gBeginFunc ()
+    gBeginFunc (4)
     s = self._getSession (session_id)
     result = s.fetch (list_id, start, count)
 
-    gEndFunc (1, result)
+    gEndFunc (4, result)
     return result
 
 
@@ -309,12 +314,12 @@
 
   def load (self, session_id, classname, obj_id_list, propertylist):
 
-    gBeginFunc ()
+    gBeginFunc (4)
 
     s = self._getSession (session_id)
     result = s.load (classname, obj_id_list, propertylist)
 
-    gEndFunc (1, result)
+    gEndFunc (4, result)
     return result
 
   # ---------------------------------------------------------------------------
@@ -323,11 +328,11 @@
 
   def store (self, session_id, classname, obj_id_list, propertylist, data):
 
-    gBeginFunc ()
+    gBeginFunc (4)
 
     s = self._getSession (session_id)
     result = s.store (classname, obj_id_list, propertylist, data)
-    gEndFunc (1, result)
+    gEndFunc (4, result)
 
     return result
 
@@ -337,12 +342,12 @@
 
   def delete (self, session_id, classname, obj_id_list):
 
-    gBeginFunc ()
+    gBeginFunc (4)
 
     s = self._getSession (session_id)
     s.delete (classname, obj_id_list)
 
-    gEndFunc (hasResult = False)
+    gEndFunc (4, hasResult = False)
 
 
   # ---------------------------------------------------------------------------
@@ -352,12 +357,12 @@
   def call (self, session_id, classname, obj_id_list, procedurename,
             parameters):
 
-    gBeginFunc ()
+    gBeginFunc (4)
 
     s = self._getSession (session_id)
     result = s.call (classname, obj_id_list, procedurename, parameters)
 
-    gEndFunc (1, result)
+    gEndFunc (4, result)
 
     return result
 
@@ -368,10 +373,10 @@
 
   def getFilters (self, language):
 
-    gBeginFunc ()
+    gBeginFunc (4)
 
     result = self._filter.getFilter (language)
 
-    gEndFunc (1, result)
+    gEndFunc (4, result)
 
     return result

Modified: trunk/gnue-appserver/src/language/Object.py
===================================================================
--- trunk/gnue-appserver/src/language/Object.py 2005-02-12 23:29:37 UTC (rev 
7018)
+++ trunk/gnue-appserver/src/language/Object.py 2005-02-13 15:39:50 UTC (rev 
7019)
@@ -51,74 +51,96 @@
 
   def __init__ (self, session, classname, objectId = None):
     # we won't trigger __setattr__ here ...
-    self.__dict__['objectId']          = objectId
-    self.__dict__['_Object__session']  = session
-    self.__dict__['_Object__class']    = classname
+    self.__dict__ ['objectId']          = objectId
+    self.__dict__ ['_Object__session']  = session
+    self.__dict__ ['_Object__class']    = classname
+    self.__dict__ ['_Object__sm']       = session.getSessionManager ()
+    self.__dict__ ['_Object__sid']      = session.getSessionId ()
+    self.__dict__ ['_Object__datatype'] = {}
 
     if self.objectId is None:
       # Create new object
-      sm   = self.__session.getSessionManager ()
-      sid  = self.__session.getSessionId ()
-
-      res = sm.store (sid, self.__class, [None], [], [[]])
+      res = self.__sm.store (self.__sid, self.__class, [None], [], [[]])
       self.objectId = res [0]
 
+    self.__dict__ ['gnue_id'] = self.objectId
 
+
   # -------------------------------------------------------------------------
   # Return an attribute's value; if not available in cache load from server
   # -------------------------------------------------------------------------
 
   def __getattr__ (self, attr):
+
+    gBeginFunc (6)
+
     name = self.__session.qualify (attr)
+
     if name == "gnue_id":
-      return self.objectId
+      result = self.objectId
+      gEndFunc (6, result)
+      return result
 
-    sm  = self.__session.getSessionManager ()
-    sid = self.__session.getSessionId ()
-
     try:
-      datatype = sm.load (sid, self.__class, [''], [name]) [0][0]
+      # TODO: move the datatype-dictionary into the session, but keep a
+      # per-instance pointer to it. This way we could reduce the amount of
+      # loads to a per-class/per-session minimum
+      if not self.__datatype.has_key (name):
+        self.__datatype [name] = self.__sm.load (self.__sid, self.__class,
+                                                 [''], [name]) [0][0]
+      datatype = self.__datatype [name]
 
     except KeyError:
       raise MemberNotFoundError, (self.__class, name)
 
     if datatype == 'procedure':
-      return Procedure (self.__session, self.objectId, self.__class, name)
+      result = Procedure (self.__session, self.objectId, self.__class, name)
 
     else:
-      res = sm.load (sid, self.__class, [self.objectId], [name])
+      res = self.__sm.load (self.__sid, self.__class, [self.objectId], [name])
       value = res [0][0]
 
       # Convert reference fields to object references
       if '_' in datatype and value is not None:
-        return Object (self.__session, datatype, value)
+        result = Object (self.__session, datatype, value)
 
       elif value is None:
         if '_' in datatype:
-          return NullObject (self.__session, datatype)
+          result = NullObject (self.__session, datatype)
         else:
-          return None
+          result = None
 
       else:
-        return value
+        result = value
 
+    gEndFunc (6, result)
+    return result
 
+
   # -------------------------------------------------------------------------
   # Set an attribute's value
   # -------------------------------------------------------------------------
 
   def __setattr__ (self, attr, value):
 
+    gBeginFunc (6)
+
     if self.__dict__.has_key (attr):
       self.__dict__ [attr] = value
+      # Make sure to keep in sync between objectId and gnue_id
+      if attr == 'objectId':
+        self.__dict__ ['gnue_id'] = value
+      elif attr == 'gnue_id':
+        self.__dict__ ['objectId'] = value
 
-    else:
+    if not self.__dict__.has_key (attr) or attr == 'gnue_id':
       name = self.__session.qualify (attr)
-      sm   = self.__session.getSessionManager ()
-      sid  = self.__session.getSessionId ()
 
       try:
-        datatype = sm.load (sid, self.__class, [''], [name]) [0][0]
+        if not self.__datatype.has_key (name):
+          self.__datatype [name] = self.__sm.load (self.__sid, self.__class,
+                                                   [''], [name]) [0][0]
+        datatype = self.__datatype [name]
 
       except KeyError:
         raise MemberNotFoundError, (self.__class, name)
@@ -132,14 +154,18 @@
       else:
         __value = value
 
-      sm.store (sid, self.__class, [self.objectId], [name], [[__value]])
+      self.__sm.store (self.__sid, self.__class, [self.objectId], [name],
+                       [[__value]])
 
+    gEndFunc (6, hasResult = False)
 
+
   # -------------------------------------------------------------------------
   # Return the Object-ID as string representation
   # -------------------------------------------------------------------------
 
   def __str__ (self):
+
     if self.objectId:
       return self.objectId
     else:
@@ -151,6 +177,7 @@
   # -------------------------------------------------------------------------
 
   def __repr__ (self):
+
     if self.objectId:
       return '<%s instance with id %s>' % (self.__class, self.objectId)
     else:
@@ -162,8 +189,11 @@
   # -------------------------------------------------------------------------
 
   def __getitem__ (self, item):
+
     return self.__getattr__ (item)
+
   def __setitem__ (self, item, value):
+
     self.__setattr__ (item, value)
 
 
@@ -181,11 +211,16 @@
   # -------------------------------------------------------------------------
 
   def delete (self):
-    self.__session.getSessionManager ().delete (
-               self.__session.getSessionId (), self.__class, [self.objectId])
+
+    gBeginFunc (6)
+
+    self.__sm.delete (self.__sid, self.__class, [self.objectId])
     self.objectId = None
 
+    gEndFunc (6, hasResult = False)
 
+
+
 # =============================================================================
 # Class implementing None values for reference-properties
 # =============================================================================
@@ -198,8 +233,11 @@
 
   def __init__ (self, session, classname):
 
-    self.__session = session
-    self.__class   = classname
+    self.__session  = session
+    self.__class    = classname
+    self.__sm       = session.getSessionManager ()
+    self.__sid      = session.getSessionId ()
+    self.__datatype = {}
 
 
   # ---------------------------------------------------------------------------
@@ -216,18 +254,22 @@
     @return: self for reference properties, None for non-reference properties.
     """
 
-    sm   = self.__session.getSessionManager ()
-    sid  = self.__session.getSessionId ()
+    gBeginFunc (6)
+
     name = self.__session.qualify (attr)
-    datatype = sm.load (sid, self.__class, [''], [name]) [0][0]
-
-    if '_' in datatype:
-      self.__class = datatype
-      return self
+    if not self.__datatype.has_key (name):
+      self.__datatype [name] = self.__sm.load (self.__sid, self.__class,
+                                               [''], [name]) [0][0]
+    if '_' in self.__datatype [name]:
+      self.__class = self.__datatype [name]
+      result = self
     else:
-      return None
+      result = None
 
+    gEndFunc (6, result)
+    return result
 
+
   # ---------------------------------------------------------------------------
   # Truth-test
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/language/Procedure.py
===================================================================
--- trunk/gnue-appserver/src/language/Procedure.py      2005-02-12 23:29:37 UTC 
(rev 7018)
+++ trunk/gnue-appserver/src/language/Procedure.py      2005-02-13 15:39:50 UTC 
(rev 7019)
@@ -40,8 +40,12 @@
   # Delegate calls of this object to the session manager
   # ---------------------------------------------------------------------------
   def __call__ (self, **params):
+    gBeginFunc (6)
+
     sm  = self.__session.getSessionManager ()
     sid = self.__session.getSessionId ()
 
-    return sm.call (sid, self.__class, [self.__objectId], self.method,
+    result = sm.call (sid, self.__class, [self.__objectId], self.method,
                     params) [0]
+    gEndFunc (6, result)
+    return result

Modified: trunk/gnue-appserver/src/language/Session.py
===================================================================
--- trunk/gnue-appserver/src/language/Session.py        2005-02-12 23:29:37 UTC 
(rev 7018)
+++ trunk/gnue-appserver/src/language/Session.py        2005-02-13 15:39:50 UTC 
(rev 7019)
@@ -79,63 +79,95 @@
   # Ensure the given name is fully qualified using the current context
   # -------------------------------------------------------------------------
   def qualify (self, name):
+
     if '_' in name:
-      return name
+      result = name
     else:
       if self.__context is None:
         raise NoContextError (name)
       else:
-        return "%s_%s" % (self.__context, name)
+        result = "%s_%s" % (self.__context, name)
 
+    return result
 
+
   # -------------------------------------------------------------------------
   # Close the session 
   # -------------------------------------------------------------------------
   def close (self):
+
+    gBeginFunc (6)
+
     if self.__sm is not None:
       self.__sm.close (self.__session_id, None)
       self.__sm = self.__session_id = None
 
+    gEndFunc (6, hasResult = False)
+
+
   # -------------------------------------------------------------------------
   # Commit the current transaction
   # -------------------------------------------------------------------------
   def commit (self):
+
+    gBeginFunc (6)
+
     if self.__session_id is not None:
       self.__sm.commit (self.__session_id)
 
+    gEndFunc (6, hasResult = False)
+
+
   # -------------------------------------------------------------------------
   # Revoke the current transaction
   # -------------------------------------------------------------------------
   def rollback (self):
+
+    gBeginFunc (6)
+
     if self.__session_id is not None:
       self.__sm.rollback (self.__session_id)
 
+    gEndFunc (6, hasResult = False)
+
   # -------------------------------------------------------------------------
   # Return a collection of 'classname' matching the given arguments
   # -------------------------------------------------------------------------
   def find (self, classname, conditions = None,
             sortorder = [('gnue_id', False)], properties = []):
-    return ObjectList (self, self.qualify (classname), conditions, sortorder,
+
+    gBeginFunc (6)
+    result = ObjectList (self, self.qualify (classname), conditions, sortorder,
                        properties)
+    gEndFunc (6, result)
+    return result
 
   # -------------------------------------------------------------------------
   # Create a new instance of classname
   # -------------------------------------------------------------------------
   def new (self, classname):
-    return Object (self, self.qualify (classname))
 
+    gBeginFunc (6)
+    result = Object (self, self.qualify (classname))
+    gEndFunc (6, result)
+    return result
 
+
   # -------------------------------------------------------------------------
   # Get a message from the message catalogue
   # -------------------------------------------------------------------------
 
   def message (self, messageName, *args):
+
+    gBeginFunc (6)
+
     languages = ['C']
     current = self.parameters.get ('_language', 'C')
     if '_' in current:
       add = current.split ('_') [0]
       if not add in languages:
         languages.insert (0, add)
+
     if not current in languages:
       languages.insert (0, current)
 
@@ -158,6 +190,7 @@
           else:
             text = text % args
 
+        gEndFunc (6, text)
         return text
 
     raise MessageNotFoundError, self.qualify (messageName)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]