Библиотека C++ OrientDB от tglman

Использование библиотеки OrientDB от tglman и попытка запустить пример кода @ https://github.com/tglman/orientdb-c/wiki/Start

https://github.com/tglman/orientdb-c

Я могу подключиться к БД и успешно установить + получить значение в orientDB -

Однако, когда я запускаю запрос с помощью o_database_document_query, он не завершает выполнение - вместо этого он просто зависает на неопределенный срок.

Как это исправить?

Может быть, есть какой-то тупик, поскольку это многопоточная библиотека.

В коде у него есть такие понятия как o_engine_get_factory и o_engine_get_storage, o_database_operation_context.....

Я не совсем знаком с этими концепциями или с тем, как это работает.

Есть идеи как поступить???


person Imme22009    schedule 25.09.2013    source источник


Ответы (3)


Я также отлаживал и нашел ту же проблему ... исправил и отправил на github!

person tglman    schedule 29.09.2013
comment
спасибо, я протестировал. Похоже, это сработало. Кстати, я также отправил PR для небольших изменений в Makefile: D - person Imme22009; 29.09.2013

Я думаю, вы можете догадаться, кто я (по моему нику)

o_engine_get_factory, o_engine_get_storage, o_database_operation_context

три разных понятия:

o_engine_get_factory: это «фабрика соединений», основанная на используемом вами протоколе, теперь поддерживается только ориентация «удаленно».

o_engine_get_storage: это фабрика для o_storage, которая является низкоуровневым интерфейсом для экземпляра базы данных orient.

o_datebase_operation_context: это высокоуровневый интерфейс с базой данных, используемый для управления документами и транзакциями на стороне клиента!

фактическая реализация протокола находится внутри o_storage_remote.c и o_query_engine_remote.c, и я думаю, вам нужно взглянуть на второй, чтобы попытаться узнать что-то о проблеме!

что вы тестируете, можете ли вы привести пример кода, чтобы я мог воспроизвести/отладить !!

спасибо пока

Тглман

person tglman    schedule 26.09.2013
comment
Привет - нашел ошибку, пожалуйста, смотрите мой комментарий ниже. - person Imme22009; 28.09.2013

Я обнаружил ошибку. Это происходит при получении «метаданных» для записи после запроса: o_database_document_query.

Вот мой тестовый код:

https://gist.github.com/willmoss/6735670

Я поставил отладку ввода/вывода сокета, чтобы вы могли видеть, в чем проблема.

https://gist.github.com/willmoss/6735553

В o_database.c строка #290 в функции o_database_metadata() вы создали пустую запись с o_storage_get_metadata_rid .

https://github.com/tglman/orientdb-c/blob/master/src/o_database.c

Затем в следующей строке вы пытаетесь получить эту пустую запись из базы данных с помощью o_database_load.

Библиотека зависает на строке int select_ret = epoll_wait(selector->epoll, events, 1, timeout); - так как из БД не возвращается никакой информации. Строка № 64.

https://github.com/tglman/orientdb-c/blob/master/src/o_native_socket_selector.c

Если вы посмотрите на поток вывода байтов, который отправляется на сервер после RECORD_LOAD, то увидите, что это просто 0 без данных (см. последний раздел).

https://gist.github.com/willmoss/6735553

Могу ли я задать вопрос здесь. Как этот код когда-либо работал на вас? Или, может быть, это из-за каких-то изменений в протоколе. Я использую OrientDB Server v1.5.1 (build @BUILD@).

И самое главное - как это исправить? :D

Ваше здоровье!

person Imme22009    schedule 27.09.2013