[Top][All Lists]
[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 ()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- r5037 - in trunk/gnue-appserver: samples src/classrep src/language,
johannes <=