static PyObject *Revision_get_objects( Revision *self, PyObject *args, PyObject *kwds) { xorn_object_t *objects; size_t count; PyObject *list; size_t i; if (xorn_get_objects(self->rev, &objects, &count) == -1) return PyErr_NoMemory(); list = PyList_New(count); if (list == NULL) return NULL; for (i = 0; i < count; i++) { PyObject *ob_item = build_object(objects[i]); if (ob_item == NULL) { Py_DECREF(list); free(objects); return NULL; } PyList_SET_ITEM(list, i, ob_item); } free(objects); return list; }
PyObject *Revision_copy_object( Revision *self, PyObject *args, PyObject *kwds) { PyObject *rev_arg = NULL, *ob_arg = NULL; static char *kwlist[] = { "rev", "ob", NULL }; if (!PyArg_ParseTupleAndKeywords( args, kwds, "O!O!:Revision.copy_object", kwlist, &RevisionType, &rev_arg, &ObjectType, &ob_arg)) return NULL; if (!xorn_revision_is_transient(self->rev)) return not_transient(); if (!xorn_object_exists_in_revision(((Revision *)rev_arg)->rev, ((Object *)ob_arg)->ob)) { PyErr_SetString(PyExc_KeyError, "Object does not exist in source revision"); return NULL; } xorn_object_t ob = xorn_copy_object( self->rev, ((Revision *)rev_arg)->rev, ((Object *)ob_arg)->ob); return ob ? build_object(ob) : PyErr_NoMemory(); }
static PyObject *Revision_add_object( Revision *self, PyObject *args, PyObject *kwds) { PyObject *data_arg = NULL; static char *kwlist[] = { "data", NULL }; if (!PyArg_ParseTupleAndKeywords( args, kwds, "O:Revision.add_object", kwlist, &data_arg)) return NULL; if (!xorn_revision_is_transient(self->rev)) return not_transient(); xorn_obtype_t type = xorn_obtype_none; const void *data = NULL; if (prepare_data(data_arg, &type, &data) == -1) { char buf[BUFSIZ]; snprintf(buf, BUFSIZ, "Revision.add_object() argument 'data' (pos 1) " "must be of xorn.storage object type, not %.50s", data_arg->ob_type->tp_name); PyErr_SetString(PyExc_TypeError, buf); return NULL; } xorn_object_t ob = xorn_add_object(self->rev, type, data); if (ob == NULL) return PyErr_NoMemory(); return build_object(ob); }
static PyObject *Revision_get_object_location( Revision *self, PyObject *args, PyObject *kwds) { PyObject *ob_arg = NULL; static char *kwlist[] = { "ob", NULL }; if (!PyArg_ParseTupleAndKeywords( args, kwds, "O!:Revision.get_object_location", kwlist, &ObjectType, &ob_arg)) return NULL; xorn_object_t attached_to = NULL; unsigned int position = -1; if (xorn_get_object_location(self->rev, ((Object *)ob_arg)->ob, &attached_to, &position) == -1) { PyErr_SetString(PyExc_KeyError, "Object does not exist"); return NULL; } if (attached_to == NULL) return Py_BuildValue("OI", Py_None, position); return Py_BuildValue("NI", build_object(attached_to), position); }
qeocore_type_t *types_from_json(const qeo_factory_t *factory, json_t *typedesc) { qeocore_type_t *qeocore_top_type = NULL; do { if ((NULL == typedesc) || (NULL == factory)){ break; } qeocore_top_type = build_object(factory, typedesc); if (NULL == qeocore_top_type) { qeo_log_e("build_object failed"); break; } } while (0); return qeocore_top_type; }
static std::string build_one(const cJSON *json, TypedObject &to) { switch (json->type) { case 0: // cJSON_False case 1: // cJSON_True to.type = 0; to.data.bv = (json->type == cJSON_True); break; case 2: // cJSON_NULL to.type = 5; break; case 3: // cJSON_Number to.type = 1; to.data.nv = json->valuedouble; break; case 4: // cJSON_String to.type = 2; to.data.sv = json->valuestring; break; case 5: // cJSON_array to.type = 3; build_array(json->child, to.data.av); break; case 6: // cJSON_object to.type = 4; build_object(json->child, to.data.ov); break; } if (json->string) return json->string; else return ""; // 无名对象 .. }
static PyObject *to_python_list(xorn_object_t *objects, size_t count) { PyObject *list; size_t i; list = PyList_New(count); if (list == NULL) return NULL; for (i = 0; i < count; i++) { PyObject *ob_item = build_object(objects[i]); if (ob_item == NULL) { Py_DECREF(list); free(objects); return NULL; } PyList_SET_ITEM(list, i, ob_item); } free(objects); return list; }
static qeocore_type_t *build_member_type(const qeo_factory_t *factory, json_t *member) { qeocore_type_t *memberType = NULL; qeocore_typecode_t qeoTypeCode; json_t *member_type = json_object_get(member, KEY_TYPE); if (!((NULL != member_type) && (json_is_string(member_type)))) { qeo_log_e("Could not retrieve type"); return memberType; } const char *jsonTypeCode = json_string_value(member_type); do { if (!strcmp(jsonTypeCode, "boolean")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_BOOLEAN); qeoTypeCode = QEOCORE_TYPECODE_BOOLEAN; } else if (!strcmp(jsonTypeCode, "byte")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT8); qeoTypeCode = QEOCORE_TYPECODE_INT8; } else if (!strcmp(jsonTypeCode, "int16")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT16); qeoTypeCode = QEOCORE_TYPECODE_INT16; } else if (!strcmp(jsonTypeCode, "int32")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT32); qeoTypeCode = QEOCORE_TYPECODE_INT32; } else if (!strcmp(jsonTypeCode, "int64")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT64); qeoTypeCode = QEOCORE_TYPECODE_INT64; } else if (!strcmp(jsonTypeCode, "float32")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_FLOAT32); qeoTypeCode = QEOCORE_TYPECODE_FLOAT32; } else if (!strcmp(jsonTypeCode, "string")) { size_t size = 0; memberType = qeocore_type_string_new(size); qeoTypeCode = QEOCORE_TYPECODE_STRING; } else if (!strcmp(jsonTypeCode, "object")) { json_t *item = json_object_get(member, KEY_ITEM); if ((NULL == item) || !json_is_object(item)) { qeo_log_e("Could not find item"); break; } memberType = build_object(factory, item); qeoTypeCode = QEOCORE_TYPECODE_STRUCT; } else if (!strcmp(jsonTypeCode, "array")) { json_t *items = json_object_get(member, KEY_ITEMS); if ((NULL == items) || !json_is_object(items)) { qeo_log_e("Could not find items"); break; } qeocore_type_t *elemtype = build_member_type(factory, items); if (elemtype == NULL){ qeo_log_e("Could not build member for array"); break; } memberType = qeocore_type_sequence_new(elemtype); qeocore_type_free(elemtype); qeoTypeCode = QEOCORE_TYPECODE_SEQUENCE; } else if (!strcmp(jsonTypeCode, "enum")){ json_t *item = json_object_get(member, KEY_ITEM); if ((NULL == item) || !json_is_object(item)) { qeo_log_e("Could not find item"); break; } memberType = build_enum(factory, item); qeoTypeCode = QEOCORE_TYPECODE_ENUM; } else { qeo_log_e("Unsupported jsonTypeCode %s", jsonTypeCode); } } while (0); if (NULL == memberType) { qeo_log_e("Could not make type (%s)", jsonTypeCode); return memberType; } json_object_set_new(member, KEY_QEO_TYPE_CODE, json_integer(qeoTypeCode)); return memberType; }