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

Revision 14403, 9.8 kB (checked in by piotras, 11 months ago)

Initial

Line 
1 /* Copyright (C) 2006 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_replicator_class;
21
22 static MidgardReplicator *_get_replicator(zval *object)
23 {
24         php_midgard_gobject *php_gobject =
25                 (php_midgard_gobject *)zend_object_store_get_object(object TSRMLS_CC);
26        
27         return MIDGARD_REPLICATOR(php_gobject->gobject);
28 }
29
30 static MgdObject *_get_object(zval *object)
31 {
32         php_midgard_gobject *php_gobject =
33                 (php_midgard_gobject *)zend_object_store_get_object(object TSRMLS_CC);
34        
35         return MIDGARD_OBJECT(php_gobject->gobject);
36 }
37
38 /* Object constructor */
39 static PHP_FUNCTION(_constructor)
40 {
41         RETVAL_FALSE;
42         CHECK_MGD;
43         zval *zobject, *zval_object = getThis();
44
45         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobject) == FAILURE)
46                 return;
47        
48         php_midgard_gobject *a_object =
49                 (php_midgard_gobject *)zend_object_store_get_object(zobject TSRMLS_CC);
50
51         MidgardReplicator *replicator =
52                 midgard_replicator_new(MIDGARD_OBJECT(a_object->gobject));
53
54         php_midgard_gobject *php_gobject =
55                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
56         php_gobject->gobject = G_OBJECT(replicator);
57
58         if(!replicator)
59                 RETURN_FALSE;
60 }
61
62 static ZEND_METHOD(midgard_replicator, serialize)
63 {
64         RETVAL_FALSE;
65         CHECK_MGD;
66        
67         gchar *xml;
68         zval *zval_object = getThis();
69         zval *zobject;
70
71         /* We have PHP object instance */
72         if(zval_object) {
73                
74                 if(ZEND_NUM_ARGS() > 0) {
75                         WRONG_PARAM_COUNT;
76                         RETURN_FALSE;
77                 }
78
79                 php_midgard_gobject *php_gobject =
80                         (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
81                 MidgardReplicator *rep = MIDGARD_REPLICATOR(php_gobject->gobject);
82
83                 if(!rep)
84                         RETURN_NULL();
85
86                 xml = midgard_replicator_serialize(rep, NULL);
87        
88         } else {
89
90                 /* No PHP object , static method call midgard_replicator::serialize($object) */
91                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobject)
92                                 == FAILURE) {
93                         WRONG_PARAM_COUNT;
94                         RETURN_FALSE;
95                 }
96        
97                 php_midgard_gobject *a_object =
98                         (php_midgard_gobject *)zend_object_store_get_object(zobject TSRMLS_CC);
99                 MgdObject *object = MIDGARD_OBJECT(a_object->gobject);
100                
101                 xml = midgard_replicator_serialize(NULL, object);
102         }
103
104         if(xml == NULL)
105                 RETURN_NULL();
106        
107         /* We have to duplicate xml string because Zend seems to ... */
108
109         RETVAL_TRUE;
110         RETVAL_STRING(xml, 1);
111        
112         g_free(xml);
113 }
114
115 static ZEND_METHOD(midgard_replicator, export)
116 {
117         RETVAL_FALSE;
118         CHECK_MGD;
119        
120         gboolean exported;
121         zval *zobject, *zval_object = getThis();
122
123         /* We have PHP object instance */
124         if(getThis()) {
125                
126                 if(ZEND_NUM_ARGS() > 0) {
127                         WRONG_PARAM_COUNT;
128                         RETURN_FALSE;
129                 }
130
131                 MidgardReplicator *rep = _get_replicator(zval_object);
132
133                 if(!rep)
134                         RETURN_FALSE;
135
136                 exported = midgard_replicator_export(rep, NULL);
137        
138         } else {
139
140                 /* No PHP object , static method call midgard_replicator::export($object) */
141                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobject)
142                                 == FAILURE) {
143                         WRONG_PARAM_COUNT;
144                         RETURN_FALSE;
145                 }
146                
147                 MgdObject *object = _get_object(zobject);
148                
149                 exported = midgard_replicator_export(NULL, object);
150         }
151        
152         RETURN_BOOL(exported);
153 }
154
155 static ZEND_METHOD(midgard_replicator, export_by_guid)
156 {
157         RETVAL_FALSE;
158         CHECK_MGD;
159
160         gchar *guid;
161         guint guid_length;
162         gboolean rv;
163
164         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
165                                 &guid, &guid_length) == FAILURE) {
166                 WRONG_PARAM_COUNT;
167         }
168
169         rv = midgard_replicator_export_by_guid(
170                         mgd_handle(), (const gchar *) guid);
171
172         RETURN_BOOL(rv);
173 }
174
175 static ZEND_METHOD(midgard_replicator, export_purged)
176 {
177         RETVAL_FALSE;
178         CHECK_MGD;
179
180         gchar *startdate = NULL , *enddate = NULL , *xml = NULL;
181         guint start_length, end_length;
182         zval *ook; /* Object Or Klass name zval */
183         MidgardObjectClass *klass = NULL;
184
185         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|ss",
186                                 &ook, &startdate, &start_length,
187                                 &enddate, &end_length) == FAILURE) {
188                 WRONG_PARAM_COUNT;
189                 RETURN_FALSE;
190         }
191
192         if((Z_TYPE_P(ook) != IS_STRING) &&
193                         Z_TYPE_P(ook) != IS_OBJECT) {
194                 php_error(E_WARNING,
195                                 "%s() accepts object or string as first argument",
196                                       get_active_function_name(TSRMLS_C));
197                 RETURN_FALSE;
198         }
199
200         if(Z_TYPE_P(ook) == IS_STRING) {
201                 klass = MIDGARD_OBJECT_GET_CLASS_BY_NAME(
202                                 (const gchar *)Z_STRVAL_P(ook));
203         } else if(Z_TYPE_P(ook) == IS_OBJECT) {
204                 klass = MIDGARD_OBJECT_GET_CLASS_BY_NAME(
205                                 (const gchar *)Z_OBJCE_P(ook)->name);
206         }
207
208         if(getThis()) {
209
210                 MidgardReplicator *rep = _get_replicator(getThis());
211                 xml = midgard_replicator_export_purged(rep, NULL, NULL,
212                                 startdate, enddate);
213         } else {
214                 xml = midgard_replicator_export_purged(NULL, klass, mgd_handle(),
215                                 startdate, enddate);
216         }
217
218          if(xml == NULL)
219                  RETURN_NULL();
220          
221          RETVAL_TRUE;
222          RETVAL_STRING(xml, 1);
223          g_free(xml);
224 }
225
226 static ZEND_METHOD(midgard_replicator, serialize_blob)
227 {
228         RETVAL_FALSE;
229         CHECK_MGD;
230        
231         gchar *xml;
232         zval *zobject;
233         MgdObject *object;
234        
235         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobject)
236                         == FAILURE) {
237                 WRONG_PARAM_COUNT;
238                 RETURN_FALSE;
239         }
240
241         /* We have PHP object instance */
242         if(getThis()) {
243
244                 MidgardReplicator *rep = _get_replicator(getThis());
245
246                 if(!rep)
247                         RETURN_FALSE;
248
249                 object = _get_object(zobject);
250                
251                 if(!object)
252                         RETURN_FALSE;
253
254                 xml = midgard_replicator_export_blob(rep, object);
255        
256         } else {
257
258                 /* No PHP replicator object ,
259                  * static method call midgard_replicator::export($object) */
260                 MgdObject *object = _get_object(zobject);
261                
262                 xml = midgard_replicator_serialize_blob(NULL, object);
263         }
264        
265         if(xml == NULL)
266                 RETURN_NULL();
267        
268         RETVAL_TRUE;
269         RETVAL_STRING(xml, 1);
270         g_free(xml);
271 }
272
273 static ZEND_METHOD(midgard_replicator, unserialize)
274 {
275         RETVAL_FALSE;
276         CHECK_MGD;
277
278         GObject **objects;
279         gchar *xml;
280         guint xml_length, i = 0;
281         zend_bool zbool = FALSE;
282
283         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b",
284                                 &xml, &xml_length, &zbool) == FAILURE) {
285                 WRONG_PARAM_COUNT;
286                 RETURN_FALSE;
287         }
288
289         array_init(return_value);
290
291         if(getThis()) {
292                
293                 MidgardReplicator *rep = _get_replicator(getThis());
294                
295                 if(!rep)
296                         RETURN_FALSE;
297                
298                 objects = midgard_replicator_unserialize(rep, NULL,
299                                 (const gchar*)xml, (gboolean) zbool);
300                
301         } else {
302
303                 objects = midgard_replicator_unserialize(NULL,
304                                 mgd_handle(), (const gchar *)xml , (gboolean) zbool);
305         }
306
307         if(!objects)
308                 RETURN_FALSE;
309
310         zend_class_entry **ce;
311
312         while(objects[i] != NULL) {             
313                
314                 zval *zobject;
315                 MAKE_STD_ZVAL(zobject);
316                
317                 gchar *class_name =
318                         g_ascii_strdown(G_OBJECT_TYPE_NAME(G_OBJECT(objects[i])), -1);
319                 zend_hash_find(CG(class_table),
320                                 class_name,
321                                 strlen(class_name)+1,
322                                 (void **) &ce);
323
324                 php_midgard_gobject_new_with_gobject(zobject, *ce, objects[i], TRUE);
325
326                 zend_hash_next_index_insert(
327                                 HASH_OF(return_value), &zobject, sizeof(zval *), NULL);
328                
329                 i++;
330         };
331        
332         g_free(objects);
333 }
334
335 static ZEND_METHOD(midgard_replicator, import_object)
336 {
337         RETVAL_FALSE;
338         CHECK_MGD;
339        
340         gboolean imported;
341         zval *zobject;
342         zend_bool zbool = FALSE;
343
344         /* We have PHP object instance */
345         if(getThis()) {
346                
347                 if(ZEND_NUM_ARGS() > 0) {
348                         WRONG_PARAM_COUNT;
349                         RETURN_FALSE;
350                 }
351
352                 MidgardReplicator *rep = _get_replicator(getThis());
353
354                 if(!rep)
355                         RETURN_FALSE;
356
357                 imported = midgard_replicator_import_object(rep, NULL, zbool);
358        
359         } else {
360
361                 /* No PHP object , static method call midgard_replicator::export($object) */
362                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|b",
363                                         &zobject, &zbool) == FAILURE) {
364                         WRONG_PARAM_COUNT;
365                         RETURN_FALSE;
366                 }
367                
368                 MgdObject *object = _get_object(zobject);
369                
370                 imported = midgard_replicator_import_object(NULL, object, zbool);
371         }
372        
373         RETURN_BOOL(imported);
374 }
375
376 static ZEND_METHOD(midgard_replicator, import_from_xml)
377 {
378         RETVAL_FALSE;
379         CHECK_MGD;
380
381         gchar *xml;
382         guint xml_length;
383         zend_bool zbool = FALSE;
384        
385         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z",
386                                 &xml, &xml_length, &zbool) == FAILURE) {
387                 WRONG_PARAM_COUNT;
388                 RETURN_FALSE;
389         }
390
391         if(getThis()){
392
393                 MidgardReplicator *rep = _get_replicator(getThis());
394                
395                 if(rep)
396                         midgard_replicator_import_from_xml(
397                                         rep, NULL,
398                                         (const gchar *)xml, zbool);
399         } else {
400        
401                 midgard_replicator_import_from_xml(
402                                 NULL, mgd_handle(),
403                                 (const gchar *)xml, zbool);
404         }
405 }
406
407
408 void php_midgard_replicator_init(int module_number)
409 {
410         static function_entry replicator_methods[] = {
411                 PHP_FALIAS(midgard_replicator,          _constructor,           NULL)
412                 ZEND_ME(midgard_replicator, serialize, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
413                 ZEND_ME(midgard_replicator, export, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
414                 ZEND_ME(midgard_replicator, export_by_guid, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
415                 ZEND_ME(midgard_replicator, export_purged, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
416                 ZEND_ME(midgard_replicator, serialize_blob, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
417                 ZEND_ME(midgard_replicator, unserialize, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
418                 ZEND_ME(midgard_replicator, import_object, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
419                 ZEND_ME(midgard_replicator, import_from_xml, NULL, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC)
420                 {NULL, NULL, NULL}
421         };
422
423         static zend_class_entry php_midgard_replicator_class_entry;
424        
425         INIT_CLASS_ENTRY(
426                         php_midgard_replicator_class_entry,
427                         "midgard_replicator", replicator_methods);
428        
429         php_midgard_replicator_class =
430                 zend_register_internal_class(&php_midgard_replicator_class_entry TSRMLS_CC);
431 }
Note: See TracBrowser for help on using the browser.