commit-gnue
[Top][All Lists]
Advanced

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

r5037 - in trunk/gnue-appserver: samples src/classrep src/language


From: johannes
Subject: r5037 - in trunk/gnue-appserver: samples src/classrep src/language
Date: Fri, 23 Jan 2004 05:34:53 -0600 (CST)

Author: johannes
Date: 2004-01-23 05:34:51 -0600 (Fri, 23 Jan 2004)
New Revision: 5037

Modified:
   trunk/gnue-appserver/samples/sample.gsd
   trunk/gnue-appserver/src/classrep/test.py
   trunk/gnue-appserver/src/language/Object.py
   trunk/gnue-appserver/src/language/ObjectList.py
   trunk/gnue-appserver/src/language/test.py
Log:
Implemented object references in language interface.


Modified: trunk/gnue-appserver/samples/sample.gsd
===================================================================
--- trunk/gnue-appserver/samples/sample.gsd     2004-01-22 09:43:20 UTC (rev 
5036)
+++ trunk/gnue-appserver/samples/sample.gsd     2004-01-23 11:34:51 UTC (rev 
5037)
@@ -11,6 +11,7 @@
         <field name="address_street" length="35" type="string"/>
         <field name="address_zip" length="17" type="string"/>
         <field name="address_city" length="35" type="string"/>
+        <field name="address_country" length="32" type="string"/>
         <field name="address_children" type="number" length="2"/>
         <field name="address_weight" type="number" length="4" precision="1"/>
         <field name="address_born" type="date"/>
@@ -24,6 +25,18 @@
         <pkfield name="gnue_id"/>
       </primarykey>
     </table>
+    <table name="address_country">
+      <fields>
+        <field name="gnue_id" length="32" type="string" nullable="N"/>
+        <field name="address_code" length="2" type="string"/>
+        <field name="address_name" length="60" type="string"/>
+      </fields>
+      <constraints/>
+      <indexes/>
+      <primarykey name="address_country_gnue_id_pk">
+        <pkfield name="gnue_id"/>
+      </primarykey>
+    </table>
   </tables>
   <data>
     <tabledata name="sample_module" tablename="gnue_module">
@@ -43,6 +56,12 @@
           <value>'person'</value>
           <value>'Person'</value>
         </row>
+        <row>
+          <value>'00000000000000000000000000001020'</value>
+          <value>'00000000000000000000000000001000'</value>
+          <value>'country'</value>
+          <value>'Country'</value>
+        </row>
       </rows>
     </tabledata>
     <tabledata name="sample_properties" tablename="gnue_property">
@@ -101,6 +120,16 @@
           <value>'00000000000000000000000000001016'</value>
           <value>'00000000000000000000000000001010'</value>
           <value>'00000000000000000000000000001000'</value>
+          <value>'country'</value>
+          <value>'address_country'</value>
+          <value>'32'</value>
+          <value>'0'</value>
+          <value>'Country where the person lives'</value>
+        </row>
+        <row>
+          <value>'00000000000000000000000000001017'</value>
+          <value>'00000000000000000000000000001010'</value>
+          <value>'00000000000000000000000000001000'</value>
           <value>'children'</value>
           <value>'number'</value>
           <value>'2'</value>
@@ -108,7 +137,7 @@
           <value>'Number of children'</value>
         </row>
         <row>
-          <value>'00000000000000000000000000001017'</value>
+          <value>'00000000000000000000000000001018'</value>
           <value>'00000000000000000000000000001010'</value>
           <value>'00000000000000000000000000001000'</value>
           <value>'weight'</value>
@@ -118,7 +147,7 @@
           <value>'Weight of the person in kg'</value>
         </row>
         <row>
-          <value>'00000000000000000000000000001018'</value>
+          <value>'00000000000000000000000000001019'</value>
           <value>'00000000000000000000000000001010'</value>
           <value>'00000000000000000000000000001000'</value>
           <value>'born'</value>
@@ -128,7 +157,7 @@
           <value>'Birthday'</value>
         </row>
         <row>
-          <value>'00000000000000000000000000001019'</value>
+          <value>'0000000000000000000000000000101A'</value>
           <value>'00000000000000000000000000001010'</value>
           <value>'00000000000000000000000000001000'</value>
           <value>'meettime'</value>
@@ -138,7 +167,7 @@
           <value>'Preferred time for meetings'</value>
         </row>
         <row>
-          <value>'0000000000000000000000000000101A'</value>
+          <value>'0000000000000000000000000000101B'</value>
           <value>'00000000000000000000000000001010'</value>
           <value>'00000000000000000000000000001000'</value>
           <value>'lastmeeting'</value>
@@ -148,7 +177,7 @@
           <value>'Date and time of the last meeting'</value>
         </row>
         <row>
-          <value>'0000000000000000000000000000101B'</value>
+          <value>'0000000000000000000000000000101C'</value>
           <value>'00000000000000000000000000001010'</value>
           <value>'00000000000000000000000000001000'</value>
           <value>'human'</value>
@@ -157,6 +186,36 @@
           <value>'0'</value>
           <value>'Whether the person is human or not'</value>
         </row>
+        <row>
+          <value>'00000000000000000000000000001021'</value>
+          <value>'00000000000000000000000000001020'</value>
+          <value>'00000000000000000000000000000000'</value>
+          <value>'id'</value>
+          <value>'id'</value>
+          <value>'0'</value>
+          <value>'0'</value>
+          <value>'Object ID'</value>
+        </row>
+        <row>
+          <value>'00000000000000000000000000001022'</value>
+          <value>'00000000000000000000000000001020'</value>
+          <value>'00000000000000000000000000001000'</value>
+          <value>'code'</value>
+          <value>'string'</value>
+          <value>'2'</value>
+          <value>'0'</value>
+          <value>'ISO-Country code'</value>
+        </row>
+        <row>
+          <value>'00000000000000000000000000001023'</value>
+          <value>'00000000000000000000000000001020'</value>
+          <value>'00000000000000000000000000001000'</value>
+          <value>'name'</value>
+          <value>'string'</value>
+          <value>'35'</value>
+          <value>'0'</value>
+          <value>'The name of the country'</value>
+        </row>
       </rows>
     </tabledata>
     <tabledata name="sample_persons" tablename="address_person">
@@ -167,6 +226,7 @@
           <value>'Enterprise Road 17'</value>
           <value>'2002'</value>
           <value>'Gnutown'</value>
+          <value>'00000000000000000000002000000002'</value>
           <value>'1'</value>
           <value>'85.4'</value>
           <value>'2233-03-21'</value>
@@ -180,6 +240,7 @@
           <value>'Vulc Lane 1'</value>
           <value>'4711'</value>
           <value>'Vulcane'</value>
+          <value>'00000000000000000000002000000001'</value>
           <value>'0'</value>
           <value>'78.8'</value>
           <value>'2230-01-01'</value>
@@ -189,19 +250,33 @@
         </row>
       </rows>
     </tabledata>
+    <tabledata name="sample_countries" tablename="address_country">
+      <rows>
+        <row>
+          <value>'00000000000000000000002000000001'</value>
+          <value>'AT'</value>
+          <value>'�sterreich'</value>
+        </row>
+        <row>
+          <value>'00000000000000000000002000000002'</value>
+          <value>'DE'</value>
+          <value>'Deutschland'</value>
+        </row>
+      </rows>
+    </tabledata>
     <tabledata name="sample_accounts" tablename="gnue_useraccess">
       <rows>
         <row>
           <value>'00000000000000000000001000000001'</value>
           <value>'test'</value>
           <value>'test'</value>
-          <value>'address_person'</value>
+          <value>'address_person,address_country'</value>
         </row>
         <row>
           <value>'00000000000000000000001000000002'</value>
           <value>'hacker'</value>
           <value>'secret'</value>
-          <value>'address_person,gnue_module,gnue_class,gnue_property'</value>
+          
<value>'address_person,address_country,gnue_module,gnue_class,gnue_property'</value>
         </row>
       </rows>
     </tabledata>

Modified: trunk/gnue-appserver/src/classrep/test.py
===================================================================
--- trunk/gnue-appserver/src/classrep/test.py   2004-01-22 09:43:20 UTC (rev 
5036)
+++ trunk/gnue-appserver/src/classrep/test.py   2004-01-23 11:34:51 UTC (rev 
5037)
@@ -40,6 +40,10 @@
 print "Classes in 'address':"
 for k in m.classes.keys ():
   print k
+  cl = m.classes [k]
+  for p in cl.properties.keys ():
+    print cl.fullName + "." + p
+  print "-" * 50
 
 print "Number of modules: %d\n" % len (sm.modules)
 

Modified: trunk/gnue-appserver/src/language/Object.py
===================================================================
--- trunk/gnue-appserver/src/language/Object.py 2004-01-22 09:43:20 UTC (rev 
5036)
+++ trunk/gnue-appserver/src/language/Object.py 2004-01-23 11:34:51 UTC (rev 
5037)
@@ -33,49 +33,6 @@
 # Helper methods
 # ===========================================================================
 
-# ---------------------------------------------------------------------------
-# Convert RPC transportable datatype into native Python object
-# ---------------------------------------------------------------------------
-
-def rpc_to_native (value, type):
-
-  # Empty strings indicate None
-  if value == '':
-    return None
-
-  # String: convert to unicode
-  elif type [:7] == 'string(':
-    return unicode (value, 'utf-8')
-
-  # Date: convert to mx.DateTime object
-  elif type == 'date':
-    return mx.DateTime.ISO.ParseDate (value)
-
-  # Time: convert to mx.DateTime object
-  elif type == 'time':
-    return mx.DateTime.ISO.ParseTime (value)
-
-  # DateTime: convert to mx.DateTime object
-  elif type == 'datetime':
-    return mx.DateTime.ISO.ParseDateTime (value)
-
-  # All others (id, number, boolean, reference): no need to convert
-  else:
-    return value
-
-# ---------------------------------------------------------------------------
-# Convert native Python object into RPC transportable datatype
-# ---------------------------------------------------------------------------
-
-def native_to_rpc (value):
-
-  if value is None:
-    return ''
-  elif isinstance (value, types.UnicodeType):
-    return value.encode ('utf-8')
-  else:
-    return str (value)
-
 # ===========================================================================
 # Implements a single business object
 # ===========================================================================
@@ -97,19 +54,32 @@
     if objData:
       self.objectId = objData ['gnue_id']
 
-      # transfer all data from objData to the initial cache
-      for key in objData.keys ():
-        self._cache [key] = objData [key]
+      if len (objData) > 1:
+        # figure out what types the attributes in objData have
+        plist = objData.keys ()
+        plist.sort ()
+        res = self._server.load (self._session_id, self._class, [''], plist)
 
+        # NOTE: in Python 2.3 we would use the enumerate () builtin :)
+        pix = 0
+        for key in plist:
+          self._cache [key] = self.rpc_to_native (objData [key], res [0] [pix])
+          pix += 1
+
+
   # -------------------------------------------------------------------------
   # Return an attribute's value; if not available in cache load from server
   # -------------------------------------------------------------------------
   def __getattr__ (self, attr):
     if not self._cache.has_key (attr):
       if self._attrIsValid (attr):
-       res = self._server.load (self._session_id, self._class, 
-                                [self.objectId, ''], [attr])
-       self._cache [attr] = rpc_to_native (res [0] [0], res [1] [0])
+        if self.objectId:
+         res = self._server.load (self._session_id, self._class, 
+                                  [self.objectId, ''], [attr])
+         self._cache [attr] = self.rpc_to_native (res [0] [0], res [1] [0])
+        else:
+          res = self._server.load (self._session_id, self._class, [''], [attr])
+          self._cache [attr] = self.rpc_to_native (None, res [0] [0])
       else:
         raise AttributeError, attr
 
@@ -129,16 +99,72 @@
       self._cache [attr] = value
 
   # -------------------------------------------------------------------------
+  # Return the Object-ID as string representation
+  # -------------------------------------------------------------------------
+  # TODO: check if using __repr__() instead is a better solution
+  def __str__ (self):
+    return self.objectId
+
+
+  # -------------------------------------------------------------------------
   # Check if 'attr' is a valid attribute of this class
   # -------------------------------------------------------------------------
   def _attrIsValid (self, attr):
-    # TODO: ask the class repository for the attribute
-    # meanwhile we suppose all attributes are valid 
-    return 1
+    return self._server.classes [self._class].properties.has_key (attr)
 
 
+  # -------------------------------------------------------------------------
+  # Get an apropriate default value for type
+  # -------------------------------------------------------------------------
+  def _defaultValue (self, type):
+    # NOTE: we assume None to be default value for all types
+    return None
 
   # -------------------------------------------------------------------------
+  # Convert RPC transportable type into native python object
+  # -------------------------------------------------------------------------
+  def rpc_to_native (self, value, type):
+    # Empty strings indicate a default value
+    if value == '':
+      return self._defaultValue (type)
+
+    # String: convert to unicode
+    elif type [:7] == 'string(':
+      return unicode (value, 'utf-8')
+
+    # Date: convert to mx.DateTime object
+    elif type == 'date':
+      return mx.DateTime.ISO.ParseDate (value)
+
+    # Time: convert to mx.DateTime object
+    elif type == 'time':
+      return mx.DateTime.ISO.ParseTime (value)
+
+    # DateTime: convert to mx.DateTime object
+    elif type == 'datetime':
+      return mx.DateTime.ISO.ParseDateTime (value)
+
+    # id, number and boolean: no need to convert
+    elif type in ['id', 'boolean'] or type [:6] == 'number':
+      return value
+
+    # All others (should be reference-type)
+    else:
+      return Object (self._server, self._session_id, type, {'gnue_id': value})
+
+  # -------------------------------------------------------------------------
+  # Convert native Python object into RPC transportable datatype
+  # -------------------------------------------------------------------------
+  def native_to_rpc (self, value):
+    if value is None:
+      return ''
+    elif isinstance (value, types.UnicodeType):
+      return value.encode ('utf-8')
+    else:
+      return str (value)
+
+
+  # -------------------------------------------------------------------------
   # Store this instance 
   # -------------------------------------------------------------------------
   def store (self):
@@ -150,7 +176,7 @@
       if key == 'gnue_id': 
        continue
       prop.append (key)
-      data.append (native_to_rpc (self._cache[key]))
+      data.append (self.native_to_rpc (self._cache [key]))
 
     res = self._server.store (self._session_id, self._class, [self.objectId],
                               prop, [data])
@@ -162,3 +188,4 @@
   def delete (self):
     self._server.delete (self._session_id, self._class, [self.objectId])
     self.objectId = None
+

Modified: trunk/gnue-appserver/src/language/ObjectList.py
===================================================================
--- trunk/gnue-appserver/src/language/ObjectList.py     2004-01-22 09:43:20 UTC 
(rev 5036)
+++ trunk/gnue-appserver/src/language/ObjectList.py     2004-01-23 11:34:51 UTC 
(rev 5037)
@@ -22,7 +22,7 @@
 # $Id: ObjectList.py,v 1.7 2003/10/19 17:55:56 reinhard Exp $
 
 import types
-from Object import newObject, rpc_to_native
+from Object import newObject
 
 CACHE_STEP = 10
 
@@ -99,15 +99,13 @@
   def _populateCache (self):
     rset = self._server.fetch (self._session_id, self.list_id, 
                                len (self._cache), CACHE_STEP, 0)    
-    types = self._server.load (self._session_id, self.classname, [''],
-                               self.properties)
     for row in rset:
       ## Convert array into dictonary
       i = 0
       objData = {}
 
       for p in self.properties:
-        objData [p] = rpc_to_native (row [i+1], types [0] [i])
+        objData [p] = row [i+1]
         i += 1
         
       objData ["gnue_id"] = row [0]

Modified: trunk/gnue-appserver/src/language/test.py
===================================================================
--- trunk/gnue-appserver/src/language/test.py   2004-01-22 09:43:20 UTC (rev 
5036)
+++ trunk/gnue-appserver/src/language/test.py   2004-01-23 11:34:51 UTC (rev 
5037)
@@ -37,7 +37,15 @@
   print 'Name: ' + repr (person.address_name)
   print 'Street: ' + repr (person.address_street)
   print 'City: ' + repr (person.address_city)
+  print 'Country: ' + repr (person.address_country.address_name)
   print 'Number of Children: ' + repr (person.address_children)
   print 'Weight: ' + repr (person.address_weight)
   print 'Born: ' + repr (person.address_born)
   print 'Human: ' + repr (person.address_human)
+
+
+ap = session.new ('address_person')
+ap.address_name = 'Mr. X'
+
+ap.store ()
+session.commit ()





reply via email to

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