Beispiel #1
0
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);
}
Beispiel #3
0
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);
}