在MacOS X环境中通过Virtuoso的ODBC / iODBC将Redland连接到Virtuoso

时间:2016-09-09 15:14:07

标签: c++ rdf unixodbc virtuoso redland

为了在我的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.hrdf_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>

有没有办法通过Virtuoso将Redland库与ODBC库连接?提前谢谢。

3 个答案:

答案 0 :(得分:1)

我不太了解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测试与艺术家的直接联系;要检查驱动程序管理器是否配置正确,请首先使用导致上述冲突的iodbctest(或unixODBC' s isql

答案 1 :(得分: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'");

其中 VOS 是ODBC中的配置定义。 此外,特定的ContextNode指定要使用的命名图。

答案 2 :(得分:0)

首先,iODBC是ODBC驱动程序管理器Apple builds into OS X,用户通常最好坚持使用它 - 尽管我们(OpenLink Software,iODBC的维护者)确实建议{{ 3}},因为Apple通常会有很多更新。

与此相关,Apple未捆绑updating to the curent version。除了其他方面,他们遗漏了框架。

一般来说,UnixODBC并不完全与GUI空间OS X应用程序或驱动程序集成,并且随着时间的推移会出现各种其他问题。目前的iODBC并不关心你是在GUI或命令行,Carbon还是Cocoa,32位或64位工作......这一切都正常工作(和full iODBC SDK)。

我使用的MacPorts和其他打包器有办法在UnixODBC和iODBC之间切换(例如,if it doesn't work, we want to know, so we can fix it);我不能很快找到这样的Homebrew,但也许你可以吗?