root/trunk/midgard/apis/python/py_midgard_collector.c

Revision 23623, 13.6 kB (checked in by piotras, 5 months ago)

Fix usability instead of readability.

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 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23 #define NO_IMPORT_PYGOBJECT
24 #include "py_midgard.h"
25
26 PyTypeObject G_GNUC_INTERNAL Pymidgard_collector_Type;
27
28 #define COLLECTOR_DEBUG(__name) \
29         CHECK_MGD; \
30         CLASS_METHOD_DEBUG(Pymidgard_collector_Type.tp_name, __name);
31
32 static int
33 __collector_constructor(PyGObject *self, PyObject *args, PyObject *kwargs)
34 {
35         COLLECTOR_DEBUG("__init__");
36         const gchar *classname;
37         const gchar *domain;
38         PyObject *pvalue = NULL;
39         GValue *cvalue = NULL;
40         if(!PyArg_ParseTuple(args, "ssO", &classname, &domain, &pvalue))
41                 return -1;
42        
43         MidgardConnection *mgd =
44                 _py_midgard_connection_singleton_get();
45
46         if(pvalue != NULL) {
47                
48                 GValue gval = gvalue_from_pyobject(pvalue);
49                 py_midgard_gvalue_from_pyobject(&gval, pvalue);
50                 cvalue = g_new0(GValue, 1);
51                 g_value_init(cvalue, G_VALUE_TYPE(&gval));
52                 g_value_copy((const GValue *) &gval, cvalue);
53                 g_value_unset(&gval);
54         }
55
56         MidgardCollector *mc =
57                 midgard_collector_new(mgd, classname, domain, cvalue);
58
59         if(!mc) return -1;
60        
61         self->obj = G_OBJECT(mc);
62        
63         return 0;
64 }
65
66 static PyObject *
67 pymidgard_collector_set_key_property(PyGObject *self, PyObject *args)
68 {
69         COLLECTOR_DEBUG("set_key_property");
70         const gchar *key;
71         PyObject *pvalue = NULL;
72         GValue *cvalue = NULL;
73
74         if(!PyArg_ParseTuple(args, "s|O", &key, &pvalue))
75                 return NULL;
76        
77         if(pvalue != NULL) {
78
79                 GValue gval = gvalue_from_pyobject(pvalue);
80                 py_midgard_gvalue_from_pyobject(&gval, pvalue);
81                 cvalue = g_new0(GValue, 1);
82                 g_value_init(cvalue, G_VALUE_TYPE(&gval));
83                 g_value_copy((const GValue *) &gval, cvalue);
84                 g_value_unset(&gval);
85         }
86
87         if(midgard_collector_set_key_property(
88                                 MIDGARD_COLLECTOR(self->obj), key, cvalue))
89                 Py_RETURN_TRUE;
90
91         Py_RETURN_FALSE;
92 }
93
94 static PyObject *
95 pymidgard_collector_add_value_property(PyGObject *self, PyObject *args)
96 {
97         COLLECTOR_DEBUG("add_value_property");
98         const gchar *property;
99
100         if(!PyArg_ParseTuple(args, "s", &property))
101                 return NULL;
102
103         if(midgard_collector_add_value_property(
104                                 MIDGARD_COLLECTOR(self->obj), property))
105                 Py_RETURN_TRUE;
106
107         Py_RETURN_FALSE;
108 }
109        
110 static PyObject *
111 pymidgard_collector_set(PyGObject *self, PyObject *args)
112 {
113         COLLECTOR_DEBUG("set");
114         const gchar *key, *subkey;
115         PyObject *pvalue = NULL;
116         GValue *cvalue = NULL;
117
118         if(!PyArg_ParseTuple(args, "ssO", &key, &subkey, &pvalue))
119                 return NULL;
120        
121         if(pvalue != NULL) {
122
123                 GValue gval = gvalue_from_pyobject(pvalue);
124                 py_midgard_gvalue_from_pyobject(&gval, pvalue);
125                 cvalue = g_new0(GValue, 1);
126                 g_value_init(cvalue, G_VALUE_TYPE(&gval));
127                 g_value_copy((const GValue *) &gval, cvalue);
128                 g_value_unset(&gval);
129         }
130
131         if(midgard_collector_set(MIDGARD_COLLECTOR(self->obj), key, subkey, cvalue))
132                 Py_RETURN_TRUE;
133
134         Py_RETURN_FALSE;
135 }
136
137 static void __count_gdata_keys(GQuark key_id,
138                 gpointer data, gpointer user_data)
139 {
140         MidgardTypeHolder *holder = (MidgardTypeHolder *) user_data;
141         holder->elements++;
142 }
143
144 static void __update_list(GQuark key_id,
145                 gpointer data, gpointer user_data)
146 {
147         PyObject *list = (PyObject *) user_data;
148         PyObject *pvalue = NULL;
149         GValue *gvalue = (GValue *) data;
150
151         if (gvalue == NULL)
152                 return;
153        
154         py_midgard_gvalue_from_pyobject(gvalue, pvalue);
155         gint i = PyTuple_Size(list);
156         PyTuple_SetItem(list, i++, pvalue);
157 }
158
159 static PyObject *
160 pymidgard_collector_get(PyGObject *self, PyObject *args)
161 {
162         COLLECTOR_DEBUG("get");
163         const gchar *key;
164
165         if(!PyArg_ParseTuple(args, "s", &key))
166                 return NULL;
167
168         GData *keyslist =
169                 midgard_collector_get(MIDGARD_COLLECTOR(self->obj), key);
170
171         if(keyslist == NULL)
172                 Py_RETURN_NONE;
173
174         /* Initialize tuple list */
175         MidgardTypeHolder *holder = g_new(MidgardTypeHolder, 1);
176         g_datalist_foreach(&keyslist, __count_gdata_keys, holder);
177         PyObject *list = PyTuple_New(holder->elements);
178
179         /* Fill list */
180         g_datalist_foreach(&keyslist, __update_list, list);
181         return list;
182 }
183
184 static PyObject *
185 pymidgard_collector_get_subkey(PyGObject *self, PyObject *args)
186 {
187         COLLECTOR_DEBUG("get_subkey");
188         const gchar *key, *subkey;
189
190         if(!PyArg_ParseTuple(args, "ss", &key, &subkey))
191                 return NULL;
192
193         GValue *gval =
194                 midgard_collector_get_subkey(MIDGARD_COLLECTOR(self->obj), key, subkey);
195
196         if(gval == NULL)
197                 Py_RETURN_NONE;
198
199         PyObject *pvalue = pyg_value_as_pyobject((const GValue *)gval, FALSE);
200
201         return pvalue;
202 }
203
204 static PyObject *
205 pymidgard_collector_list_keys(PyGObject *self, PyObject *args)
206 {
207         COLLECTOR_DEBUG("list_keys");
208
209         if(!PyArg_ParseTuple(args, ""))
210                 return NULL;
211
212         guint i = 0;
213         PyObject *list;
214         gchar **keys =
215                 midgard_collector_list_keys(MIDGARD_COLLECTOR(self->obj));
216
217         if(keys == NULL) {
218                
219                 list = PyTuple_New(i);
220                 return list;
221         }
222
223         while(keys[i] != NULL)
224                 i++;
225
226         list = PyTuple_New(i);
227
228         i = 0;
229         while(keys[i] != NULL) {
230                
231                 PyObject *strname = PyString_FromString(keys[i]);
232                 PyTuple_SetItem(list, i, strname);
233                 i++;
234         }
235
236         g_free(keys);
237
238         return list;
239 }
240
241 static PyObject *
242 pymidgard_collector_merge(PyGObject *self, PyObject *args)
243 {
244         COLLECTOR_DEBUG("merge");
245         PyObject *pmc;
246         gboolean overwrite = FALSE;
247        
248         if(!PyArg_ParseTuple(args, "O|b", &pmc, &overwrite))
249                 return NULL;
250
251         MidgardCollector *mc = MIDGARD_COLLECTOR(((PyGObject *)pmc)->obj);
252         MidgardCollector *uc = MIDGARD_COLLECTOR(self->obj);
253
254         if(midgard_collector_merge(uc, mc, overwrite))
255                 Py_RETURN_TRUE;
256
257         Py_RETURN_FALSE;
258 }
259
260 static PyObject *
261 pymidgard_collector_remove_key(PyGObject *self, PyObject *args)
262 {
263         COLLECTOR_DEBUG("remove_key");
264         const gchar *key;
265
266         if(!PyArg_ParseTuple(args, "s", &key))
267                 return NULL;
268
269         if(midgard_collector_remove_key(MIDGARD_COLLECTOR(self->obj), key))
270                 Py_RETURN_TRUE;
271
272         Py_RETURN_FALSE;
273 }
274
275 /* QB overwritten methods */
276
277 static PyObject *
278 pymidgard_collector_add_constraint(PyGObject *self, PyObject *args)
279 {
280         COLLECTOR_DEBUG("add_constraint");     
281         const gchar *prop, *op;
282         PyObject *pvalue;
283         gboolean added;
284         if(!PyArg_ParseTuple(args, "ssO", &prop, &op, &pvalue))
285                 return NULL;
286
287         MidgardCollector *collector =
288                 MIDGARD_COLLECTOR(self->obj);
289
290         GValue gval = gvalue_from_pyobject(pvalue);     
291         py_midgard_gvalue_from_pyobject(&gval, pvalue);
292
293         added = midgard_collector_add_constraint(collector, prop, op, &gval);
294
295         if(added)
296                 Py_RETURN_TRUE;
297
298         Py_RETURN_FALSE;
299 }
300
301 static PyObject *
302 pymidgard_collector_add_constraint_with_property(PyGObject *self, PyObject *args)
303 {
304         COLLECTOR_DEBUG("add_constraint_with_property");       
305         const gchar *prop_a, *op, *prop_b;
306         // PyObject *pvalue;
307         gboolean added;
308         if(!PyArg_ParseTuple(args, "sss", &prop_a, &op, &prop_b))
309                 return NULL;
310
311         MidgardCollector *collector =
312                 MIDGARD_COLLECTOR(self->obj);
313
314         added = midgard_collector_add_constraint_with_property(
315                         collector, prop_a, op, prop_b);
316
317         if(added)
318                 Py_RETURN_TRUE;
319
320         Py_RETURN_FALSE;
321 }
322
323 static PyObject *
324 pymidgard_collector_begin_group(PyGObject *self, PyObject *args)
325 {
326         COLLECTOR_DEBUG("begin_group");
327         const gchar *group_op;
328         if(!PyArg_ParseTuple(args, "s", &group_op))
329                 return NULL;
330
331         MidgardCollector *collector =
332                 MIDGARD_COLLECTOR(self->obj);
333
334         if(midgard_collector_begin_group(collector, group_op))
335                 Py_RETURN_TRUE;
336
337         Py_RETURN_FALSE;
338 }
339
340 static PyObject *
341 pymidgard_collector_end_group(PyGObject *self, PyObject *args)
342 {
343         COLLECTOR_DEBUG("end_group");
344        
345         if(!PyArg_ParseTuple(args, ""))
346                 return NULL;
347
348         MidgardCollector *collector =
349                 MIDGARD_COLLECTOR(self->obj);
350        
351         if(midgard_collector_end_group(collector))
352                 Py_RETURN_TRUE;
353
354         Py_RETURN_FALSE;
355 }
356
357 static PyObject *
358 pymidgard_collector_add_order(PyGObject *self, PyObject *args)
359 {
360         COLLECTOR_DEBUG("add_order");
361        
362         const gchar *prop, *order;
363         if(!PyArg_ParseTuple(args, "ss", &prop, &order))
364                 return NULL;
365
366         MidgardCollector *collector =
367                 MIDGARD_COLLECTOR(self->obj);
368
369         if(midgard_collector_add_order(collector, prop, order))
370                 Py_RETURN_TRUE;
371
372         Py_RETURN_FALSE;
373 }
374
375 static PyObject *
376 pymidgard_collector_set_offset(PyGObject *self, PyObject *args)
377 {
378         COLLECTOR_DEBUG("set_offset");
379        
380         guint offset;
381         if(!PyArg_ParseTuple(args, "i", &offset))
382                 return NULL;
383
384         MidgardCollector *collector =
385                 MIDGARD_COLLECTOR(self->obj);
386
387         midgard_collector_set_offset(collector, offset);
388
389         Py_RETURN_NONE;
390 }
391
392 static PyObject *
393 pymidgard_collector_set_limit(PyGObject *self, PyObject *args)
394 {
395         COLLECTOR_DEBUG("set_limit");
396        
397         long limit;
398         if(!PyArg_ParseTuple(args, "l", &limit))
399                 return NULL;
400
401         MidgardCollector *collector =
402                 MIDGARD_COLLECTOR(self->obj);
403
404         midgard_collector_set_limit(collector, limit);
405
406         Py_RETURN_NONE;
407 }
408
409 static PyObject *
410 pymidgard_collector_count(PyGObject *self, PyObject *args)
411 {
412         COLLECTOR_DEBUG("count");
413        
414         Py_RETURN_NONE;
415         /* FIXME
416         MidgardCollector *collector = MIDGARD_COLLECTOR(self->obj);
417
418         guint counted = midgard_collector_count(collector);
419
420         return Py_BuildValue("i", counted);
421         */
422 }
423
424 static PyObject *
425 pymidgard_collector_include_deleted(PyGObject *self, PyObject *args)
426 {
427         COLLECTOR_DEBUG("include_deleted");
428        
429         if(!PyArg_ParseTuple(args, ""))
430                 return NULL;
431
432         MidgardCollector *collector =
433                 MIDGARD_COLLECTOR(self->obj);
434
435         midgard_collector_include_deleted(collector);
436
437         Py_RETURN_NONE;
438 }
439
440 static PyObject *
441 pymidgard_collector_execute(PyGObject *self, PyObject *args)
442 {
443         COLLECTOR_DEBUG("execute");
444
445         if(!PyArg_ParseTuple(args, ""))
446                 return NULL;
447
448         midgard_collector_execute(MIDGARD_COLLECTOR(self->obj));
449
450         Py_RETURN_NONE;
451 }
452
453 static PyMethodDef pymidgard_collector_methods[] = {
454         { "set_key_property", (PyCFunction)pymidgard_collector_set_key_property, METH_VARARGS },
455         { "add_value_property", (PyCFunction)pymidgard_collector_add_value_property, METH_VARARGS },
456         { "set", (PyCFunction)pymidgard_collector_set, METH_VARARGS },
457         { "get", (PyCFunction)pymidgard_collector_get, METH_VARARGS },
458         { "get_subkey", (PyCFunction)pymidgard_collector_get_subkey, METH_VARARGS },
459         { "list_keys", (PyCFunction)pymidgard_collector_list_keys, METH_VARARGS },
460         { "merge", (PyCFunction)pymidgard_collector_merge, METH_VARARGS },
461         { "remove_key", (PyCFunction)pymidgard_collector_remove_key, METH_VARARGS },   
462         { "add_constraint", (PyCFunction)pymidgard_collector_add_constraint, METH_VARARGS },
463         { "add_constraint_with_property",
464                 (PyCFunction)pymidgard_collector_add_constraint_with_property, METH_VARARGS },
465         { "begin_group", (PyCFunction)pymidgard_collector_begin_group, METH_VARARGS },
466         { "end_group", (PyCFunction)pymidgard_collector_end_group, METH_VARARGS },
467         { "set_offset", (PyCFunction)pymidgard_collector_set_offset, METH_VARARGS },
468         { "set_limit", (PyCFunction)pymidgard_collector_set_limit, METH_VARARGS },
469         { "add_order", (PyCFunction)pymidgard_collector_add_order, METH_VARARGS },
470         { "include_deleted", (PyCFunction)pymidgard_collector_include_deleted, METH_VARARGS },
471         { "count", (PyCFunction)pymidgard_collector_count, METH_NOARGS },
472
473         { "execute", (PyCFunction)pymidgard_collector_execute, METH_VARARGS },
474         { NULL, NULL, 0 }
475 };
476
477 PyTypeObject G_GNUC_INTERNAL Pymidgard_collector_Type = {
478     PyObject_HEAD_INIT(NULL)
479     0,                                 /* ob_size */
480     "collector",                   /* tp_name */
481     sizeof(PyGObject),          /* tp_basicsize */
482     0,                                 /* tp_itemsize */
483     /* methods */
484     (destructor)_py_midgard_gobject_destructor,        /* tp_dealloc */
485     (printfunc)0,                      /* tp_print */
486     (getattrfunc)0,       /* tp_getattr */
487     (setattrfunc)0,       /* tp_setattr */
488     (cmpfunc)0,           /* tp_compare */
489     (reprfunc)0,             /* tp_repr */
490     (PyNumberMethods*)0,     /* tp_as_number */
491     (PySequenceMethods*)0, /* tp_as_sequence */
492     (PyMappingMethods*)0,   /* tp_as_mapping */
493     (hashfunc)0,             /* tp_hash */
494     (ternaryfunc)0,          /* tp_call */
495     (reprfunc)0,              /* tp_str */
496     (getattrofunc)0,     /* tp_getattro */
497     (setattrofunc)0,     /* tp_setattro */
498     (PyBufferProcs*)0,  /* tp_as_buffer */
499     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,                      /* tp_flags */
500     "MidgardCollector",                        /* Documentation string */
501     (traverseproc)0,     /* tp_traverse */
502     (inquiry)0,             /* tp_clear */
503     (richcmpfunc)0,   /* tp_richcompare */
504     offsetof(PyGObject, weakreflist),             /* tp_weaklistoffset */
505     (getiterfunc)0,          /* tp_iter */
506     (iternextfunc)0,     /* tp_iternext */
507     pymidgard_collector_methods, /* tp_methods */
508     (struct PyMemberDef*)0,              /* tp_members */
509     (struct PyGetSetDef*)0,  /* tp_getset */
510     NULL,                              /* tp_base */
511     NULL,                              /* tp_dict */
512     (descrgetfunc)0,    /* tp_descr_get */
513     (descrsetfunc)0,    /* tp_descr_set */
514     offsetof(PyGObject, inst_dict),                 /* tp_dictoffset */
515     (initproc)__collector_constructor,             /* tp_init */
516     (allocfunc)0,           /* tp_alloc */
517     (newfunc)0,               /* tp_new */
518     (freefunc)0,             /* tp_free */
519     (inquiry)0              /* tp_is_gc */
520 };
521
522 void py_midgard_collector_register_class(
523                 PyObject *d, gpointer ot)
524 {
525         pygobject_register_class(d,
526                         "collector",
527                         MIDGARD_TYPE_COLLECTOR,
528                         &Pymidgard_collector_Type, NULL); /* FIXME, collector is not subclass of QB */
529                         //Py_BuildValue("(O)", ot));
530
531 }
532
533 PyTypeObject py_midgard_collector_get_type_object(void)
534 {
535         return Pymidgard_collector_Type;
536 }
537
Note: See TracBrowser for help on using the browser.