]> granicus.if.org Git - php/commitdiff
Added missing handling of dateTime
authorIlia Alshanetsky <iliaa@php.net>
Sat, 28 Jun 2003 06:55:47 +0000 (06:55 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Sat, 28 Jun 2003 06:55:47 +0000 (06:55 +0000)
Fixed compiler warning involving streams
Added a test case for wddx_deserialize()

ext/wddx/tests/001.phpt [new file with mode: 0644]
ext/wddx/tests/wddx.xml [new file with mode: 0644]
ext/wddx/wddx.c

diff --git a/ext/wddx/tests/001.phpt b/ext/wddx/tests/001.phpt
new file mode 100644 (file)
index 0000000..857cc2f
--- /dev/null
@@ -0,0 +1,57 @@
+--TEST--
+wddz deserialization test
+--FILE--
+<?php
+       $path = dirname(__FILE__);
+       var_dump(wddx_deserialize(file_get_contents("{$path}/wddx.xml")));
+?>
+--EXPECT--
+array(11) {
+  ["aNull"]=>
+  NULL
+  ["aString"]=>
+  string(8) "a string"
+  ["aNumber"]=>
+  float(-12.456)
+  ["aDateTime"]=>
+  int(897600732)
+  ["aDateTime2"]=>
+  string(19) "1930-06-12T04:32:12"
+  ["aDateTime3"]=>
+  string(19) "2040-06-12T04:32:12"
+  ["aBoolean"]=>
+  bool(true)
+  ["anArray"]=>
+  array(2) {
+    [0]=>
+    int(10)
+    [1]=>
+    string(14) "second element"
+  }
+  ["aBinary"]=>
+  string(11) "binary data"
+  ["anObject"]=>
+  array(2) {
+    ["s"]=>
+    string(8) "a string"
+    ["n"]=>
+    float(-12.456)
+  }
+  ["aRecordset"]=>
+  array(2) {
+    ["NAME"]=>
+    array(2) {
+      [0]=>
+      string(8) "John Doe"
+      [1]=>
+      string(8) "Jane Doe"
+    }
+    ["AGE"]=>
+    array(2) {
+      [0]=>
+      int(34)
+      [1]=>
+      int(31)
+    }
+  }
+}
diff --git a/ext/wddx/tests/wddx.xml b/ext/wddx/tests/wddx.xml
new file mode 100644 (file)
index 0000000..8713159
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version='1.0'?>
+<!DOCTYPE wddxPacket SYSTEM 'wddx_0100.dtd'>
+<wddxPacket version='1.0'>
+<header/>
+       <data>
+               <struct>
+                     <var name='aNull'>
+                         <null/>
+                     </var>
+                     <var name='aString'>
+                         <string>a string</string>
+                     </var>
+                     <var name='aNumber'>
+                         <number>-12.456</number>
+                     </var>
+                     <var name='aDateTime'>
+                         <dateTime>1998-06-12T04:32:12</dateTime>
+                     </var>
+                     <var name='aDateTime2'>
+                         <dateTime>1930-06-12T04:32:12</dateTime>
+                     </var>
+                     <var name='aDateTime3'>
+                         <dateTime>2040-06-12T04:32:12</dateTime>
+                     </var>
+                     <var name='aBoolean'>
+                         <boolean value='true'/>
+                     </var>
+                     <var name='anArray'>
+                         <array length='2'>
+                             <number>10</number>
+                             <string>second element</string>
+                        </array>
+                     </var>
+                     <var name='aBinary'>
+                         <binary length='11'>YmluYXJ5IGRhdGE=</binary>
+                     </var>
+                     <var name='anObject'>
+                         <struct>
+                             <var name='s'>
+                                 <string>a string</string>
+                             </var>
+                             <var name='n'>
+                                 <number>-12.456</number>
+                             </var>
+                         </struct>
+                     </var>
+                    <var name='aRecordset'>
+                         <recordset rowCount='2' fieldNames='NAME,AGE'>
+                               <field name='NAME'>
+                                        <string>John Doe</string>
+                                        <string>Jane Doe</string>
+                               </field>
+                               <field name='AGE'>
+                                       <number>34</number>
+                                       <number>31</number>
+                               </field>
+                       </recordset>
+                 </struct>
+       </data>
+</wddxPacket>
index 1f25a328b32cc4626838e1768ddcaae7c441f512..959b66ad889c58fa45d6a4f3f6f4a612e6eead5b 100644 (file)
@@ -34,6 +34,7 @@
 #include "ext/standard/php_smart_str.h"
 #include "ext/standard/html.h"
 #include "ext/standard/php_string.h"
+#include "ext/standard/php_parsedate.h"
 
 #define WDDX_BUF_LEN                   256
 #define PHP_CLASS_NAME_VAR             "php_class_name"
@@ -54,6 +55,7 @@
 #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))
@@ -79,7 +81,8 @@ typedef struct {
                ST_BINARY,
                ST_STRUCT,
                ST_RECORDSET,
-               ST_FIELD
+               ST_FIELD,
+               ST_DATETIME
        } type;
        char *varname;
 } st_entry;
@@ -860,6 +863,14 @@ static void php_wddx_push_element(void *user_data, const char *name, const char
                        }
                }
 
+               wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
+       } else if (!strcmp(name, EL_DATETIME)) {
+               ent.type = ST_DATETIME;
+               SET_STACK_VARNAME;
+               
+               ALLOC_ZVAL(ent.data);
+               INIT_PZVAL(ent.data);
+               Z_TYPE_P(ent.data) = IS_LONG;
                wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
        }
 }
@@ -884,7 +895,8 @@ static void php_wddx_pop_element(void *user_data, const char *name)
        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_RECORDSET) || !strcmp(name, EL_BINARY)) {
+               !strcmp(name, EL_RECORDSET) || !strcmp(name, EL_BINARY) ||
+               !strcmp(name, EL_DATETIME)) {
                wddx_stack_top(stack, (void**)&ent1);
 
                if (!strcmp(name, EL_BINARY)) {
@@ -1048,6 +1060,24 @@ static void php_wddx_process_data(void *user_data, const char *s, int len)
                                }
                                break;
 
+                       case ST_DATETIME: {
+                               char *tmp;
+
+                               tmp = do_alloca(len + 1);
+                               memcpy(tmp, s, len);
+                               tmp[len] = '\0';
+
+                               Z_LVAL_P(ent->data) = php_parse_date(tmp, NULL);
+                               /* date out of range < 1969 or > 2038 */
+                               if (Z_LVAL_P(ent->data) == -1) {
+                                       Z_TYPE_P(ent->data) = IS_STRING;
+                                       Z_STRLEN_P(ent->data) = len;
+                                       Z_STRVAL_P(ent->data) = estrndup(s, len);
+                               }
+                               free_alloca(tmp);
+                       }
+                               break;
+
                        default:
                                break;
                }
@@ -1280,7 +1310,7 @@ PHP_FUNCTION(wddx_deserialize)
                payload_len = Z_STRLEN_P(packet);
        }
        else if (Z_TYPE_P(packet) == IS_RESOURCE) {
-               stream = php_stream_from_zval(stream, &packet);
+               php_stream_from_zval(stream, &packet);
                if (stream) {
                        payload_len = php_stream_copy_to_mem(stream, &payload, PHP_STREAM_COPY_ALL, 0);
                }