是否可以创建一个node.js模块,该模块使用c库进行monetdb连接?

时间:2013-03-22 16:08:04

标签: javascript node.js database monetdb node-ffi

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

我可以使用这些库为node.js构建某些内容(模块/插件),它使用这些库并连接到monetdb吗?

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

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

所以,如果我有3个选项 1. ODBC
2. node-ffi
3.一个c程序,用于获取数据库数据并侦听从node.js到socket

的连接

就性能而言,这是更好的实施选择,如果我没有多少时间为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的异步功能,所以请将它用于婴儿步骤

1 个答案:

答案 0 :(得分:4)

虽然FFI可以轻松调用本机代码,但您实际上不应该将它用于您必须经常执行的操作,例如调用数据库库。来自文档:

  

与FFI调用相关的非平凡开销。将strtoul()的硬编码绑定版本与strtoul()的FFI版本进行比较表明,本机硬编码绑定的速度要快几个数量级。因此,不要仅仅因为它更快而使用C版本的函数。 FFI通话费用很高,所以让它们值得。

换句话说,FFI有效,但。如果你只是需要打几个电话,这很好,但如果你需要频繁拨打电话,这是非常糟糕的消息。

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

节点docs提供了大量可以帮助您入门的示例。如果您正在使用Windows here's some tips来设置VS.

如果对C库的调用是阻塞的,则需要使它们异步。 libuv provides a thread pool you can do the work on.