5

我正在尝试monetdbnode.js. 我有一个简单的(20 行)c 程序,可以moentdb使用 mapi 库进行查询。

我可以使用这些库来构建node.js使用这些库并连接到的东西(模块/插件)monetdb吗?

(使用 odbc 是一种选择,但它有其自身的缺点。)

更新 1 :
node-ffi 非常棒。我能够很容易地创建一个获取表程序。(例如,我添加了我的工作代码。)

因此,如果我有 3 个选项
1. ODBC
2. node-ffi
3. ac 程序来获取数据库数据并通过套接字监听来自 node.js 的连接

就性能而言,这是更好的实现选择,如果我有更少的时间来开发 node.js 的插件

var ffi = require("ffi");
var libmylibrary = ffi.Library('/usr/local/lib/libmapi.so', {
    "mapi_connect":["int",["string",'int',"string","string","string","string"]],
    "mapi_query":['int',["int","string"]],
    "mapi_fetch_row":["int",["int"]],
    "mapi_fetch_field":["string",["int","int"]]
});


var res = libmylibrary.mapi_connect("localhost", 50000,"monetdb", "monetdb", "sql", "demo");
console.log(res);
var ret=libmylibrary.mapi_query(res,"select * from table");
while(libmylibrary.mapi_fetch_row(ret)){
    console.log(libmylibrary.mapi_fetch_field(ret,0));
    console.log(libmylibrary.mapi_fetch_field(ret,1));
}

更新 2:
不建议将上述代码用于生产用途...它不使用 node.js 的异步功能,因此请在婴儿步骤中使用它

4

1 回答 1

4

虽然 FFI 使调用本机代码变得容易,但您确实不应该将它用于您必须经常做的事情,例如调用数据库库。从文档:

与 FFI 调用相关的开销非常重要。将 strtoul() 的硬编码绑定版本与 strtoul() 的 FFI 版本进行比较表明,本机硬编码绑定的速度要快几个数量级。所以不要仅仅因为它更快就使用 C 版本的函数。FFI 调用的成本很高,所以让它们物有所值。

换句话说,FFI 可以工作,但速度很。如果您只需要拨打几个电话,这很好,但如果您需要经常拨打电话,则非常坏消息。

您需要做的是编写一个插件。插件是为 C 和 C++ 库提供胶水的 C++ 模块。(仅仅因为你必须用 C++ 编写插件并不意味着你不能从插件中调用纯 C 代码!)

节点文档提供了大量示例,可以帮助您入门。如果您使用的是 Windows,这里有一些设置 VS 的提示。

如果对 C 库的调用被阻塞,则需要使它们异步。 libuv 提供了一个线程池,你可以在上面进行工作。

于 2013-04-03T14:38:22.580 回答