2016-01-20 2 views
0

Я использую библиотеку MongoDB C для вставки документов в различные коллекции в пределах одной базы данных, и я неоднократно получаю ссылку на ошибку (вместе с замечательной ошибкой) при вызове BSON_APPEND_OID (doc, "_id ", & oid);MongoDB BSON OID Failure

I хотел использовать одну и ту же коллекцию - так, чтобы каждая запись с отметками времени в каждой коллекции имела одинаковое значение, и именно тогда я начал получать ошибку. Поэтому я отказался от этого и попытался создать новые OID для каждой записи, и я все равно получаю ту же ошибку.

Version один, где я пытаюсь повторно использовать OID:

int insert_mongo(char json[100], char *coll, mongoc_client_t *client, bson_oid_t oid){ 

    mongoc_collection_t *collection; 
    bson_error_t error; 
    bson_t *doc; 

    collection = mongoc_client_get_collection (client, "edison", coll);  
    doc = bson_new_from_json((const uint8_t *)json, -1, &error); 
    BSON_APPEND_OID (doc, "_id", &oid); 
    if (!doc) { 
     fprintf (stderr, "%s\n", error.message); 
     return EXIT_FAILURE; 
    } 

    if (!mongoc_collection_insert (collection, MONGOC_INSERT_NONE, doc, NULL, &error)) { 
     fprintf (stderr, "%s\n", error.message); 
     return EXIT_FAILURE; 
    } 
    bson_destroy (doc); 
    mongoc_collection_destroy (collection); 
    return EXIT_SUCCESS; 
} 

и версию 2, где я создаю новый OID:

int insert_mongo(char json[100], char *coll, mongoc_client_t *client){ 

    mongoc_collection_t *collection; 
    bson_error_t error; 
    bson_t *doc; 
    bson_oid_t oid; 

    bson_oid_init (&oid, NULL); 
    collection = mongoc_client_get_collection (client, "edison", coll); 
    doc = bson_new_from_json((const uint8_t *)json, -1, &error); 
    BSON_APPEND_OID (doc, "_id", &oid); 
    if (!doc) { 
     fprintf (stderr, "%s\n", error.message); 
     return EXIT_FAILURE; 
    } 

    if (!mongoc_collection_insert (collection, MONGOC_INSERT_NONE, doc, NULL, &error)) { 
     fprintf (stderr, "%s\n", error.message); 
     return EXIT_FAILURE; 
    } 
    bson_destroy (doc); 
    mongoc_collection_destroy (collection); 
    return EXIT_SUCCESS; 
} 

Обе версии сегментного вина, что во второй раз функции является вызванный с MongoDB bson_append_oid(): precondition failed: bson

ответ

1

К сожалению, у меня недостаточно репутации, чтобы комментировать, так что давайте попробуем здесь :)

  • Во-первых, вы могли бы предоставить нам выход valgrind? Скомпилируйте свою программу с флагом -g, а затем выполните valgrind ./your_program. Это покажет где программа точно ошибку сегментации

  • Во-вторых, я думаю, , что ваша строка JSON не вписывается в char[100] и поэтому выдаёт ошибку сегментации производится на doc = bson_new_from_json((const uint8_t *)json, -1, &error);. Я мог представить, что, поскольку у вас включено автоматическое определение длины строки (второй параметр, -1), функция продолжает читать вашу память после char[100], потому что она не может найти конец строки, которая не вписывается в буфер.
    Чтобы устранить эту возможность, замените -1 на 100 (т. Е. Размер вашего буфера) и посмотрите, есть ли сообщение об ошибке вместо segfault.
    Edit: Развивая эту идею, это также может быть, что bson_new_from_json терпит неудачу, таким образом doc еще NULL и в следующей строке вы пытаетесь добавить идентификатор объекта в NULL, который может произвести Segfault.

+1

Действительно ... в некоторых случаях символ [100] был слишком коротким. фиксируя все, что исправлено. Спасибо, что поняли это. Я слишком долго смотрел на него! – Davidgs

Смежные вопросы