static PHP_METHOD(midgard_object_class, has_metadata) { MidgardConnection *mgd = mgd_handle(TSRMLS_C); CHECK_MGD(mgd); zval *zvalue; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zvalue) == FAILURE) { return; } const char *php_classname = NULL; if (Z_TYPE_P(zvalue) == IS_STRING) { php_classname = Z_STRVAL_P(zvalue); } else if (Z_TYPE_P(zvalue) == IS_OBJECT) { php_classname = Z_OBJCE_P(zvalue)->name; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "argument should be object or string"); return; } const gchar *g_classname = php_class_name_to_g_class_name(php_classname); MidgardObjectClass *klass = MIDGARD_OBJECT_GET_CLASS_BY_NAME(g_classname); if (!klass) { php_error(E_WARNING, "MidgardObjectClass not found"); return; } RETURN_BOOL(midgard_reflector_object_has_metadata_class(g_classname)); }
/* Object constructor */ static PHP_METHOD(midgard_query_builder, __construct) { MidgardConnection *mgd = mgd_handle(TSRMLS_C); CHECK_MGD(mgd); char *classname; long classname_length; zval *zval_object = getThis(); GObject *gobject; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &classname, &classname_length) == FAILURE) { return; } zend_class_entry *ce = zend_fetch_class(classname, classname_length, ZEND_FETCH_CLASS_AUTO TSRMLS_CC); if (ce == NULL) { php_error(E_WARNING, "Didn't find %s class", classname); php_midgard_error_exception_force_throw(mgd, MGD_ERR_INVALID_OBJECT TSRMLS_CC); return; } zend_class_entry *base_ce = php_midgard_get_baseclass_ptr(ce); const gchar *g_base_class_name = php_class_name_to_g_class_name(base_ce->name); GType classtype = g_type_from_name(g_base_class_name); if (!g_type_is_a(classtype, MIDGARD_TYPE_DBOBJECT)) { php_error(E_WARNING, "Expected %s derived class", g_type_name(MIDGARD_TYPE_DBOBJECT)); php_midgard_error_exception_force_throw(mgd, MGD_ERR_INVALID_OBJECT TSRMLS_CC); return; } gobject = __php_gobject_ptr(zval_object); if (!gobject) { MidgardQueryBuilder *builder = midgard_query_builder_new(mgd, g_base_class_name); if (!builder) { php_midgard_error_exception_throw(mgd TSRMLS_CC); return; } MGD_PHP_SET_GOBJECT(zval_object, builder); } else { // we already have gobject injected } php_midgard_gobject *php_gobject = __php_objstore_object(zval_object); /* Set user defined class. We might need it when execute is invoked */ php_gobject->user_ce = ce; php_gobject->user_class_name = (char *)ce->name; }
/* Object constructor */ static PHP_METHOD(midgard_query_storage, __construct) { char *classname; int classname_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &classname, &classname_length) == FAILURE) { return; } const gchar *g_classname = php_class_name_to_g_class_name(classname); MidgardQueryStorage *storage = midgard_query_storage_new(g_classname); if (!storage) { zend_throw_exception_ex(ce_midgard_error_exception, 0 TSRMLS_CC, "Can not wrap this class in midgard_query_storage"); return; } MGD_PHP_SET_GOBJECT(getThis(), storage); }
static PHP_METHOD(php_midgard_reflection_class, listSignals) { if (zend_parse_parameters_none() == FAILURE) { return; } _GET_RC_CE; if (ce == NULL) return; array_init(return_value); GType classtype = g_type_from_name(php_class_name_to_g_class_name(ce->name)); if (!classtype) { return; } guint n_ids = 0; guint *ids = g_signal_list_ids(classtype, &n_ids); if (ids == NULL) { return; } size_t i; for (i = 0; i < n_ids; i++) { zval *signalname; MAKE_STD_ZVAL(signalname); ZVAL_STRING(signalname, (char *) g_signal_name(ids[i]), 1); zend_hash_next_index_insert(HASH_OF(return_value), &signalname, sizeof(zval *), NULL); } g_free(ids); }