Чтобы установить 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? Заранее спасибо.
Я мало что знаю о 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
что вызвало конфликт выше в первую очередь).
Все эти проблемы были связаны с проблемой конфигурации что 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 указывает, какой именованный граф будет использоваться.
Первым делом, 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, но, может быть, вы можете?