Можно ли создать модуль node.js, который использует библиотеки c для подключения к monetdb?

Я пытаюсь подключиться monetdb с node.js, У меня есть простая (20 строк) программа, которая может запросить moentdb используя библиотеки mapi.

Могу ли я использовать эти библиотеки для сборки чего-либо (модуль / дополнение) для node.js который использует эти библиотеки и подключается к monetdb?

(использование odbc - вариант, но у него есть свои недостатки.)

Обновление 1:
node-ffi довольно крутой. Мне удалось довольно легко создать программу для извлечения таблиц. (Я добавил мой рабочий код, например.)

Так что, если у меня есть 3 варианта
1. ODBC
2. узел-ффи
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, поэтому, пожалуйста, используйте его для шагов ребенка

1 ответ

Решение

Хотя FFI позволяет легко вызывать собственный код, на самом деле вам не следует использовать его для чего-то, что вам приходится делать часто, например, для вызова библиотеки базы данных. Из документов:

С вызовами FFI связаны нетривиальные издержки. Сравнение жестко-закодированной версии strtoul() с FFI-версией strtoul() показывает, что собственное жестко-привязанное связывание на несколько порядков быстрее. Так что не просто используйте C-версию функции только потому, что она быстрее. В звонках FFI есть значительная стоимость, так что сделайте их достойными.

Другими словами, FFI работает, но медленно. Это хорошо, если вам просто нужно сделать несколько звонков, но очень плохие новости, если вам нужно делать частые звонки.

Что вам нужно сделать, это написать аддон. Аддоны - это модули C++, которые обеспечивают связь с библиотеками C и C++. (То, что вы должны написать аддон в C++, не означает, что вы не можете вызывать чистый код C из аддона!)

Документация по узлам предоставляет множество примеров, с которых стоит начать. Если вы работаете с Windows, вот несколько советов по настройке VS.

Если вызовы библиотеки C блокируются, вам нужно сделать их асинхронными. libuv предоставляет пул потоков, с которым вы можете работать.

Другие вопросы по тегам