static PyObject *Reader_metadata(PyObject *self, PyObject *UNUSED(args)) { Reader_obj *mmdb_obj = (Reader_obj *)self; if (NULL == mmdb_obj->mmdb) { PyErr_SetString(PyExc_IOError, "Attempt to read from a closed MaxMind DB."); return NULL; } MMDB_entry_data_list_s *entry_data_list; MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list); MMDB_entry_data_list_s *original_entry_data_list = entry_data_list; PyObject *metadata_dict = from_entry_data_list(&entry_data_list); MMDB_free_entry_data_list(original_entry_data_list); if (NULL == metadata_dict || !PyDict_Check(metadata_dict)) { PyErr_SetString(MaxMindDB_error, "Error decoding metadata."); return NULL; } PyObject *args = PyTuple_New(0); if (NULL == args) { Py_DECREF(metadata_dict); return NULL; } PyObject *metadata = PyObject_Call((PyObject *)&Metadata_Type, args, metadata_dict); Py_DECREF(metadata_dict); return metadata; }
CAMLprim value mmdb_ml_dump_global(value mmdb) { CAMLparam1(mmdb); CAMLlocal1(pulled_string); MMDB_s *as_mmdb = (MMDB_s*)Data_custom_val(mmdb); MMDB_entry_data_list_s *entry_data_list = NULL; int status = MMDB_get_metadata_as_entry_data_list(as_mmdb, &entry_data_list); check_status(status); char *pulled_from_db = data_from_dump(entry_data_list); pulled_string = caml_copy_string(pulled_from_db); caml_stat_free(pulled_from_db); as_mmdb = NULL; free(entry_data_list); CAMLreturn(pulled_string); }
void test_metadata_as_data_entry_list(MMDB_s * mmdb, const char *mode_desc) { MMDB_entry_data_list_s *entry_data_list, *first; int status = MMDB_get_metadata_as_entry_data_list(mmdb, &entry_data_list); first = entry_data_list; cmp_ok(status, "==", MMDB_SUCCESS, "get metadata as data_entry_list - %s", mode_desc); cmp_ok(first->entry_data.data_size, "==", 9, "metadata map has 9 key/value pairs"); while (1) { MMDB_entry_data_list_s *key = entry_data_list = entry_data_list->next; if (!key) { break; } cmp_ok(key->entry_data.type, "==", MMDB_DATA_TYPE_UTF8_STRING, "found a map key"); const char *key_name = dup_entry_string_or_bail(key->entry_data); if (strcmp(key_name, "node_count") == 0) { MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next; cmp_ok(value->entry_data.uint32, "==", 37, "node_count == 37"); } else if (strcmp(key_name, "record_size") == 0) { MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next; cmp_ok(value->entry_data.uint16, "==", 24, "record_size == 24"); } else if (strcmp(key_name, "ip_version") == 0) { MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next; cmp_ok(value->entry_data.uint16, "==", 4, "ip_version == 4"); } else if (strcmp(key_name, "binary_format_major_version") == 0) { MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next; cmp_ok(value->entry_data.uint16, "==", 2, "binary_format_major_version == 2"); } else if (strcmp(key_name, "binary_format_minor_version") == 0) { MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next; cmp_ok(value->entry_data.uint16, "==", 0, "binary_format_minor_version == 0"); } else if (strcmp(key_name, "build_epoch") == 0) { MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next; ok(value->entry_data.uint64 > 1373571901, "build_epoch > 1373571901"); } else if (strcmp(key_name, "database_type") == 0) { MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next; const char *type = dup_entry_string_or_bail(value->entry_data); is(type, "Test", "type == Test"); free((void *)type); } else if (strcmp(key_name, "languages") == 0) { entry_data_list = test_languages_value(entry_data_list); } else if (strcmp(key_name, "description") == 0) { entry_data_list = test_description_value(entry_data_list); } else { ok(0, "unknown key found in metadata map - %s", key_name); } free((void *)key_name); } MMDB_free_entry_data_list(first); }