Changeset 11177

Show
Ignore:
Timestamp:
07/11/07 15:17:12 (2 years ago)
Author:
piotras
Message:

Experimental DateTime? implementation for MGD_TYPE_TIMESTAMP properties

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/midgard/apis/php4/midgard.c

    r11060 r11177  
    266266                        if(objid->type != IS_NULL) { 
    267267                                 
    268                                 GValue *value = php_midgard_zval2gvalue(objid); 
     268                                GValue *value =  
     269                                        php_midgard_zval2gvalue(objid); 
    269270                                gobject = midgard_object_new(mgd,  
    270271                                                (const gchar *) zend_classname, 
  • trunk/midgard/apis/php4/php_midgard.h

    r10994 r11177  
    192192 
    193193extern GValue *php_midgard_zval2gvalue(zval *zvalue); 
    194 extern gboolean php_midgard_gvalue2zval(GValue *gvalue, zval *zvalue); 
     194extern gboolean php_midgard_gvalue2zval(GValue *gvalue, zval *zvalue,  
     195                        MidgardDBObjectClass *klass, const gchar *pname); 
    195196 
    196197zend_class_entry *midgard_php_register_internal_class( 
  • trunk/midgard/apis/php4/php_midgard_collector.c

    r10898 r11177  
    163163        zval *zvalue; 
    164164        MAKE_STD_ZVAL(zvalue); 
    165         php_midgard_gvalue2zval(gvalue, zvalue); 
     165        /* FIXME, we need to get underlying object here */ 
     166        php_midgard_gvalue2zval(gvalue, zvalue, NULL, NULL); 
    166167         
    167168        add_assoc_zval(zend_hash, 
     
    222223                return; 
    223224         
    224         php_midgard_gvalue2zval(gvalue, return_value);         
     225        php_midgard_gvalue2zval(gvalue, return_value, NULL, NULL);     
    225226} 
    226227 
  • trunk/midgard/apis/php4/php_midgard_connection.c

    r11061 r11177  
    9494                zval *pid; 
    9595                MAKE_STD_ZVAL(pid); 
    96                 php_midgard_gvalue2zval(&pval, pid); 
     96                php_midgard_gvalue2zval(&pval, pid, NULL, NULL); 
    9797                g_value_unset(&pval); 
    9898                zend_hash_update(Z_ARRVAL_PP(_midgard), 
  • trunk/midgard/apis/php4/php_midgard_gobject_generic.c

    r10990 r11177  
    1717#include "php_midgard.h" 
    1818#include "php_midgard_gobject.h" 
    19  
     19#include <TSRM.h> 
     20 
     21/* static prototypes */ 
     22static void php_midgard_datetime_from_string(const gchar *date, zval *zvalue); 
     23static const gchar *php_midgard_string_from_datetime(zval *zvalue); 
    2024 
    2125/* GVALUE ROUTINES */ 
     
    3135        HashPosition iterator; 
    3236        GValue *tmpval; 
     37        const gchar *dtstr; 
     38        zend_class_entry *dtce; 
    3339 
    3440        switch(Z_TYPE_P(zvalue)) { 
     
    7480         
    7581                case IS_OBJECT: 
    76                         php_error(E_WARNING, "IS_OBJECT type not yet supported"); 
     82                        dtce = php_midgard_get_baseclass_ptr_by_name("DateTime"); 
     83 
     84                        /* DateTime object, convert to string value */ 
     85                        if(Z_OBJCE_P(zvalue) == dtce) { 
     86                                 
     87                                dtstr = php_midgard_string_from_datetime(zvalue); 
     88                                g_value_init(gvalue, G_TYPE_STRING); 
     89                                g_value_set_string(gvalue, dtstr);               
     90                                g_warning("DATESTR '%s'", dtstr); 
     91 
     92                        } else { 
     93                                 
     94                                php_error(E_WARNING, "IS_OBJECT type not fully supported"); 
     95                        } 
    7796                        break; 
    7897 
     
    86105} 
    87106 
    88 gboolean php_midgard_gvalue2zval(GValue *gvalue, zval *zvalue) 
     107gboolean php_midgard_gvalue2zval(GValue *gvalue, zval *zvalue,  
     108                MidgardDBObjectClass *dbklass, const gchar *pname) 
    89109{ 
    90110        g_assert(gvalue); 
     
    100120        GValue *arr_val; 
    101121        zval *zarr_val; 
    102          
     122 
     123        /* It's overloaded, but we need to initialize DateTime object */ 
     124        /* Disabled for a while 
     125        if(dbklass != NULL) { 
     126                 
     127                MidgardReflectionProperty *mrp =  
     128                        midgard_reflection_property_new(dbklass); 
     129                GType mtype =  
     130                        midgard_reflection_property_get_midgard_type(mrp, pname); 
     131                 
     132                if(mtype == MGD_TYPE_TIMESTAMP) { 
     133 
     134                        php_midgard_datetime_from_string( 
     135                                        g_value_get_string(gvalue), zvalue); 
     136                        return TRUE; 
     137                } 
     138        } 
     139        */ 
     140 
     141        /* Generic GValue */ 
    103142        switch (G_TYPE_FUNDAMENTAL(G_VALUE_TYPE(gvalue))) { 
    104143                 
     
    147186 
    148187                case G_TYPE_OBJECT: 
    149                         
     188                 
    150189                        gobject_property = g_value_get_object(gvalue); 
    151190 
     
    200239                                        arr_val = g_value_array_get_nth(array, i); 
    201240                                        MAKE_STD_ZVAL(zarr_val); 
    202                                         php_midgard_gvalue2zval(arr_val, zarr_val); 
     241                                        php_midgard_gvalue2zval(arr_val, zarr_val, 
     242                                                        dbklass, pname); 
    203243                                        add_index_zval(zvalue, i, zarr_val); 
    204244                                } 
     
    256296                                                        (const gchar *) _classname,  
    257297                                                        NULL); 
     298                                 
     299                                guint k; 
     300                                for ( k = 0; k < 5; k++) { 
     301                                        midgard_object_new( 
     302                                                        mgd_handle(), 
     303                                                        "midgard_article", 
     304                                                        NULL); 
     305                                        g_warning("K %d", k); 
     306                                } 
     307 
    258308                        } else { 
    259309                                 
     
    297347                g_object_get_property(G_OBJECT(gobject), Z_STRVAL_P(prop), &pval); 
    298348                MAKE_STD_ZVAL(_retval); 
    299                 php_midgard_gvalue2zval(&pval, _retval); 
     349                php_midgard_gvalue2zval(&pval, _retval,  
     350                                MIDGARD_DBOBJECT_GET_CLASS(gobject),  
     351                                (const gchar *) Z_STRVAL_P(prop)); 
    300352                g_value_unset(&pval); 
     353                                 
     354                if(pspec->value_type == MGD_TYPE_TIMESTAMP) 
     355                        g_warning("IS DATE"); 
    301356         
    302357        } else { 
     
    332387        if(pspec) { 
    333388 
    334                 GValue *gvalue = php_midgard_zval2gvalue(value); 
     389                GValue *gvalue =  
     390                        php_midgard_zval2gvalue(value); 
    335391                g_object_set_property(gobject, Z_STRVAL_P(prop), gvalue); 
    336392                std_hnd->write_property(zobject, prop, value TSRMLS_CC); 
     
    472528                         
    473529                        MAKE_STD_ZVAL(tmp); 
    474                         php_midgard_gvalue2zval(&pval, tmp); 
     530                        php_midgard_gvalue2zval(&pval, tmp,  
     531                                        MIDGARD_DBOBJECT_GET_CLASS(gobject), 
     532                                        props[i]->name); 
    475533                        zend_hash_update(php_gobject->zo.properties,  
    476534                                        props[i]->name, strlen(props[i]->name)+1,  
     
    629687 
    630688        return rce; 
     689} 
     690 
     691/* DATETIME OBJECT */ 
     692 
     693static zval ***__copy_args(zval *args) 
     694{ 
     695        zval ***params = NULL; 
     696        guint i; 
     697        guint argc = 0; 
     698 
     699        if(args != NULL) { 
     700                 
     701                argc = zend_hash_num_elements(Z_ARRVAL_P(args)); 
     702                params = (zval ***)emalloc(argc * sizeof(zval **)); 
     703                zend_hash_internal_pointer_reset(Z_ARRVAL_P(args)); 
     704                 
     705                for(i = 0; i < argc; i++) { 
     706                         
     707                        zend_hash_get_current_data(Z_ARRVAL_P(args), (void **)&params[i]); 
     708                        zend_hash_move_forward(Z_ARRVAL_P(args)); 
     709                } 
     710 
     711                return params; 
     712        } 
     713 
     714        return NULL; 
     715} 
     716 
     717static void php_midgard_datetime_from_string(const gchar *date, zval *zvalue) 
     718{ 
     719        /* DateTimeZone object */ 
     720        zend_class_entry *dtz_ce =  
     721                php_midgard_get_baseclass_ptr_by_name("DateTimeZone"); 
     722         
     723        zval *dtz_params; 
     724        MAKE_STD_ZVAL(dtz_params); 
     725        array_init(dtz_params); 
     726        /* Initialize object for UTC timezone */ 
     727        add_index_string(dtz_params, 0, "UTC", 0); 
     728         
     729        zval *dtz_object; 
     730        MAKE_STD_ZVAL(dtz_object); 
     731        object_init_ex(dtz_object, dtz_ce); 
     732        zval *dtz_constructor; 
     733        MAKE_STD_ZVAL(dtz_constructor); 
     734        ZVAL_STRING(dtz_constructor, "__construct", 0); 
     735 
     736        /* Copy constructor arguments */ 
     737        zval ***args = __copy_args(dtz_params); 
     738 
     739        zval *retval = NULL; 
     740        int cld = call_user_function_ex(NULL, &dtz_object, dtz_constructor, 
     741                        &retval, 1, args, 0, NULL TSRMLS_CC); 
     742        efree(args); 
     743 
     744        /* DateTime object */ 
     745        zend_class_entry *dt_ce =  
     746                php_midgard_get_baseclass_ptr_by_name("DateTime"); 
     747         
     748        zval *dt_params; 
     749        MAKE_STD_ZVAL(dt_params); 
     750        array_init(dt_params); 
     751        /* Initialize object for given time string and timezone*/ 
     752        if(date == NULL) date = "now"; 
     753        add_index_string(dt_params, 0, (gchar *)date, 1); 
     754        add_index_zval(dt_params, 1, dtz_object); 
     755         
     756        object_init_ex(zvalue, dt_ce); 
     757        zval *dt_constructor; 
     758        MAKE_STD_ZVAL(dt_constructor); 
     759        ZVAL_STRING(dt_constructor, "__construct", 0); 
     760 
     761        /* Copy constructor arguments */ 
     762        args = __copy_args(dt_params); 
     763 
     764        cld = call_user_function_ex(NULL, &zvalue, dt_constructor, 
     765                        &retval, 2, args, 0, NULL TSRMLS_CC); 
     766        efree(args); 
     767         
     768        return; 
     769} 
     770 
     771static const gchar *php_midgard_string_from_datetime(zval *zvalue) 
     772{ 
     773        if(Z_TYPE_P(zvalue) != IS_OBJECT) { 
     774                 
     775                g_warning("Can not format ISO datetime string. Value is not an object"); 
     776                return NULL; 
     777        } 
     778 
     779        /* Create params array and format ISO8601 compatible string */ 
     780        zval *dt_params; 
     781        MAKE_STD_ZVAL(dt_params); 
     782        array_init(dt_params); 
     783        add_index_string(dt_params, 0, (gchar *)"DateTime::ISO8601", 0); 
     784 
     785        zval *f_format; 
     786        MAKE_STD_ZVAL(f_format); 
     787        ZVAL_STRING(f_format, "format", 0); 
     788 
     789        /* Copy function arguments */ 
     790        zval ***args = __copy_args(dt_params); 
     791 
     792        /* TSRMSLS_FETCH(); */ /* Should be called here (required for CG macro ) */ 
     793         
     794        zval *retval;    
     795        call_user_function_ex(NULL, &zvalue, f_format, 
     796                        &retval, 1, args, 1, NULL TSRMLS_CC); 
     797        efree(args); 
     798 
     799        g_warning("STRV %s", Z_STRVAL_P(retval)); 
     800        return (const gchar *)Z_STRVAL_P(retval); 
    631801} 
    632802 
  • trunk/midgard/apis/php4/php_midgard_object_parameter.c

    r10887 r11177  
    5757                                                        domain, name); 
    5858                                if(gvalue != NULL) 
    59                                         php_midgard_gvalue2zval((GValue *)gvalue, return_value); 
     59                                        php_midgard_gvalue2zval((GValue *)gvalue,  
     60                                                        return_value,  
     61                                                        NULL, NULL); 
    6062                                else  
    6163                                        RETURN_NULL(); 
  • trunk/midgard/apis/php4/query_builder.c

    r10951 r11177  
    207207                php_midgard_gobject_new_with_gobject(zobject, *ce, objects[i], TRUE); 
    208208                zend_hash_next_index_insert( 
    209                         HASH_OF(return_value), &zobject, sizeof(zval *), NULL);  
     209                        HASH_OF(return_value), &zobject, sizeof(zval *), NULL);         
    210210        } 
    211211