0

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

有没有办法将 Redland 库与 Virtuoso 的 ODBC 库连接起来?提前致谢。

4

3 回答 3

2

所有这些麻烦都是由于没有指南中描述 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

/库/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 指定要使用的命名图。

于 2016-09-10T11:20:36.427 回答
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测试直接连接到 virtuoso;要检查驱动程序管理器是否配置正确,请使用(或首先导致上述冲突的iodbctestunixODBC )。isql

于 2016-09-09T15:57:53.963 回答
0

首先,iODBC是Apple 内置到 OS X中的 ODBC 驱动程序管理器,用户通常最好坚持使用它——尽管我们(OpenLink Software,iODBC 的维护者)确实建议更新到当前版本,因为 Apple 通常有很多更新在后面。

与此相关的是,Apple 没有捆绑完整的 iODBC SDK。他们忽略了框架等。

一般来说,UnixODBC 并没有与 GUI 空间的 OS X 应用程序或驱动程序完全集成,并且随着时间的推移还会出现各种其他问题。当前的 iODBC 不在乎您是在 GUI 还是命令行中工作,Carbon 还是 Cocoa,32 位还是 64 位……这一切都可以正常工作(如果它不起作用,我们想知道,所以我们可以修复它)。

我用过的 MacPorts 和其他打包程序有办法在 UnixODBC 和 iODBC 之间切换(例如,variants);我不能很快找到 Homebrew 的,但也许你可以?

于 2016-09-09T17:19:41.353 回答