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

Revision 24366, 9.8 kB (checked in by piotras, 4 months ago)

Repleace MgdObject? with MidgardObject?. Refs #1515

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 //#include "frameobject.h"
26
27 PyTypeObject G_GNUC_INTERNAL Pymidgard_replicator_Type;
28
29 #define REPLICATOR_DEBUG(__name) \
30         CHECK_MGD; \
31         CLASS_METHOD_DEBUG(Pymidgard_replicator_Type.tp_name, __name);
32        
33 static PyObject *
34 pymidgard_replicator_serialize(PyGObject *self, PyObject *args)
35 {
36         REPLICATOR_DEBUG("serialize");
37         // MidgardObject *mobject;
38         PyObject *pobject;
39
40         if(!PyArg_ParseTuple(args, "O", &pobject))
41                 return NULL;
42
43         gchar *srld = midgard_replicator_serialize(G_OBJECT(((PyGObject *)pobject)->obj));
44
45         PyObject *ret = Py_BuildValue("s", srld);
46         g_free(srld);
47
48         return ret;
49 }
50
51 static PyObject *
52 pymidgard_replicator_export(PyGObject *self, PyObject *args)
53 {       
54         REPLICATOR_DEBUG("export");
55         PyObject *pobject;
56
57         if(!PyArg_ParseTuple(args, "O", &pobject))
58                 return NULL;
59        
60         gboolean exported =
61                 midgard_replicator_export(MIDGARD_DBOBJECT(((PyGObject *)pobject)->obj));
62
63         if(exported)
64                 Py_RETURN_TRUE;
65
66         Py_RETURN_FALSE;
67 }
68
69 static PyObject *
70 pymidgard_replicator_export_purged(PyGObject *self, PyObject *args)
71 {
72         REPLICATOR_DEBUG("export_purged");
73         const gchar *classname, *startdate = NULL, *enddate = NULL;
74
75         if(!PyArg_ParseTuple(args, "s|ss", &classname, &startdate, &enddate))
76                 return NULL;
77        
78         MidgardObjectClass *klass =
79                 MIDGARD_OBJECT_GET_CLASS_BY_NAME(classname);
80
81         if(!klass) {
82                 PyErr_SetString(PyExc_SystemError, "Can not replicate object. Invalid class name");
83                 return NULL;
84         }
85
86         MidgardConnection *mgd =
87                 _py_midgard_connection_singleton_get();
88
89         gchar *xml = midgard_replicator_export_purged (mgd, klass, startdate, enddate);
90        
91         PyObject *ret = Py_BuildValue("s", xml);
92         g_free(xml);
93
94         return ret;
95 }
96
97 static PyObject *
98 pymidgard_replicator_export_blob(PyGObject *self, PyObject *args)
99 {
100         REPLICATOR_DEBUG("export_blob");
101         PyObject *pobject;
102        
103         if(!PyArg_ParseTuple(args, "O", &pobject))
104                 return NULL;
105        
106         gchar *xml = midgard_replicator_export_blob(MIDGARD_OBJECT(((PyGObject *)pobject)->obj));
107
108         PyObject *ret = Py_BuildValue("s", xml);
109         g_free(xml);
110        
111         return ret;
112 }
113
114 static PyObject *
115 pymidgard_replicator_export_media(PyGObject *self, PyObject *args)
116 {
117         return NULL;
118         REPLICATOR_DEBUG("export_media");
119 #warning "pymidgard_replicator_export_media() is not implemented"
120         g_warning("FIXME, it's not implemented");
121 }
122
123 static PyObject *
124 pymidgard_replicator_unserialize(PyGObject *self, PyObject *args)
125 {
126         REPLICATOR_DEBUG("unserialize");
127         const gchar *xml;
128         gboolean force = FALSE;
129         PyObject *list;
130
131         if(!PyArg_ParseTuple(args, "s|b", &xml, &force))
132                 return NULL;
133
134         MidgardConnection *mgd =
135                 _py_midgard_connection_singleton_get();
136
137         guint i = 0;
138         GObject **objects = midgard_replicator_unserialize(mgd, xml, force);
139
140         if(objects == NULL) {
141                
142                 list = PyTuple_New(i);
143                 return list;
144         }
145
146         while(objects[i] != NULL)
147                 i++;
148        
149         list = PyTuple_New(i);
150         OBJECTS2LIST(objects, list);
151         g_free(objects);
152        
153         return list;
154 }
155
156 int _py_midgard_convert_dbobject(PyObject *object, void *arg)
157 {
158         PyObject *pclass = NULL, *pcname = NULL;
159         int ret = 0;
160
161         pclass = PyObject_GetAttrString(object, "__class__");
162         if (!pclass) {
163
164                 PyErr_SetString(PyExc_TypeError, "Didn't find a class for given object.");
165                 return ret;
166         }
167
168         pcname = PyObject_GetAttrString(pclass, "__name__");
169         if(!pcname) {
170
171                 PyErr_SetString(PyExc_TypeError, "Didn't find a class name for given object.");
172                 return ret;
173         }
174
175         GType type = g_type_from_name(PyString_AS_STRING(pcname));
176
177         ret = 1;
178
179         if(g_type_parent(type) != MIDGARD_TYPE_DBOBJECT) {
180
181                 if(g_type_parent(type) != MIDGARD_TYPE_OBJECT) {
182                
183                         PyErr_SetString(PyExc_TypeError, "Expected midgard_dbobject (or derived) class instance.");
184                         ret = 0;
185                
186                 } else {
187
188                         ret = 1;
189                 }
190         }
191
192         if(ret == 1) {
193
194                 if(G_OBJECT(((PyGObject *)object)->obj) == NULL) {
195                        
196                         PyErr_SetString(PyExc_TypeError, "Can not find underlying GObject object.");
197                         ret = 0;
198                 }
199         }
200
201         arg = (void *)MIDGARD_OBJECT(((PyGObject *)object)->obj);
202         g_assert(arg != NULL);
203
204         return ret;
205 }
206
207 static int __py_midgard_parse_dbobject(PyObject *object)
208 {
209         PyObject *pclass = NULL, *pcname = NULL;
210         int ret = 0;
211        
212         pclass = PyObject_GetAttrString(object, "__class__");
213         if (!pclass) {
214
215                 PyErr_SetString(PyExc_TypeError, "Didn't find a class for given argument object.");
216                 return ret;
217         }
218
219         pcname = PyObject_GetAttrString(pclass, "__name__");
220         if(!pcname) {
221
222                 PyErr_SetString(PyExc_TypeError, "Didn't find a class name for given argument object.");
223                 return ret;
224         }
225
226         GType type = g_type_from_name(PyString_AS_STRING(pcname));
227
228         if(!type) {
229                
230                 PyErr_SetString(PyExc_TypeError, "Expected argument object registered in GType system.");
231                 return ret;
232         }
233
234         if(g_type_parent(type) != MIDGARD_TYPE_DBOBJECT) {
235
236                 if(g_type_parent(type) != MIDGARD_TYPE_OBJECT) {
237                
238                         PyErr_SetString(PyExc_TypeError, "Expected argument of type midgard_dbobject (or derived class).");
239                         ret = 0;
240                
241                 } else {
242
243                         ret = 1;
244                 }
245         }
246
247         if(ret == 1) {
248
249                 if(G_OBJECT(((PyGObject *)object)->obj) == NULL) {
250                        
251                         PyErr_SetString(PyExc_TypeError, "Can not find underlying GObject object.");
252                         ret = 0;
253                 }
254         }
255
256         return ret;
257 }
258
259 static PyObject *
260 pymidgard_replicator_import_object(PyGObject *self, PyObject *args)
261 {
262         REPLICATOR_DEBUG("import_object");
263         PyObject *pobject;
264         gboolean force;
265
266         // PyTypeObject mdbo = py_midgard_dbobject_get_type_object();
267
268         if(!PyArg_ParseTuple(args, "O|b", &pobject, &force))
269                 return NULL;
270
271         if(!__py_midgard_parse_dbobject(pobject))
272                 return NULL;
273
274         gboolean imported =
275                 midgard_replicator_import_object(MIDGARD_DBOBJECT(((PyGObject *)pobject)->obj), force);
276        
277         if(imported)
278                 Py_RETURN_TRUE;
279        
280         Py_RETURN_FALSE;
281 }
282
283 static PyObject *
284 pymidgard_replicator_import_from_xml(PyGObject *self, PyObject *args)
285 {
286         REPLICATOR_DEBUG("import_from_xml");
287         const gchar *xml;
288         gboolean force = FALSE;
289         MidgardConnection *mgd = NULL;
290        
291         if(!PyArg_ParseTuple(args, "s|b", &xml, &force))
292                 return NULL;
293
294         mgd = _py_midgard_connection_singleton_get();
295        
296         midgard_replicator_import_from_xml(mgd, xml, force);
297
298         Py_RETURN_NONE;
299 }
300
301 static PyMethodDef pymidgard_replicator_methods[] = {
302         { "serialize", (PyCFunction)pymidgard_replicator_serialize, METH_VARARGS | METH_STATIC},
303         { "export", (PyCFunction)pymidgard_replicator_export, METH_VARARGS | METH_STATIC},
304         { "export_purged", (PyCFunction)pymidgard_replicator_export_purged, METH_VARARGS | METH_STATIC},
305         { "export_blob", (PyCFunction)pymidgard_replicator_export_blob, METH_VARARGS | METH_STATIC},
306         { "export_media", (PyCFunction)pymidgard_replicator_export_media, METH_VARARGS | METH_STATIC},
307         { "unserialize", (PyCFunction)pymidgard_replicator_unserialize, METH_VARARGS | METH_STATIC},
308         { "import_object", (PyCFunction)pymidgard_replicator_import_object, METH_VARARGS | METH_STATIC},
309         { "import_from_xml", (PyCFunction)pymidgard_replicator_import_from_xml, METH_VARARGS | METH_STATIC},
310         { NULL, NULL, 0 }
311 };
312
313 PyTypeObject G_GNUC_INTERNAL Pymidgard_replicator_Type = {
314     PyObject_HEAD_INIT(NULL)
315     0,                                 /* ob_size */
316     "replicator",                   /* tp_name */
317     sizeof(PyGObject),          /* tp_basicsize */
318     0,                                 /* tp_itemsize */
319     /* methods */
320     (destructor)_py_midgard_gobject_destructor,        /* tp_dealloc */
321     (printfunc)0,                      /* tp_print */
322     (getattrfunc)0,       /* tp_getattr */
323     (setattrfunc)0,       /* tp_setattr */
324     (cmpfunc)0,           /* tp_compare */
325     (reprfunc)0,             /* tp_repr */
326     (PyNumberMethods*)0,     /* tp_as_number */
327     (PySequenceMethods*)0, /* tp_as_sequence */
328     (PyMappingMethods*)0,   /* tp_as_mapping */
329     (hashfunc)0,             /* tp_hash */
330     (ternaryfunc)0,          /* tp_call */
331     (reprfunc)0,              /* tp_str */
332     (getattrofunc)0,     /* tp_getattro */
333     (setattrofunc)0,     /* tp_setattro */
334     (PyBufferProcs*)0,  /* tp_as_buffer */
335     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,                      /* tp_flags */
336     NULL,                        /* Documentation string */
337     (traverseproc)0,     /* tp_traverse */
338     (inquiry)0,             /* tp_clear */
339     (richcmpfunc)0,   /* tp_richcompare */
340     offsetof(PyGObject, weakreflist),             /* tp_weaklistoffset */
341     (getiterfunc)0,          /* tp_iter */
342     (iternextfunc)0,     /* tp_iternext */
343     pymidgard_replicator_methods, /* tp_methods */
344     (struct PyMemberDef*)0,              /* tp_members */
345     (struct PyGetSetDef*)0,  /* tp_getset */
346     NULL,                              /* tp_base */
347     NULL,                              /* tp_dict */
348     (descrgetfunc)0,    /* tp_descr_get */
349     (descrsetfunc)0,    /* tp_descr_set */
350     offsetof(PyGObject, inst_dict),                 /* tp_dictoffset */
351     (initproc)0,             /* tp_init */
352     (allocfunc)0,           /* tp_alloc */
353     (newfunc)0,               /* tp_new */
354     (freefunc)0,             /* tp_free */
355     (inquiry)0              /* tp_is_gc */
356 };
357
358 void py_midgard_replicator_register_class(
359                 PyObject *d, gpointer pygobject_type)
360 {
361         pygobject_register_class(d,
362                         "replicator",
363                         MIDGARD_TYPE_REPLICATOR,
364                         &Pymidgard_replicator_Type,
365                         Py_BuildValue("(O)", pygobject_type));
366 }
Note: See TracBrowser for help on using the browser.