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

Revision 18417, 12.9 kB (checked in by piotras, 1 month ago)

Enable replicator class

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /* Copyright (C) 2006, 2007 Piotr Pokora <piotrek.pokora@gmail.com>
2  * This program is free software; you can redistribute it and/or modify it
3  * under the terms of the GNU Lesser General Public License as published
4  * by the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 #include "php_midgard.h"
18 #include "php_midgard_gobject.h"
19
20 static zend_class_entry *php_midgard_collector_class;
21
22 /* Object constructor */
23 static PHP_METHOD(midgard_collector, __construct)
24 {
25         RETVAL_FALSE;
26         CHECK_MGD;
27         gchar *classname, *propname;   
28         guint classname_length, propname_length;
29         zval *value;
30         MidgardConnection *mgd = mgd_handle();
31         zend_class_entry **ce_arg = NULL, *ce_base = NULL;
32         zval *zval_object = getThis();
33
34         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssz",
35                                 &classname, &classname_length,
36                                 &propname, &propname_length,
37                                 &value) == FAILURE) {
38                 return;
39         }
40
41         /* Get base schema class name */
42         gchar *_classname = g_ascii_strdown(classname, classname_length);
43         zend_lookup_class(classname, classname_length, &ce_arg TSRMLS_DC);
44        
45         if(ce_arg == NULL) {
46                 php_error(E_WARNING,
47                                 "Class '%s' is not registered PHP class", classname);
48                 g_free(_classname);
49                 return;
50         }
51        
52         g_free(_classname);
53
54         ce_base = php_midgard_get_baseclass_ptr(*ce_arg);
55        
56         if(ce_base == NULL) {
57                 php_error(E_WARNING,
58                                 "Couldn't find internal base class for derived '%s'",
59                                 classname);
60         }
61
62         MidgardObjectClass *klass =
63                 MIDGARD_OBJECT_GET_CLASS_BY_NAME(ce_base->name);
64        
65         if(!klass){
66                 php_error(E_WARNING,
67                                 "%s is not registered Midgard schema class", ce_base->name);
68                 return;
69         }
70
71         GValue *gvalue = php_midgard_zval2gvalue(value);
72
73         MidgardCollector *object =
74                 midgard_collector_new(mgd, ce_base->name, propname, gvalue);
75
76         if(!object)
77                 return;
78
79         php_midgard_gobject *php_gobject =
80                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
81         php_gobject->gobject = G_OBJECT(object);
82 }
83
84 static PHP_METHOD(midgard_collector, set_key_property)
85 {
86         RETVAL_FALSE;
87         CHECK_MGD;
88         gchar *propname;
89         guint propname_length;
90         zval *zvalue;
91         gboolean rv;
92         GValue *gvalue = NULL;
93         zval *zval_object = getThis();
94
95         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z",
96                                 &propname, &propname_length, &zvalue)
97                         == FAILURE) {
98                 return;
99         }
100
101         php_midgard_gobject *php_gobject =
102                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
103         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
104
105         rv = midgard_collector_set_key_property(object, propname, gvalue);
106        
107         RETURN_BOOL(rv);
108 }
109
110 static PHP_METHOD(midgard_collector, add_value_property)
111 {
112         RETVAL_FALSE;
113         CHECK_MGD;
114         gchar *propname;
115         guint propname_length;
116         zval *zval_object = getThis();
117        
118         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
119                                 &propname, &propname_length) == FAILURE)
120                 return;
121        
122         php_midgard_gobject *php_gobject =
123                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
124         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
125
126         RETURN_BOOL(midgard_collector_add_value_property(object, propname));
127 }
128
129 static PHP_METHOD(midgard_collector, set)
130 {
131         CHECK_MGD;
132         RETVAL_TRUE;
133         gchar *key, *subkey;
134         guint key_length, subkey_length;
135         zval *zvalue;
136         zval *zval_object = getThis();
137
138         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssz",
139                                 &key, &key_length,
140                                 &subkey, &subkey_length, &zvalue) == FAILURE)
141                 return;
142
143         php_midgard_gobject *php_gobject =
144                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
145         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
146
147         GValue *gvalue = php_midgard_zval2gvalue(zvalue);
148         gboolean rv =
149                 midgard_collector_set(object, key, subkey, gvalue);     
150
151         RETURN_BOOL(rv);
152 }
153
154 static void __colector_update_zend_hash(GQuark key_id,
155                                 gpointer data, gpointer user_data)
156 {
157         zval *zend_hash = (zval *) user_data;
158         GValue *gvalue = (GValue *) data;
159        
160         if(gvalue == NULL)
161                 return;
162        
163         zval *zvalue;
164         MAKE_STD_ZVAL(zvalue);
165         /* FIXME, we need to get underlying object here */
166         php_midgard_gvalue2zval(gvalue, zvalue);
167        
168         add_assoc_zval(zend_hash,
169                         (gchar *)g_quark_to_string(key_id),
170                         zvalue);
171         return;
172 }
173
174 static PHP_METHOD(midgard_collector, get)
175 {
176         RETVAL_FALSE;
177         CHECK_MGD;
178         gchar *key;
179         guint key_length;
180         zval *zval_object = getThis();
181
182         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
183                                 &key, &key_length) == FAILURE)
184                 return;
185
186         php_midgard_gobject *php_gobject =
187                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
188         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
189
190         array_init(return_value);       
191
192         GData *keyslist = midgard_collector_get(object, (const gchar *)key);
193        
194         if(keyslist != NULL){
195                 g_datalist_foreach(&keyslist,
196                                 __colector_update_zend_hash,
197                                 return_value);
198         }
199 }
200
201 static PHP_METHOD(midgard_collector, get_subkey)
202 {
203         RETVAL_FALSE;
204         CHECK_MGD;     
205         const gchar *key, *subkey;
206         guint key_length, subkey_length;
207         zval *zval_object = getThis();
208
209         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
210                                 &key, &key_length, &subkey, &subkey_length) == FAILURE)
211                 return;
212        
213         php_midgard_gobject *php_gobject =
214                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
215         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
216
217         GValue *gvalue =
218                 midgard_collector_get_subkey(object, key, subkey);     
219
220         if(!gvalue)
221                 return;
222        
223         php_midgard_gvalue2zval(gvalue, return_value); 
224 }
225
226 static PHP_METHOD(midgard_collector, remove_key)
227 {
228         RETVAL_FALSE;
229         CHECK_MGD;
230         const gchar *key;
231         guint key_length;
232         zval *zval_object = getThis();
233
234         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
235                                 &key, &key_length) == FAILURE)
236                 return;
237
238         php_midgard_gobject *php_gobject =
239                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
240         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
241
242         RETURN_BOOL(midgard_collector_remove_key(object, key));
243 }
244
245 static PHP_METHOD(midgard_collector, merge)
246 {
247         CHECK_MGD;
248         RETVAL_FALSE;
249         zval *zobject;
250         zend_bool zbool = FALSE;
251         zval *zval_object = getThis();
252        
253         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|b",
254                                 &zobject, php_midgard_collector_class, &zbool) == FAILURE)
255                 return;
256
257         php_midgard_gobject *php_gobject =
258                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
259         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
260
261         php_midgard_gobject *php_gobject_param =
262                 (php_midgard_gobject *)zend_object_store_get_object(zobject TSRMLS_CC);
263         MidgardCollector *mc = MIDGARD_COLLECTOR(php_gobject_param->gobject);
264        
265         RETURN_BOOL(midgard_collector_merge(object, mc, zbool));
266 }
267
268 static PHP_METHOD(midgard_collector, list_keys)
269 {
270         RETVAL_FALSE;
271         CHECK_MGD;
272         zval *zval_object = getThis();
273
274         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS)
275                 return;
276
277         php_midgard_gobject *php_gobject =
278                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
279         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
280        
281         array_init(return_value);
282        
283         gchar **keys =
284                 midgard_collector_list_keys(object);
285        
286         if(!keys)
287                 return;
288        
289         guint i = 0;
290         while(keys[i] != NULL) {
291                 add_assoc_string(return_value,
292                                 (gchar *)keys[i], "", 1);
293                 i++;
294         }
295
296         g_free(keys);
297 }
298
299 static PHP_METHOD(midgard_collector, add_constraint)
300 {
301         RETVAL_FALSE;
302         CHECK_MGD;
303         gchar *name, *op;
304         guint name_length, op_length;
305         zval *value;
306         zval *zval_object = getThis();
307         gboolean rv;
308        
309         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssz",
310                                 &name, &name_length,
311                                 &op, &op_length, &value) != SUCCESS)
312                 return;
313        
314         GValue *gvalue = php_midgard_zval2gvalue(value);
315        
316         php_midgard_gobject *php_gobject =
317                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
318         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
319
320         rv = midgard_collector_add_constraint(object, name, op, gvalue);
321        
322         g_value_unset(gvalue);
323         g_free(gvalue);
324
325         RETURN_BOOL(rv);
326 }
327
328 static PHP_METHOD(midgard_collector, begin_group)
329 {
330         CHECK_MGD;
331         RETVAL_FALSE;
332         gchar *type;
333         guint type_length;
334         zval *zval_object = getThis();
335
336         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
337                                 &type, &type_length) != SUCCESS)
338                 return;
339        
340         php_midgard_gobject *php_gobject =
341                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
342         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
343
344         RETURN_BOOL(midgard_collector_begin_group(object, type));
345 }
346
347 static PHP_METHOD(midgard_collector, end_group)
348 {
349         RETVAL_FALSE;
350         CHECK_MGD;
351         zval *zval_object = getThis();
352
353         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS)
354                 return;
355
356         php_midgard_gobject *php_gobject =
357                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
358         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
359
360         RETURN_BOOL(midgard_collector_end_group(object));
361 }
362
363 static PHP_METHOD(midgard_collector, add_order)
364 {
365         RETVAL_FALSE;
366         CHECK_MGD;
367         const gchar *field, *order = "ASC";
368         guint field_length, order_length;
369         zval *zval_object = getThis();
370
371         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s",
372                                 &field, &field_length, &order, &order_length) != SUCCESS)
373                 return;
374        
375         php_midgard_gobject *php_gobject =
376                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
377         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
378
379         RETURN_BOOL(midgard_collector_add_order(object, field, order));
380 }
381
382 static PHP_METHOD(midgard_collector, set_offset)
383 {
384         RETVAL_FALSE;
385         CHECK_MGD;
386         zval *zval_object = getThis();
387         long offset;
388
389         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &offset) != SUCCESS)
390                 return;
391        
392         if (offset < 0) {
393
394                 php_error(E_WARNING, "Ignoring a negative query offset");
395                 return;
396
397         }
398        
399         php_midgard_gobject *php_gobject =
400                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
401         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
402        
403         midgard_collector_set_offset(object, offset);
404
405         RETURN_TRUE;
406 }
407
408 static PHP_METHOD(midgard_collector, set_limit)
409 {
410         RETVAL_FALSE;
411         CHECK_MGD;
412         long limit;
413         zval *zval_object = getThis();
414
415         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &limit) != SUCCESS)
416                 return;
417        
418         if (limit < 0) {
419
420                 php_error(E_WARNING, "Ignoring a negative query limit");
421                 return;
422         }
423
424         php_midgard_gobject *php_gobject =
425                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
426         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
427
428         midgard_collector_set_limit(object, limit);
429
430         RETURN_TRUE;
431 }
432
433 static PHP_METHOD(midgard_collector, execute)
434 {
435         RETVAL_FALSE;
436         CHECK_MGD;
437         zval *zval_object = getThis();
438
439         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS)
440                 return;
441
442         php_midgard_gobject *php_gobject =
443                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
444         MidgardCollector *object = MIDGARD_COLLECTOR(php_gobject->gobject);
445        
446         RETURN_BOOL(midgard_collector_execute(object));         
447 }
448
449 void php_midgard_collector_init(int module_number)
450 {
451         static function_entry collector_methods[] = {
452                 PHP_ME(midgard_collector,       __construct,            NULL, ZEND_ACC_PUBLIC)
453                 PHP_ME(midgard_collector,       set_key_property,       NULL, ZEND_ACC_PUBLIC)
454                 PHP_ME(midgard_collector,       add_value_property,     NULL, ZEND_ACC_PUBLIC)
455                 PHP_ME(midgard_collector,       set,                    NULL, ZEND_ACC_PUBLIC)
456                 PHP_ME(midgard_collector,       get,                    NULL, ZEND_ACC_PUBLIC)
457                 PHP_ME(midgard_collector,       get_subkey,             NULL, ZEND_ACC_PUBLIC)
458                 PHP_ME(midgard_collector,       merge,                  NULL, ZEND_ACC_PUBLIC)
459                 PHP_ME(midgard_collector,       list_keys,              NULL, ZEND_ACC_PUBLIC)
460                 PHP_ME(midgard_collector,       remove_key,             NULL, ZEND_ACC_PUBLIC)
461                 PHP_ME(midgard_collector,       add_constraint,         NULL, ZEND_ACC_PUBLIC)
462                 PHP_ME(midgard_collector,       begin_group,            NULL, ZEND_ACC_PUBLIC)
463                 PHP_ME(midgard_collector,       end_group,              NULL, ZEND_ACC_PUBLIC)
464                 PHP_ME(midgard_collector,       add_order,              NULL, ZEND_ACC_PUBLIC)
465                 PHP_ME(midgard_collector,       set_offset,             NULL, ZEND_ACC_PUBLIC)
466                 PHP_ME(midgard_collector,       set_limit,              NULL, ZEND_ACC_PUBLIC)
467                 PHP_ME(midgard_collector,       execute,                NULL, ZEND_ACC_PUBLIC)
468                 {NULL, NULL, NULL}
469         };
470        
471         static zend_class_entry php_midgard_collector_class_entry;
472
473         INIT_CLASS_ENTRY(
474                         php_midgard_collector_class_entry,
475                         "midgard_collector", collector_methods);
476
477         php_midgard_collector_class =
478                 midgard_php_register_internal_class(
479                                 "midgard_collector",
480                                 MIDGARD_TYPE_COLLECTOR,
481                                 php_midgard_collector_class_entry,                     
482                                 collector_methods);
483
484         /* Set function to initialize underlying data */
485         php_midgard_collector_class->create_object = php_midgard_gobject_new;
486 }
Note: See TracBrowser for help on using the browser.