root/trunk/midgard/apis/php5/php_midgard_object.c

Revision 18106, 22.9 kB (checked in by piotras, 2 months ago)

Ported rev18105

Line 
1 /*
2  * Copyright (C) 2007 Piotr Pokora <piotrek.pokora@gmail.com>
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License as published
6  * by the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include "php_midgard.h"
20 #include "php_midgard_gobject.h"
21 #include "php_midgard_object.h"
22
23 #define _GET_MIDGARD_OBJECT \
24         zval *zval_object = getThis(); \
25         php_midgard_gobject *php_gobject = \
26                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC); \
27         MgdObject *object = MIDGARD_OBJECT(php_gobject->gobject); \
28         if(!object) php_error(E_ERROR, "Can not find underlying midgard object instance");
29
30 /* Object constructor */    
31 PHP_FUNCTION(_midgard_php_object_constructor)
32 {
33         CHECK_MGD;
34         RETVAL_FALSE;
35         guint arguments = ZEND_NUM_ARGS();
36         zval *objid;   
37         MgdObject *gobject = NULL;
38         MidgardConnection *mgd = mgd_handle();
39         zval *zval_object = getThis();
40         zend_class_entry *base_class =
41                 php_midgard_get_baseclass_ptr(Z_OBJCE_P(zval_object));
42         const gchar *zend_classname = base_class->name;
43
44         if(arguments > 1) {
45                 WRONG_PARAM_COUNT;
46         }
47
48         /* Initialize empty MgdObject */
49         if(arguments == 0) {
50                
51                 gobject = midgard_object_new(mgd,
52                                 (const gchar *) zend_classname,
53                                 NULL);
54                 if(!gobject){
55
56                         php_midgard_error_throw_exception(mgd);
57                         return;
58
59                 } else {
60
61                         php_midgard_gobject *php_gobject =
62                                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
63                         php_gobject->gobject = G_OBJECT(gobject);
64                         RETVAL_TRUE;
65                         return;
66                 }
67         }
68        
69         /* There is one parameter , so we get object by id or guid */
70         if(arguments == 1) {
71                
72                 if(zend_parse_parameters_ex(
73                                         2, 1 TSRMLS_CC, "z", &objid)  == FAILURE)
74                         return;
75                
76                 if((objid->type == IS_STRING)
77                                 || (objid->type == IS_LONG)
78                                 || (objid->type == IS_NULL)) {
79                        
80                         if(objid->type != IS_NULL) {
81                                
82                                 GValue *value =
83                                         php_midgard_zval2gvalue(objid);
84                                 gobject = midgard_object_new(mgd,
85                                                 (const gchar *) zend_classname,
86                                                 value);
87                                 g_value_unset(value);
88                                 g_free(value);
89                        
90                         } else {
91
92                                 gobject = midgard_object_new(mgd,
93                                                 (const gchar *) zend_classname,
94                                                 NULL);
95                         }
96
97                         if(!gobject) {
98
99                                 //php_error(E_WARNING, "I am the exception, please throw me");
100                                 php_midgard_error_throw_exception(mgd);
101                                 return;
102                         }
103                                        
104                         php_midgard_gobject *php_gobject =
105                                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
106                         php_gobject->gobject = G_OBJECT(gobject);
107                         RETVAL_TRUE;
108                
109                 } else {
110
111                         php_error(E_WARNING, "Wrong type for '%s' constructor",
112                                         zend_classname);
113                 }               
114         }
115 }
116  
117 PHP_FUNCTION(_midgard_php_object_create)
118 {
119         CHECK_MGD;
120         RETVAL_FALSE;
121
122         zval *zval_object = getThis();
123        
124         if(ZEND_NUM_ARGS() > 0)
125                 WRONG_PARAM_COUNT;
126
127                                
128         php_midgard_gobject *php_gobject =
129                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
130         MgdObject *mobj = MIDGARD_OBJECT( php_gobject->gobject);
131
132         if (mobj != NULL) {             
133
134                 if(midgard_object_create(mobj))
135                         RETVAL_TRUE;
136        
137                 //php_error(E_WARNING, "I am the exception, please throw me");
138                 //if(!php_midgard_error_throw_exception(mobj->mgd))
139                 //      RETVAL_TRUE;
140         }
141 }
142
143 PHP_FUNCTION(_midgard_php_object_update)
144 {       
145         RETVAL_FALSE;   
146         CHECK_MGD;
147         zval *zval_object = getThis(); 
148
149         if(ZEND_NUM_ARGS() != 0)
150                 WRONG_PARAM_COUNT;
151        
152         php_midgard_gobject *php_gobject =
153                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
154        
155         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
156
157         if (mobj) {     
158                
159                 if(midgard_object_update(mobj))
160                         RETVAL_TRUE;
161                 //php_error(E_WARNING, "I am the exception, please throw me");
162                 //if(!php_midgard_error_throw_exception(mobj->mgd))     
163         }
164 }
165
166
167 PHP_FUNCTION(_get_type_by_id)
168 {
169         RETVAL_FALSE;
170         CHECK_MGD;
171         guint id;
172         zval *zval_object = getThis();
173
174         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE)
175                 return;
176        
177         php_midgard_gobject *php_gobject =
178                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
179         MgdObject *mobj =
180                 MIDGARD_OBJECT(php_gobject->gobject);
181        
182         if (mobj) {
183
184                 if(midgard_object_get_by_id(mobj, id))
185                         RETVAL_TRUE;
186                 //php_error(E_WARNING, "I am the exception, please throw me");
187                 //if(!php_midgard_error_throw_exception(mobj->mgd))
188         } 
189 }
190
191 PHP_FUNCTION(_midgard_php_object_get_by_guid)
192 {
193         RETVAL_FALSE;
194         CHECK_MGD;
195         zval *zval_object = getThis();
196         gchar *guid;
197         int glen;
198        
199         if (zend_parse_parameters(1 TSRMLS_CC,
200                                 "s", &guid, &glen)  == FAILURE) {
201                 return;
202         }
203        
204         php_midgard_gobject *php_gobject =
205                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
206         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
207
208         if (mobj) {
209                
210                 if(midgard_object_get_by_guid(mobj, guid))
211                         RETVAL_TRUE;
212
213                 //php_error(E_WARNING, "I am the exception, please throw me");
214                 //if(!php_midgard_error_throw_exception(mobj->mgd))
215         }     
216 }
217
218 PHP_FUNCTION(_midgard_php_object_is_in_parent_tree)
219 {
220         RETVAL_FALSE;
221         CHECK_MGD;
222         zval *zval_object = getThis();
223         zval **rootid, **id;
224        
225         /* FIXME, change for zend_parse_parameters */
226         if (ZEND_NUM_ARGS() != 2
227                         || zend_get_parameters_ex(2, &rootid, &id) != SUCCESS)
228                 WRONG_PARAM_COUNT;
229        
230         convert_to_long_ex(rootid);
231         convert_to_long_ex(id);
232        
233         /* Return TRUE if id or rootid is 0. */
234         if (((*rootid)->value.lval == 0) && (*id)->value.lval == 0)
235                 RETURN_TRUE;
236        
237         php_midgard_gobject *php_gobject =
238                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
239         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
240        
241         if(mobj) {
242                
243                 if (midgard_object_is_in_parent_tree(
244                                         mobj,
245                                         (*rootid)->value.lval,
246                                         (*id)->value.lval)){
247                         /* FIXME , throw exception */
248                         RETURN_TRUE;
249                 }
250         } 
251 }
252
253 PHP_FUNCTION(_midgard_php_object_is_in_tree)
254 {
255         RETVAL_FALSE;
256         CHECK_MGD;
257         zval *zval_object = getThis();
258         zval **rootid, **id;
259        
260         /* FIXME, parse_parameters */
261         if (ZEND_NUM_ARGS() != 2
262                         || zend_get_parameters_ex(2, &rootid, &id) != SUCCESS)
263                 WRONG_PARAM_COUNT;
264        
265         convert_to_long_ex(rootid);
266         convert_to_long_ex(id);
267
268         php_midgard_gobject *php_gobject =
269                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
270         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
271
272         if(mobj) {
273                
274                 if (midgard_object_is_in_tree(
275                                         mobj,
276                                         (*rootid)->value.lval,
277                                         (*id)->value.lval))
278                         /* FIXME , throw excpetion */
279                         RETURN_TRUE;
280
281         }
282 }
283
284 PHP_FUNCTION(_midgard_php_object_delete)
285 {
286         RETVAL_FALSE;
287         CHECK_MGD;
288         zval *zval_object = getThis();
289        
290         php_midgard_gobject *php_gobject =
291                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
292         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
293
294         if(mobj) {
295                
296                 if(midgard_object_delete(mobj))
297                         RETVAL_TRUE;
298                 //php_error(E_WARNING, "I am the exception, please throw me");
299                 //if(!php_midgard_error_throw_exception(mobj->mgd))
300         }
301 }
302
303 PHP_FUNCTION(_midgard_php_object_get_parent)
304 {
305         RETVAL_FALSE;
306         CHECK_MGD;
307         zval *zval_object = getThis();
308         zend_class_entry **pce;
309         MgdObject *pobj;
310         gchar *class_name;
311         const gchar *type_name;
312        
313         if (ZEND_NUM_ARGS() != 0)
314                 return;
315
316         php_midgard_gobject *php_gobject =
317                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
318         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
319
320         if (mobj) {
321                
322                 pobj = midgard_object_get_parent(mobj);
323                
324                 if(pobj) {
325                         type_name = G_OBJECT_TYPE_NAME((GObject*)pobj);
326                         class_name = g_ascii_strdown(type_name, strlen(type_name));
327                         zend_hash_find(CG(class_table),
328                                         class_name, strlen(class_name)+1, (void **) &pce);
329                         php_midgard_gobject_new_with_gobject(return_value, *pce,
330                                         G_OBJECT(pobj), TRUE);
331                         g_free(class_name);
332                 }     
333         }
334 }
335
336 PHP_FUNCTION(_midgard_php_object_get)
337 {
338         RETVAL_FALSE;
339         CHECK_MGD;
340         zval *zval_object = getThis();
341        
342         if (ZEND_NUM_ARGS() != 0)
343                 return;
344        
345         php_midgard_gobject *php_gobject =
346                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
347         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
348        
349        
350         if(mobj) {     
351                
352                 midgard_object_get(mobj);
353                 php_error(E_WARNING, "I am the exception, please throw me");
354                 //if(!php_midgard_error_throw_exception(mobj->mgd))
355                 //      RETVAL_TRUE;
356         }
357 }
358
359 PHP_FUNCTION(_midgard_php_object_list)
360 {
361         RETVAL_FALSE;
362         CHECK_MGD;
363         zval *zval_object = getThis();
364        
365         if (ZEND_NUM_ARGS() != 0)
366                 WRONG_PARAM_COUNT;
367        
368         array_init(return_value);
369        
370         php_midgard_gobject *php_gobject =
371                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
372         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
373
374         if(mobj) {
375                
376                 GObject **objects;
377                 guint i;
378                 MidgardTypeHolder *holder =
379                         g_new(MidgardTypeHolder, 1);
380                 objects = midgard_object_list(mobj, holder);
381                
382                 if (objects) {
383                        
384                         for (i = 0; i < holder->elements; i++) {
385                                
386                                 zval *zobject = NULL;
387                                 php_midgard_gobject_init(zobject,
388                                                 G_OBJECT_TYPE_NAME(G_OBJECT(objects[i])),
389                                                 G_OBJECT(objects[i]), TRUE);                   
390                                 zend_hash_next_index_insert(
391                                                 HASH_OF(return_value), &zobject, sizeof(zval *), NULL);
392                         }                               
393                 }
394
395                 g_free(holder);
396         }
397 }
398
399 PHP_FUNCTION(_midgard_php_object_list_children)
400 {
401         RETVAL_FALSE;
402         CHECK_MGD;
403         zval *zval_object = getThis();
404         gchar *childcname;
405         guint ccnl;
406        
407         if (zend_parse_parameters(1 TSRMLS_CC,
408                                 "s", &childcname, &ccnl)  == FAILURE) {
409                 return;         
410         }
411        
412         array_init(return_value);
413
414         php_midgard_gobject *php_gobject =
415                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
416         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
417
418         if(mobj) {
419                
420                 GObject **objects;
421                 guint i;
422
423                 MidgardTypeHolder *holder =
424                         g_new(MidgardTypeHolder, 1);
425                
426                 if ((objects = midgard_object_list_children(
427                                                 mobj, childcname, holder)) != NULL) {
428                        
429                         for (i = 0; i < holder->elements; i++) {
430
431                                 zval *zobject = NULL;
432                                 php_midgard_gobject_init(zobject,
433                                                 G_OBJECT_TYPE_NAME(G_OBJECT(objects[i])),
434                                                 G_OBJECT(objects[i]), TRUE);                   
435                                 zend_hash_next_index_insert(
436                                                 HASH_OF(return_value),
437                                                 &zobject, sizeof(zval *), NULL);
438                         }                                               
439                 }
440         }
441 }
442
443 PHP_FUNCTION(_midgard_php_object_get_by_path)
444 {
445         RETVAL_FALSE;
446         CHECK_MGD;
447         zval *zval_object = getThis(); 
448         gchar *path;
449         guint pathl;   
450        
451         if (zend_parse_parameters(1 TSRMLS_CC,
452                                 "s", &path, &pathl)  == FAILURE) {
453                 return;
454         }
455        
456         php_midgard_gobject *php_gobject =
457                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
458         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
459
460         gboolean rv =
461                 midgard_object_get_by_path(mobj, path);
462
463         RETURN_BOOL(rv);
464 }
465
466 PHP_FUNCTION(_midgard_php_object_parent)
467 {
468         RETVAL_FALSE;
469         CHECK_MGD;
470         zval *zval_object = getThis();
471         const gchar *parent_class_name;         
472        
473         if (ZEND_NUM_ARGS() != 0)
474                 return;
475        
476         php_midgard_gobject *php_gobject =
477                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
478         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
479
480         if(mobj) {
481                
482                 parent_class_name = midgard_object_parent(mobj);
483                 if(parent_class_name)
484                         RETVAL_STRING((gchar *)parent_class_name, 1);           
485         }                       
486 }
487
488 PHP_FUNCTION(_php_midgard_object_get_languages)
489 {
490         RETVAL_FALSE;
491         CHECK_MGD;
492         zval *zval_object = getThis();
493
494         if(ZEND_NUM_ARGS() > 0)
495                 WRONG_PARAM_COUNT;
496
497         php_midgard_gobject *php_gobject =
498                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
499         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
500
501         if(mobj) {
502
503                 guint i = 0;
504                 GObject **objects =
505                         midgard_object_get_languages(mobj, NULL);
506                
507                 array_init(return_value);
508                
509                 if(objects == NULL)
510                         RETURN_FALSE;
511
512                 zend_class_entry **ce;
513                 zend_hash_find(CG(class_table), "midgard_language",
514                                 17, (void **) &ce);     
515                
516                 while(objects[i] != NULL){
517                        
518                         zval *zobject = NULL;
519                         php_midgard_gobject_init(zobject,
520                                         G_OBJECT_TYPE_NAME(G_OBJECT(objects[i])),
521                                         G_OBJECT(objects[i]), TRUE);
522                         zend_hash_next_index_insert(
523                                         HASH_OF(return_value),
524                                         &zobject, sizeof(zval *), NULL);
525                        
526                         i++;
527                 }
528                
529                 g_free(objects);
530         }
531 }
532
533 PHP_FUNCTION(_php_midgard_object_purge)
534 {
535         RETVAL_FALSE;
536         CHECK_MGD;
537         zval *zval_object = getThis();
538        
539         if(ZEND_NUM_ARGS() != 0)
540                 return;
541
542         php_midgard_gobject *php_gobject =
543                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
544         MgdObject *mobj = MIDGARD_OBJECT(php_gobject->gobject);
545
546         if(mobj) {
547                
548                 if(midgard_object_purge(mobj))
549                         RETVAL_TRUE;
550        
551                 //php_error(E_WARNING, "I am the exception, please throw me");
552                 //if(!php_midgard_error_throw_exception(mobj->mgd))
553         }
554 }
555
556 PHP_FUNCTION(_php_midgard_object_undelete)
557 {
558         RETVAL_FALSE;
559         CHECK_MGD;
560         gchar *guid;
561         guint guid_length;
562         gboolean rv;
563
564         if (zend_parse_parameters(1 TSRMLS_CC,
565                                 "s", &guid, &guid_length)  == FAILURE) {
566                 return;
567         }
568
569         rv = midgard_object_class_undelete(mgd_handle(), (const gchar *)guid);
570         RETURN_BOOL(rv);
571 }
572
573 PHP_FUNCTION(_php_midgard_object_connect)
574 {
575         CHECK_MGD;
576         php_midgard_gobject_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU);
577 }
578
579 PHP_FUNCTION(_php_midgard_new_query_builder)
580 {
581         CHECK_MGD;
582
583         gchar *_cname_space = NULL;
584         gchar *_class_name = get_active_class_name(&_cname_space TSRMLS_CC);
585
586         MidgardQueryBuilder *builder =
587                 midgard_query_builder_new(mgd_handle(), _class_name);
588        
589         if (!builder)
590                 return;
591
592         zend_class_entry *ce =
593                 php_midgard_get_baseclass_ptr_by_name("midgard_query_builder");
594        
595         php_midgard_gobject_new_with_gobject(return_value, ce, G_OBJECT(builder), TRUE);
596 }
597
598 PHP_FUNCTION(_php_midgard_new_collector)
599 {
600         CHECK_MGD;
601
602         gchar *propname;
603         guint *propname_length;
604         zval *zvalue;
605
606         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz",
607                                 &propname, &propname_length, &zvalue) == FAILURE)
608                 return;
609
610         GValue *gvalue = php_midgard_zval2gvalue(zvalue);
611         gchar *_cname_space = NULL;
612         gchar *_class_name = get_active_class_name(&_cname_space TSRMLS_CC);
613
614         MidgardCollector *collector =
615                 midgard_collector_new(mgd_handle(), _class_name, propname, gvalue);
616        
617         if(!collector)
618                 return;
619
620         zend_class_entry **ce;
621         zend_hash_find(CG(class_table), "midgard_collector",
622                         strlen("midgard_collector")+1, (void **) &ce);
623         php_midgard_gobject_new_with_gobject(return_value, *ce, G_OBJECT(collector), TRUE);
624 }
625  
626 PHP_FUNCTION(_php_midgard_new_reflection_property)
627 {
628         CHECK_MGD;
629        
630         gchar *_cname_space = NULL;
631         gchar *_class_name = get_active_class_name(&_cname_space TSRMLS_CC);
632        
633         MidgardObjectClass *klass =
634                 MIDGARD_OBJECT_GET_CLASS_BY_NAME((const gchar *)_class_name);
635
636         MidgardReflectionProperty *mrp =
637                 midgard_reflection_property_new(MIDGARD_DBOBJECT_CLASS(klass));
638        
639         if (!mrp)
640                 return;
641        
642         zend_class_entry *ce =
643                 php_midgard_get_baseclass_ptr_by_name("midgard_reflection_property");
644        
645         php_midgard_gobject_new_with_gobject(return_value, ce, G_OBJECT(mrp), TRUE);
646 }
647
648 PHP_FUNCTION(_php_midgard_object_set_guid)
649 {
650         CHECK_MGD;
651         RETVAL_FALSE;
652         gchar *guid = NULL;
653         guint guid_length;
654         zval *zval_object = getThis();
655        
656         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
657                                 &guid, &guid_length) == FAILURE)
658                 return;
659        
660         php_midgard_gobject *php_gobject =
661                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
662         MgdObject *object = MIDGARD_OBJECT(php_gobject->gobject);
663        
664         RETURN_BOOL(midgard_object_set_guid(object, (const gchar *)guid));
665 }
666
667 PHP_FUNCTION(_php_midgard_object_emit)
668 {
669         CHECK_MGD;
670        
671         gchar *name = NULL;
672         guint name_length;
673         zval *zval_object = getThis();
674        
675         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
676                                 &name, &name_length) == FAILURE)
677                 return;
678        
679         php_midgard_gobject *php_gobject =
680                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
681         MgdObject *object = MIDGARD_OBJECT(php_gobject->gobject);
682        
683         g_signal_emit_by_name(object, name);
684 }
685
686 PHP_FUNCTION(_php_midgard_object_approve)
687 {
688         CHECK_MGD;
689         RETVAL_FALSE;
690
691         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
692                 return;
693
694         _GET_MIDGARD_OBJECT;
695         gboolean rv = midgard_object_approve(object);
696         RETURN_BOOL(rv);
697 }
698
699 PHP_FUNCTION(_php_midgard_object_is_approved)
700 {
701         CHECK_MGD;
702         RETVAL_FALSE;
703
704         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
705                 return;
706
707         _GET_MIDGARD_OBJECT;
708         gboolean rv = midgard_object_is_approved(object);
709         RETURN_BOOL(rv);
710 }
711
712 PHP_FUNCTION(_php_midgard_object_unapprove)
713 {
714         CHECK_MGD;
715         RETVAL_FALSE;
716
717         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
718                 return;
719
720         _GET_MIDGARD_OBJECT;
721         gboolean rv = midgard_object_unapprove(object);
722         RETURN_BOOL(rv);
723 }
724
725 PHP_FUNCTION(_php_midgard_object_lock)
726 {
727         CHECK_MGD;
728         RETVAL_FALSE;
729
730         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
731                 return;
732
733         _GET_MIDGARD_OBJECT;
734         gboolean rv = midgard_object_lock(object);
735         RETURN_BOOL(rv);
736 }
737
738 PHP_FUNCTION(_php_midgard_object_is_locked)
739 {
740         CHECK_MGD;
741         RETVAL_FALSE;
742
743         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
744                 return;
745
746         _GET_MIDGARD_OBJECT;
747         gboolean rv = midgard_object_is_locked(object);
748         RETURN_BOOL(rv);
749 }
750
751 PHP_FUNCTION(_php_midgard_object_unlock)
752 {
753         CHECK_MGD;
754         RETVAL_FALSE;
755
756         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
757                 return;
758
759         _GET_MIDGARD_OBJECT;
760         gboolean rv = midgard_object_unlock(object);
761         RETURN_BOOL(rv);
762 }
763 static struct
764 {
765         char *fname;
766         void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
767         zend_uint flags;
768 }
769
770 __midgard_php_type_functions[] =
771 {
772         {"__construct",
773                 ZEND_FN(_midgard_php_object_constructor),
774                 ZEND_ACC_PUBLIC },
775         {"get_by_id",
776                 ZEND_FN(_get_type_by_id),
777                 ZEND_ACC_PUBLIC },
778         {"get_by_guid",
779                 ZEND_FN(_midgard_php_object_get_by_guid),
780                 ZEND_ACC_PUBLIC },
781         {"update",
782                 ZEND_FN(_midgard_php_object_update),
783                 ZEND_ACC_PUBLIC },
784         {"create",
785                 ZEND_FN(_midgard_php_object_create),
786                 ZEND_ACC_PUBLIC },
787         {"is_in_parent_tree",
788                 ZEND_FN(_midgard_php_object_is_in_parent_tree),
789                 ZEND_ACC_PUBLIC },
790         {"is_in_tree",
791                 ZEND_FN(_midgard_php_object_is_in_tree),
792                 ZEND_ACC_PUBLIC },
793         {"delete",
794                 ZEND_FN(_midgard_php_object_delete),
795                 ZEND_ACC_PUBLIC },
796         {"get_parent",
797                 ZEND_FN(_midgard_php_object_get_parent),
798                 ZEND_ACC_PUBLIC },
799         {"get",
800                 ZEND_FN(_midgard_php_object_get),
801                 ZEND_ACC_PUBLIC },
802         {"list",
803                 ZEND_FN(_midgard_php_object_list),
804                 ZEND_ACC_PUBLIC },
805         {"list_children",
806                 ZEND_FN(_midgard_php_object_list_children),
807                 ZEND_ACC_PUBLIC },
808         {"get_by_path",
809                 ZEND_FN(_midgard_php_object_get_by_path),
810                 ZEND_ACC_PUBLIC },
811         {"parent",
812                 ZEND_FN(_midgard_php_object_parent),
813                 ZEND_ACC_PUBLIC },
814 #ifdef PHP_MIDGARD_LEGACY_API
815         {"listparameters",             
816                 ZEND_FN(mgd_oop_parameter_list),
817                 ZEND_ACC_PUBLIC },
818 #endif
819         {"list_parameters",
820                 ZEND_FN(_php_midgard_object_list_parameters),
821                 ZEND_ACC_PUBLIC },
822         {"find_parameters",
823                 ZEND_FN(_php_midgard_object_find_parameters),
824                 ZEND_ACC_PUBLIC },
825         {"delete_parameters",
826                 ZEND_FN(_php_midgard_object_delete_parameters),
827                 ZEND_ACC_PUBLIC },
828         {"purge_parameters",
829                 ZEND_FN(_php_midgard_object_purge_parameters),
830                 ZEND_ACC_PUBLIC },
831         {"get_parameter",
832                 ZEND_FN(_php_midgard_object_get_parameter),
833                 ZEND_ACC_PUBLIC },
834         {"set_parameter",
835                 ZEND_FN(_php_midgard_object_set_parameter),
836                 ZEND_ACC_PUBLIC },
837         {"parameter",
838                 ZEND_FN(_php_midgard_object_parameter),
839                 ZEND_ACC_PUBLIC },
840 #ifdef PHP_MIDGARD_LEGACY_API
841         {"getattachment",
842                 ZEND_FN(mgd_get_attachment),
843                 ZEND_ACC_PUBLIC },
844         {"createattachment",
845                 ZEND_FN(mgd_oop_attachment_create),
846                 ZEND_ACC_PUBLIC },
847         {"listattachments",
848                 ZEND_FN(mgd_oop_attachment_list),
849                 ZEND_ACC_PUBLIC },
850         {"openattachment",
851                 ZEND_FN(mgd_open_attachment),
852                 ZEND_ACC_PUBLIC },
853         {"serveattachment",
854                 ZEND_FN(mgd_serve_attachment),
855                 ZEND_ACC_PUBLIC },
856         {"deleteattachment",
857                 ZEND_FN(mgd_delete_attachment),
858                 ZEND_ACC_PUBLIC },
859         {"updateattachment",
860                 ZEND_FN(mgd_update_attachment),
861                 ZEND_ACC_PUBLIC },
862 #endif
863         {"get_languages",
864                 ZEND_FN(_php_midgard_object_get_languages),
865                 ZEND_ACC_PUBLIC },
866         {"purge",
867                 ZEND_FN(_php_midgard_object_purge),
868                 ZEND_ACC_PUBLIC },
869         {"undelete",
870                 ZEND_FN(_php_midgard_object_undelete),
871                 ZEND_ACC_STATIC|ZEND_ACC_PUBLIC },
872         {"connect",     
873                 ZEND_FN(_php_midgard_object_connect),
874                 ZEND_ACC_PUBLIC },
875         {"new_query_builder",
876                 ZEND_FN(_php_midgard_new_query_builder),
877                 ZEND_ACC_STATIC|ZEND_ACC_PUBLIC },
878         {"new_collector",
879                 ZEND_FN(_php_midgard_new_collector),
880                 ZEND_ACC_STATIC|ZEND_ACC_PUBLIC },
881         {"new_reflection_property",
882                 ZEND_FN(_php_midgard_new_reflection_property),
883                 ZEND_ACC_STATIC|ZEND_ACC_PUBLIC },
884         {"set_guid",
885                 ZEND_FN(_php_midgard_object_set_guid),
886                 ZEND_ACC_PUBLIC },
887         {"emit",
888                 ZEND_FN(_php_midgard_object_emit),
889                 ZEND_ACC_PUBLIC },
890         {"approve",
891                 ZEND_FN(_php_midgard_object_approve),
892                 ZEND_ACC_PUBLIC },
893         {"is_approved",
894                 ZEND_FN(_php_midgard_object_is_approved),
895                 ZEND_ACC_PUBLIC },
896         {"unapprove",
897                 ZEND_FN(_php_midgard_object_unapprove),
898                 ZEND_ACC_PUBLIC },
899         {"lock",
900                 ZEND_FN(_php_midgard_object_lock),
901                 ZEND_ACC_PUBLIC },
902         {"is_locked",
903                 ZEND_FN(_php_midgard_object_is_locked),
904                 ZEND_ACC_PUBLIC },
905         {"unlock",
906                 ZEND_FN(_php_midgard_object_unlock),
907                 ZEND_ACC_PUBLIC },
908         { NULL, NULL }
909 };
910
911 static void __register_php_classes(const gchar *class_name)
912 {
913         zend_class_entry *mgdclass, *mgdclass_ptr;
914         gint j;
915         guint _am = 0;
916        
917         for (j = 0; __midgard_php_type_functions[j].fname; j++){
918                 _am++;
919         }
920
921         zend_function_entry __functions[_am+1];
922        
923         /* lcn is freed in zend_register_internal_class */
924         gchar *lcn = g_ascii_strdown(class_name, strlen(class_name));
925    
926         __functions[0].fname = lcn;
927         __functions[0].handler = ZEND_FN(_midgard_php_object_constructor);
928         __functions[0].arg_info = NULL;
929         __functions[0].num_args = 0;
930         __functions[0].flags = 0;
931        
932         for (j = 1; __midgard_php_type_functions[j].fname; j++){
933                
934                 __functions[j].fname = __midgard_php_type_functions[j].fname;
935                 __functions[j].handler = __midgard_php_type_functions[j].handler;
936                 __functions[j].arg_info = NULL;
937                 __functions[j].num_args = 0;   
938                 __functions[j].flags = __midgard_php_typ