Подключение Redland к Virtuoso через ODBC / iODBC Virtuoso в среде MacOS X

Чтобы установить Virtuoso в моей среде MacOS X, я использовал порт brew, то есть:

brew install virtuoso

При этом он автоматически установил некоторые драйверы ODBC / iODBC, которые не могли быть перезаписаны любой другой установкой unixodbc. В частности, если я попытаюсь связать такую ​​библиотеку:

$ brew link unixodbc
Linking /usr/local/Cellar/unixodbc/2.3.4...
Error: Could not symlink bin/isql
Target /usr/local/bin/isql
is a symlink belonging to virtuoso. You can unlink it:
brew unlink virtuoso

To force the link and overwrite all conflicting files:
brew link --overwrite unixodbc

To list all files that would be deleted:
brew link --overwrite --dry-run unixodbc

Кстати, я не хочу отменять связь этой версии. Поэтому я попытался скомпилировать Redland с нуля и загрузить его с GitHub. В частности, я использовал две возможные конфигурации:

env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --with-virtuoso --with-odbc=/usr/local/Cellar/virtuoso/7.2.4.2
env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --with-virtuoso --with-iodbc=/usr/local/Cellar/virtuoso/7.2.4.2

После добавления rdf_hash_internal.h а также rdf_heuristics.h В моем проекте вручную все идет гладко и все компилируется и связывается. В моем приложении C ++ я пытаюсь получить доступ к базе данных с помощью следующего кода:

world = librdf_new_world();
librdf_world_open(world);
storage = librdf_new_storage(world,"virtuoso",graphName.c_str(),"dsn='Local Virtuoso',user='dba',password='dba'");
model = librdf_new_model(world,storage,NULL);
context_node = librdf_new_node_from_uri_string(world,(const unsigned char*)defaultContext.c_str());
/* librdf_model_transaction_commit(this->super->model) */
librdf_model_size(super->model)

Если я отключу транзакцию или нет, в любом случае я получаю следующую ошибку в строке 941 файла «rdf_storage_virtuoso.c»:

rc = SQLDriverConnect(connection->hdbc, 0,(UCHAR *) context->conn_str,
SQL_NTS, context->outdsn,
LIBRDF_VIRTUOSO_CONTEXT_DSN_SIZE,
&buflen, SQL_DRIVER_COMPLETE);

Следовательно, я полагаю, что существует ошибка соединения на уровне ODBC / iODBC. Кстати, я мог подключиться к виртуозу с помощью следующей команды:

$ isql localhost:1111 dba dba
Connected to OpenLink Virtuoso
Driver: 07.20.3217 OpenLink Virtuoso ODBC Driver
OpenLink Interactive SQL (Virtuoso), version 0.9849b.
Type HELP; for help and EXIT; to exit.
SQL>

Есть ли способ связать библиотеку Redland с библиотекой ODBC от Virtuoso? Заранее спасибо.

0

Решение

Я мало что знаю о brew, но можно ли изменить его определение пакета, чтобы он переименовал наш бинарный файл isql, например, вместо isql-vt?

Мы уже делаем это в нашей упаковке Debian / Ubuntu, вызывая

./configure     --program-transform-name='s/isql$$/isql-vt/;s/isqlw/isqlw-vt/'

Увидеть https://github.com/openlink/virtuoso-opensource/blob/develop/7/debian/rules#L31

Я не вижу ошибку, которую вы получаете из строки 941, но две вещи, касающиеся соединений ODBC:
1) твой --with-iodbc= должен указывать на копию iodbc, а не на виртуоз (вы можете получить ее от http://iodbc.org/ или ваш дистрибутив, вероятно, имеет пакет, например libiodbc2-dev в Debian / Ubuntu)
2) Виртуозы isql проверяет прямую связь с виртуозом; чтобы убедиться, что менеджер драйверов настроен правильно, используйте iodbctest (или unixODBC’s isql что вызвало конфликт выше в первую очередь).

1

Другие решения

Все эти проблемы были связаны с проблемой конфигурации что AFIK был описан ни в одном руководстве (Поправьте меня, если я ошибаюсь, я хотел бы найти более подробную информацию о Virtuoso и Redland / librdf). Таким образом, как я сказал в комментариях, проблема была в ODBC, но причина была в том, что в руководстве Virtuoso не упоминается, как настроить их драйвер. Это путь:

/Library/ODBC/odbc.ini

[ODBC Data Sources]
VOS = virtuoso-odbc

[VOS]
Driver = /usr/local/Cellar/virtuoso/7.2.4.2/lib/virtodbc.so
Description = Virtuoso Open-Source Edition
Address = localhost:1111
UserName    = dba
User        = dba

/Library/ODBC/odbcinst.ini

[ODBC Drivers]
virtuoso-odbc = Installed

[virtuoso-odbc]
Driver = /usr/local/Cellar/virtuoso/7.2.4.2/lib/virtodbc.so

Следовательно, даже параметры конфигурации, необходимые для доступа через Redland, должны измениться.

storage=librdf_new_storage(world, "virtuoso","db1","dsn='VOS',user='dba',password='dba'");

куда СДН это определение конфигурации в ODBC.
Кроме того, конкретный ContextNode указывает, какой именованный граф будет использоваться.

1

Первым делом, iODBC такое менеджер драйверов ODBC Apple встраивает в OS X, и пользователям обычно лучше придерживаться этого — хотя мы (Программное обеспечение OpenLink, сопровождающие iODBC) рекомендую обновление до текущей версии, как Apple, как правило, многие обновления позади.

В связи с этим Apple не связывает полный iODBC SDK. Они опускают рамки, между прочим.

Вообще говоря, UnixODBC не полностью интегрируется ни с приложениями GUI-space OS X, ни с драйверами, и со временем появляются различные другие проблемы. Текущий iODBC не волнует, работаете ли вы в GUI или в командной строке, Carbon или Cocoa, 32-битном или 64-битном … Все это просто работает (и если это не работает, мы хотим знать, чтобы мы могли это исправить).

У MacPorts и других упаковщиков, которые я использовал, были способы переключения между UnixODBC и iODBC (например, variants); Я не могу быстро найти такое для Homebrew, но, может быть, вы можете?

0
По вопросам рекламы [email protected]