Использование библиотеки 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
…..
Я не очень знаком с этими понятиями или как это работает.
Есть идеи как поступить ???
Я также отладил и обнаружил ту же проблему … исправлена и нажата на github!
Я думаю, что вы можете догадаться, кто я (по моему нику)
o_engine_get_factory, o_engine_get_storage, o_database_operation_context
три разные концепции:
o_engine_get_factory: «фабрика соединений», основанная на используемом вами протоколе, теперь только поддерживается восточный «удаленный»
o_engine_get_storage: фабрика для o_storage, который является интерфейсом низкого уровня для экземпляра orient db.
o_datebase_operation_context: высокоуровневый интерфейс с базой данных, используется для управления документами и транзакциями на стороне клиента!
фактическая реализация протокола находится внутри o_storage_remote.c и o_query_engine_remote.c, и я думаю, что вам нужно взглянуть на второй, чтобы попытаться найти что-то о проблеме!
что вы тестируете, можете ли вы привести пример кода, чтобы я мог воспроизвести / отладить !!
тнкс пока
tglman
Я обнаружил ошибку. Это происходит при извлечении «метаданных» для записи после запроса: 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
Ура!