commit-gnue
[Top][All Lists]
Advanced

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

r5194 - trunk/gnue-common/src/datasources/drivers/appserver/appserver


From: reinhard
Subject: r5194 - trunk/gnue-common/src/datasources/drivers/appserver/appserver
Date: Sat, 28 Feb 2004 18:22:17 -0600 (CST)

Author: reinhard
Date: 2004-02-28 18:22:16 -0600 (Sat, 28 Feb 2004)
New Revision: 5194

Modified:
   trunk/gnue-common/src/datasources/drivers/appserver/appserver/Connection.py
Log:
Changed all RPC calls to be absolutely Unicode safe.


Modified: 
trunk/gnue-common/src/datasources/drivers/appserver/appserver/Connection.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/appserver/appserver/Connection.py 
2004-02-28 20:50:46 UTC (rev 5193)
+++ trunk/gnue-common/src/datasources/drivers/appserver/appserver/Connection.py 
2004-02-29 00:22:16 UTC (rev 5194)
@@ -49,6 +49,18 @@
 from DataObject import DataObject
 from gnue.common.datasources.drivers.appserver.Schema.Discovery.Introspection 
import Introspection
 
+# Translate Unicode to String. Called for every string parameter passed to RPC.
+# Works for lists, recursively.
+def _toString (value):
+  if type (value) == types.ListType:
+    return [_toString (x) for x in value]
+  elif type (value) == types.UnicodeType:
+    return value.encode ('utf-8')
+  elif type (value) == types.TupleType:
+    (x, y) = value
+    return (_toString (x), _toString (y))
+  else:
+    return value
 
 # TODO: move all non standart Connection functions (request, ...) into a 
subobject native
 #       to prevent namespace conflicts
@@ -108,11 +120,21 @@
     return self._updateCursor
 
   def request(self,table,filter,sort,fieldlist,unicodeMode=0):
-    listid = self._sm.request(self._sess_id,table,filter,sort,fieldlist)
+    s_table     = _toString (table)
+    s_filter    = _toString (filter)
+    s_sort      = _toString (sort)
+    s_fieldlist = _toString (fieldlist)
+    listid = self._sm.request (self._sess_id, s_table, s_filter, s_sort,
+                               s_fieldlist)
     return Appserver_ListCursor(self,listid,table,fieldlist,unicodeMode)
 
   def call(self,classname,obj_id_list,methodname,parameters):
-    self._sm.call(self._sess_id,classname,obj_id_list,methodname,parameters)
+    s_classname   = _toString (classname)
+    s_obj_id_list = _toString (obj_id_list)
+    s_methodname  = _toString (methodname)
+    s_parameters  = _toString (parameters)
+    self._sm.call (self._sess_id, s_classname, s_obj_id_list, s_methodname,
+                   s_parameters)
 
   def commit (self):
     self._updateCursor.execute ()
@@ -150,8 +172,11 @@
     self._fieldlist=fieldlist
     self._stackpos=0
     self._unicodeMode=unicodeMode
+
+    s_classname = _toString (classname)
+    s_fieldlist = _toString (self._fieldlist)
     self._fieldtypes = self._dataCon._sm.load (self._dataCon._sess_id,
-                                               classname, [''], 
self._fieldlist)
+                                               s_classname, [''], s_fieldlist)
     self._fieldtypes = self._fieldtypes [0]
 
   # convert a value retrieved from RPC to the correct native Python type
@@ -162,7 +187,7 @@
       return None
 
     # String: convert to unicode or local encoding
-    elif typestr [:7] == 'string(':
+    elif typestr [:6] == 'string':
       try:
         value = unicode (value, 'utf-8')
       except TypeError, msg:
@@ -263,8 +288,10 @@
 
   def execute (self):
     for classname in self._deleteList.keys ():
-      self._dataCon._sm.delete (self._dataCon._sess_id, classname,
-                                self._deleteList [classname])
+      s_classname  = _toString (classname)
+      s_deleteList = _toString (self._deleteList [classname])
+      self._dataCon._sm.delete (self._dataCon._sess_id, s_classname,
+                                s_deleteList)
       del self._deleteList [classname]
 
     for classname in self._updateList.keys ():
@@ -273,8 +300,11 @@
         dict = self._updateList[classname].pop()
         # TODO: merge calls with similar updated fields (=dict.values())
         data = [self.__native_to_rpc (x) for x in dict.values ()]
-        new_ids = self._dataCon._sm.store (self._dataCon._sess_id, classname,
-                                           [id], dict.keys(), [data])
+        s_classname     = _toString (classname)
+        s_id            = _toString (id)
+        s_propertynames = _toString (dict.keys ())
+        new_ids = self._dataCon._sm.store (self._dataCon._sess_id, s_classname,
+                                           [s_id], s_propertynames, [data])
         dict ["gnue_id"] = new_ids [0]
       del self._updateList [classname]
       del self._updateKeyList [classname]





reply via email to

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