commit-gnue
[Top][All Lists]
Advanced

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

r6822 - in trunk/gnue-appserver/src: . language


From: johannes
Subject: r6822 - in trunk/gnue-appserver/src: . language
Date: Fri, 24 Dec 2004 08:23:47 -0600 (CST)

Author: johannes
Date: 2004-12-24 08:23:45 -0600 (Fri, 24 Dec 2004)
New Revision: 6822

Modified:
   trunk/gnue-appserver/src/geasList.py
   trunk/gnue-appserver/src/language/App.py
   trunk/gnue-appserver/src/language/Object.py
   trunk/gnue-appserver/src/language/ObjectList.py
   trunk/gnue-appserver/src/language/Session.py
   trunk/gnue-appserver/src/language/test.py
Log:
Fixed geasList.count () to work in all situations. Language interface
application is now using the RPC interface


Modified: trunk/gnue-appserver/src/geasList.py
===================================================================
--- trunk/gnue-appserver/src/geasList.py        2004-12-23 20:24:25 UTC (rev 
6821)
+++ trunk/gnue-appserver/src/geasList.py        2004-12-24 14:23:45 UTC (rev 
6822)
@@ -47,7 +47,7 @@
     self.__isComplete = False
     self.__dsSorting  = dsSort          # sorted by datasource 
     self.__asSorting  = asSort          # additional sortorder of this list
-    self.__isClosed   = False
+    self.__length     = 0
 
 
 
@@ -166,8 +166,9 @@
       return instance
 
     else:
+      self.__length = len (self.__instances)
       self.__recordset.close ()
-      self.__isClosed = True
+      self.__recordset = None
       return None
 
 
@@ -212,7 +213,10 @@
       self.__fillupFunc (0)
       return len (self.__instances)
     else:
-      return self.__recordset.count ()
+      if self.__recordset is None:
+        return self.__length
+      else:
+        return self.__recordset.count ()
 
 
   # ---------------------------------------------------------------------------
@@ -247,8 +251,9 @@
     maintained by the list.
     """
 
-    if not self.__isClosed:
+    if self.__recordset is not None:
       self.__recordset.close ()
+      self.__recordset = None
 
     self.__instances  = []
     self.__unsorted   = []

Modified: trunk/gnue-appserver/src/language/App.py
===================================================================
--- trunk/gnue-appserver/src/language/App.py    2004-12-23 20:24:25 UTC (rev 
6821)
+++ trunk/gnue-appserver/src/language/App.py    2004-12-24 14:23:45 UTC (rev 
6822)
@@ -21,9 +21,9 @@
 #
 # $Id$
 
-from gnue.common.apps import GClientApp, i18n
-from gnue.common.datasources import GLoginHandler
-from gnue.appserver import geasSessionManager
+from gnue.common.rpc import client
+from gnue.common.apps import GClientApp
+
 import Session
 
 # =============================================================================
@@ -33,28 +33,49 @@
 class App (GClientApp.GClientApp):
 
   # ---------------------------------------------------------------------------
-  # Initialize
+  # Constructor
   # ---------------------------------------------------------------------------
 
-  def __init__ (self, database = None):
-    if database is not None:
-      defs = [{'Name': 'database', 'Default': database}]
-    else:
-      defs = None
+  def __init__ (self, connections = None, application = 'appserver',
+      defaults = None):
 
-    GClientApp.GClientApp.__init__ (self, application = 'appserver',
-        defaults = defs)
+    self.addCommandOption ('connection', 'c', argument='name',
+        default = "gnue",
+        help = _("Connect to the appserver using the connection <name>"))
 
-    self.connections.setLoginHandler (myLoginHandler ())
-    self._sm = geasSessionManager.geasSessionManager (self.connections)
+    GClientApp.GClientApp.__init__ (self, connections, application, defaults)
 
+    self._sm = self.__getSessionManager ()
+
+
+  # ---------------------------------------------------------------------------
+  # Create a new language interface session (LoginSession)
+  # ---------------------------------------------------------------------------
+
   def newSession (self, username, password):
+
     return Session.LoginSession (self._sm, username, password)
 
-# =============================================================================
-# Login Handler
-# =============================================================================
 
-class myLoginHandler (GLoginHandler.LoginHandler):
-  def getLogin (self, *arguments):
-    return {'_username': 'gnue', '_password': None}
+  # ---------------------------------------------------------------------------
+  # Create a new connection to the application server's session manager
+  # ---------------------------------------------------------------------------
+
+  def __getSessionManager (self):
+    """
+    This function uses the parameters specified by the given connection and
+    connects to the appserver's session manager via rpc.
+
+    @return: Session Manager
+    """
+
+    connection = self.connections.getConnection (self.OPTIONS ['connection'])
+    cparams    = connection.parameters
+
+    rpctype = cparams.get ('rpctype', 'xmlrpc')
+    params  = {'host'     : cparams.get ('host', 'localhost'),
+               'port'     : cparams.get ('port', 8765),
+               'transport': cparams.get ('transport', 'http')}
+
+    server = client.attach (rpctype, params)
+    return server.request ('Session')

Modified: trunk/gnue-appserver/src/language/Object.py
===================================================================
--- trunk/gnue-appserver/src/language/Object.py 2004-12-23 20:24:25 UTC (rev 
6821)
+++ trunk/gnue-appserver/src/language/Object.py 2004-12-24 14:23:45 UTC (rev 
6822)
@@ -161,16 +161,16 @@
   # -------------------------------------------------------------------------
   def __attrIsValid (self, attr):
     name = self.__session.qualify (attr)
-    cdef = self.__session.getSessionManager ().classes [self.__class]
-    return cdef.properties.has_key (name)
+    cDef = self.__session.getClassDef (self.__class)
+    return name in cDef ['properties']
 
   # -------------------------------------------------------------------------
   # Check if 'attr' is a valid procedure of this class
   # -------------------------------------------------------------------------
   def __attrIsMethod (self, attr):
     name = self.__session.qualify (attr)
-    cdef = self.__session.getSessionManager ().classes [self.__class]
-    return cdef.procedures.has_key (name)
+    cDef = self.__session.getClassDef (self.__class)
+    return name in cDef ['procedures']
 
 
   # -------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/language/ObjectList.py
===================================================================
--- trunk/gnue-appserver/src/language/ObjectList.py     2004-12-23 20:24:25 UTC 
(rev 6821)
+++ trunk/gnue-appserver/src/language/ObjectList.py     2004-12-24 14:23:45 UTC 
(rev 6822)
@@ -42,13 +42,14 @@
 
     self.__session   = session
     self.__list      = []
+    self.__list_id   = None
 
     self.__buildList ()
 
 
-  # -------------------------------------------------------------------------
+  # ---------------------------------------------------------------------------
   # Return the number of elements in this sequence
-  # -------------------------------------------------------------------------
+  # ---------------------------------------------------------------------------
 
   def __len__ (self):
 

Modified: trunk/gnue-appserver/src/language/Session.py
===================================================================
--- trunk/gnue-appserver/src/language/Session.py        2004-12-23 20:24:25 UTC 
(rev 6821)
+++ trunk/gnue-appserver/src/language/Session.py        2004-12-24 14:23:45 UTC 
(rev 6822)
@@ -57,6 +57,9 @@
     self.__context    = None
     self.parameters   = params
 
+    self.__classdefs  = {}
+    self.__modules    = {}
+
   # -------------------------------------------------------------------------
   # Get the session's sessionManager
   # -------------------------------------------------------------------------
@@ -162,6 +165,103 @@
     raise MessageNotFoundError, self.qualify (messageName)
 
 
+  # ---------------------------------------------------------------------------
+  # Get a 'class-definition' for a given class
+  # ---------------------------------------------------------------------------
+
+  def getClassDef (self, classname):
+    """
+    This function returns a 'class-definition' for a given class. Such a
+    class-definition is a dictionary with two keys: 'properties' and
+    'procedures' where both values are sequences of names.
+
+    @param classname: name of the class to get a definition-dictionary for
+    @return: dictionary with the class-definition
+    """
+
+    classname = self.qualify (classname)
+    if self.__classdefs.has_key (classname):
+      return self.__classdefs [classname]
+
+    result = {'properties': [], 'procedures': []}
+    self.__classdefs [classname] = result
+
+    # An internal Session is used only by the appserver process. To avoid
+    # any recursions, we use the class-repository directly
+    if isinstance (self, InternalSession):
+      cDef = self.__sm.classes [classname]
+      result ['properties'] = [p.fullName for p in cDef.properties.values ()]
+      result ['procedures'] = [p.fullName for p in cDef.procedures.values ()]
+
+    else:
+      # otherwise we fetch all properties and procedures from the appserver
+      (module, name) = classname.split ('_')
+      moduleId = self.__findModule (module)
+      classId  = self.__findClass (moduleId, name)
+
+      result ['properties'] = self.__fetchData ('property' , moduleId, classId)
+      result ['procedures'] = self.__fetchData ('procedure', moduleId, classId)
+
+    return result
+
+  def __fetchData (self, tablename, moduleId, classId):
+
+    result = []
+    listId = self.__sm.request (self.__session_id, "gnue_%s" % tablename,
+                    {'gnue_module': moduleId, 'gnue_class': classId},
+                    [], ['gnue_name', 'gnue_module'])
+
+    while True:
+      res = self.__sm.fetch (self.__session_id, listId, len (result), 20, 0)
+      if len (res):
+        for (gnueId, pName, pModule) in res:
+          mName = self.__moduleName (pModule)
+          iName = "%s_%s" % (mName, pName)
+          result.append (iName)
+      else:
+        break
+
+    return result
+
+  def __findModule (self, moduleName):
+
+    for (gnueId, name) in self.__modules.items ():
+      if name == moduleName:
+        return gnueId
+
+    lid = self.__sm.request (self.__session_id, 'gnue_module',
+        {'gnue_name': moduleName}, [], [])
+    res = self.__sm.fetch (self.__session_id, lid, 0, 10, 0)
+    if res:
+      key = res [0][0]
+      self.__modules [key] = moduleName
+    else:
+      key = None
+
+    return key
+
+  def __moduleName (self, moduleId):
+
+    if self.__modules.has_key (moduleId):
+      return self.__modules [moduleId]
+
+    lid = self.__sm.request (self.__session_id, 'gnue_module',
+        {'gnue_id': moduleId}, [], ['gnue_name'])
+    res = self.__sm.feth (self.__session_id, lid, 0, 10, 0)
+    if res:
+      self.__modules [moduleId] = res [0][1]
+
+    return self.__modules.get (moduleId)
+
+
+  def __findClass (self, moduleId, classname):
+
+    lid = self.__sm.request (self.__session_id, 'gnue_class',
+        {'gnue_module': moduleId, 'gnue_name': classname}, [], [])
+    res = self.__sm.fetch (self.__session_id, lid, 0, 10, 0)
+    return len (res) and res [0][0] or None
+
+
 # =============================================================================
 # Login-Session creates a new Session-Id using 'user' and 'password'
 # =============================================================================

Modified: trunk/gnue-appserver/src/language/test.py
===================================================================
--- trunk/gnue-appserver/src/language/test.py   2004-12-23 20:24:25 UTC (rev 
6821)
+++ trunk/gnue-appserver/src/language/test.py   2004-12-24 14:23:45 UTC (rev 
6822)
@@ -32,12 +32,17 @@
 
   print "fetching all persons..."
   session.setcontext ('address')
-  list = session.find ('person', sortorder = ['address_name'],
+
+  print "running the find ..."
+  persons = session.find ('person', sortorder = ['address_name'],
                        properties = ['address_name', 'address_street'])
 
-  print 'Found %d instances.' % len (list)
+  if persons:
+    print "has a match!"
 
-  for person in list:
+  print 'Found %d instances.' % len (persons)
+
+  for person in persons:
     print '-' * 79
     print 'Name   : %s' % repr (person.name)
     print 'Street : %s' % repr (person.address_street)





reply via email to

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