array parser
[m6w6/ext-pq] / src / php_pqres.c
index 75355154acc971ed4aa79ffc1f767707ddef1d24..2ebcf74dbc2a2944d32855eb9081ce212f1e7f43 100644 (file)
@@ -127,12 +127,13 @@ zval *php_pqres_row_to_zval(PGresult *res, unsigned row, php_pqres_fetch_t fetch
                                }
                        } else {
                                zval *zv;
+                               Oid typ = PQftype(res, c);
                                char *val = PQgetvalue(res, row, c);
                                int len = PQgetlength(res, row, c);
 
                                MAKE_STD_ZVAL(zv);
 
-                               switch (PQftype(res, c)) {
+                               switch (typ) {
 #ifdef HAVE_PHP_PQ_TYPE_H
 #      undef PHP_PQ_TYPE
 #      include "php_pq_type.h"
@@ -155,21 +156,34 @@ zval *php_pqres_row_to_zval(PGresult *res, unsigned row, php_pqres_fetch_t fetch
                                        ZVAL_DOUBLE(zv, zend_strtod(val, NULL));
                                        break;
 
-                               case PHP_PQ_OID_ABSTIME:
                                case PHP_PQ_OID_DATE:
+                                       php_pqdt_from_string(val, len, "Y-m-d", zv TSRMLS_CC);
+                                       break;
+
+                               case PHP_PQ_OID_ABSTIME:
+                                       php_pqdt_from_string(val, len, "Y-m-d H:i:s", zv TSRMLS_CC);
+                                       break;
+
                                case PHP_PQ_OID_TIMESTAMP:
+                                       php_pqdt_from_string(val, len, "Y-m-d H:i:s.u", zv TSRMLS_CC);
+                                       break;
+
                                case PHP_PQ_OID_TIMESTAMPTZ:
-                                       php_pq_date_from_string(val, len, zv TSRMLS_CC);
+                                       php_pqdt_from_string(val, len, "Y-m-d H:i:s.uO", zv TSRMLS_CC);
                                        break;
 
 
 #else
-                               case 18: /* BOOL */
+                               case 16: /* BOOL */
                                        ZVAL_BOOL(zv, *val == 't');
                                        break;
 #endif
                                default:
-                                       ZVAL_STRINGL(zv, val, len, 1);
+                                       if (PHP_PQ_TYPE_IS_ARRAY(typ) && (Z_ARRVAL_P(zv) = php_pq_parse_array(val, len TSRMLS_CC))) {
+                                               Z_TYPE_P(zv) = IS_ARRAY;
+                                       } else {
+                                               ZVAL_STRINGL(zv, val, len, 1);
+                                       }
                                        break;
                                }