I have attatched a patch to do recordset, datetime, and field tags processing
during deserialization.

On Thu, 8 Nov 2001, Andrei Zmievski wrote:

> On Thu, 08 Nov 2001, [EMAIL PROTECTED] wrote:
> > Hi all:
> > 
> > I am thinking of a way to transform WDDX recordset element into PHP varialbles
> > when deserializing the packet.
> > 
> > It seems that all recordset will look like:
> > 
> > <var name="queryname"><recordset rowcount="?" fieldname="f1,f2,...fn"><field
> > name="f1">...</field>...</recordset></var>
> > 
> > The above can be transformed into:
> > 
> > <var name="queryname"><string>f1,f2,...fn</string></var><var
> > name="f1"><array>...</array></var><var name="f2"><array>...</array></var>...
> > 
> > If we parse as this transformation, in PHP script:
> > 
> > $values = wddx_deserialize($packet);
> > $values["queryname"] = "f1,f2,...,fn";
> > $values["f1"] = values in array for "f1" field;
> > ....
> > $values["fn"] = values in array for "fn" field;
> > 
> > 
> > Should this solve the recordset problem?
> 
> Deserializing the recordset is not a problem, but creating one out of
> PHP values is since there is no exact mapping. It would be better to
> have it work both ways, but maybe deserialization only support at this
> point is fine.
> 
> -Andrei

Phillip Pan
-----------
Index: wddx.c
===================================================================
RCS file: /home/phillip/CVS/php/ext/wddx/wddx.c,v
retrieving revision 1.1.1.1
diff -u -w -r1.1.1.1 wddx.c
--- wddx.c      2001/11/08 23:31:11     1.1.1.1
+++ wddx.c      2001/11/09 00:45:05
@@ -59,6 +59,9 @@
 #define EL_VAR                                 "var"
 #define EL_VAR_NAME                            "name"
 #define EL_VERSION                             "version"
+#define EL_RECORDSET                           "recordset"
+#define EL_FIELD                               "field"
+#define EL_DATETIME                            "datetime"
 
 #define php_wddx_deserialize(a,b) \
        php_wddx_deserialize_ex((a)->value.str.val, (a)->value.str.len, (b))
@@ -95,6 +98,7 @@
 
 
 static void php_wddx_process_data(void *user_data, const char *s, int len);
+static void php_wddx_pop_element(void *user_data, const char *name);
 
 
 function_entry wddx_functions[] = {
@@ -561,7 +565,7 @@
                                /* nothing for now */
                        }
                }
-       } else if (!strcmp(name, EL_STRING)) {
+       } else if (!strcmp(name, EL_STRING) || !strcmp(name, EL_DATETIME)) {
                ent.type = ST_STRING;
                SET_STACK_VARNAME;
                
@@ -650,12 +654,43 @@
                                stack->varname = decoded_value;
                        }
                }
+       } else if (!strcmp(name, EL_RECORDSET)) {
+               int i;
+               ent.type = ST_STRING;
+               SET_STACK_VARNAME;
+
+               ALLOC_ZVAL(ent.data);
+               INIT_PZVAL(ent.data);
+               Z_TYPE_P(ent.data) = IS_STRING;
+               Z_STRVAL_P(ent.data) = empty_string;
+               Z_STRLEN_P(ent.data) = 0;
+               wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
+               for ( i = 0; atts[i]; i++ ) {
+                       if (!strcmp(atts[i], "fieldNames")) {
+                               break;
        }
-       /*
-       else if (!strcmp(name, EL_RECORDSET)) {
-               ent.type = ST_RECORDSET;
        }
-       */
+               php_wddx_process_data(user_data, atts[i++], strlen(atts[i++]));
+               php_wddx_pop_element(user_data, EL_STRING);
+       } else if (!strcmp(name, EL_FIELD)) {
+               int i;
+
+               for (i=0; atts[i]; i++) {
+                       if (!strcmp(atts[i], EL_VAR_NAME) && atts[i+1]) {
+                               char *decoded_value;
+                               int decoded_len;
+                               decoded_value = 
+xml_utf8_decode(atts[i+1],strlen(atts[i+1]),&decoded_len,"ISO-8859-1");
+                               stack->varname = decoded_value;
+                       }
+               }
+               ent.type = ST_ARRAY;
+               SET_STACK_VARNAME;
+
+               ALLOC_ZVAL(ent.data);
+               array_init(ent.data);
+               INIT_PZVAL(ent.data);
+               wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
+       }
 }
 
 
@@ -675,7 +710,8 @@
        if (!strcmp(name, EL_STRING) || !strcmp(name, EL_NUMBER) ||
                !strcmp(name, EL_BOOLEAN) || !strcmp(name, EL_NULL) ||
                !strcmp(name, EL_ARRAY) || !strcmp(name, EL_STRUCT) ||
-               !strcmp(name, EL_BINARY)) {
+               !strcmp(name, EL_BINARY) || !strcmp(name, EL_FIELD) ||
+               !strcmp(name, EL_DATETIME)) {
                wddx_stack_top(stack, (void**)&ent1);
 
                if (!strcmp(name, EL_BINARY)) {
-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to