为了在我的MacOS X环境中安装Virtuoso,我使用了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)
如果我禁用事务,无论如何,我在"rdf_storage_virtuoso.c"的第941行得到以下错误:
rc = SQLDriverConnect(connection->hdbc, 0,(UCHAR *) context->conn_str,
SQL_NTS, context->outdsn,
LIBRDF_VIRTUOSO_CONTEXT_DSN_SIZE,
&buflen, SQL_DRIVER_COMPLETE);
因此,我认为在ODBC/iODBC级别存在连接错误。顺便说一下,我可以用以下命令连接到virtuoso:
$ 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?
所有这些麻烦都是由于配置问题, AFIK在没有指南中描述(如果我错了请纠正我,我想在Virtuoso和Redland/librdf上找到更多细节)。因此,正如我在评论中所说的,问题是在ODBC中,但原因是Virtuoso指南中没有提到如何配置他们的驱动程序。应该这样做:
/图书馆/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
将odbcinst . ini /图书馆/ODBC/
[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'");
其中VOS是ODBC中的配置定义。此外,特定的ContextNode指定了要使用的命名图。
我不太了解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的副本,而不是指向virtuoso(您可以从http://iodbc.org/或您的发行版可能有一个包,例如debian/ubuntu上的libiodbc2-dev)2) Virtuoso的isql
测试与Virtuoso有直接连接;要检查驱动程序管理器是否配置正确,请使用iodbctest
(或unixODBC的isql
,它首先会导致上述冲突)。
首先,iODBC是苹果内置在OS X中的ODBC驱动程序管理器,用户通常最好坚持使用它——尽管我们(OpenLink Software, iODBC的维护者)建议更新到当前版本,因为苹果通常有许多更新。
与此相关的是,苹果没有捆绑完整的iODBC SDK。他们忽略了框架,以及其他东西。
一般来说,UnixODBC并没有完全与gui空间的OS X应用程序和驱动程序集成,而且随着时间的推移,还有各种其他问题浮出水面。当前的iODBC不关心你是否在GUI或命令行工作,碳或可可,32位或64位……它只是工作(如果它不工作,我们想知道,这样我们就可以修复它)。
MacPorts和我使用过的其他包有办法在UnixODBC和iODBC之间切换(例如,variants
);我不能很快找到这样的Homebrew,但也许你可以?