是否有可能创build一个node.js模块使用c库monetdb连接?

我正在尝试连接monetdbmonetdb 我有一个简单的(20行)c程序,可以使用mapi库查询moentdb

我可以使用这些库来构buildnode.js (module / addon),它使用这些库并连接到monetdb

(使用odbc是一个选项,但它有它自己的缺点。)

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

所以如果我有3个选项
1. ODBC
2.节点-ffi
3. ac程序获取数据库数据并通过socket监听来自node.js的连接

就性能而言这是更好的select,如果我没有多less时间开发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的asynchronousfunction,所以请使用它的婴儿步骤

虽然FFI可以很容易地调用本地代码,但是您实际上不应该将它用于您经常需要做的事情,比如调用数据库库。 从文档:

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

换句话说,FFI的工作,但速度缓慢 。 如果您只需要拨打几个电话,这很好,但如果您需要频繁拨打电话,则是非常糟糕的消息。

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

节点文档提供了大量的例子,应该让你开始。 如果你正在使用Windows, 这里有一些提示来设置VS。

如果C库的调用被阻塞,则需要使它们asynchronous。 libuv提供了一个线程池,您可以完成这些工作。