2013-03-22 32 views
5

Tôi đang cố kết nối monetdb với node.js. Tôi có một chương trình đơn giản (20 dòng) c có thể truy vấn moentdb sử dụng thư viện mapi.Có thể tạo mô-đun node.js sử dụng thư viện c để kết nối monetdb không?

Tôi có thể sử dụng các thư viện đó để xây dựng thứ gì đó (module/addon) cho node.js sử dụng các thư viện này và kết nối với monetdb không?

(sử dụng odbc là một lựa chọn nhưng nó có nhược điểm riêng của mình.)

Update1:
nút-ffi là khá tuyệt vời. Tôi đã có thể tạo một chương trình tìm nạp bảng khá dễ dàng. (Tôi đã thêm mã làm việc của tôi chẳng hạn.)

Vì vậy, nếu tôi có 3 lựa chọn
1. ODBC
2. nút-ffi chương trình
3. ac để lấy dữ liệu cơ sở dữ liệu và lắng nghe kết nối từ nút. js thông qua ổ cắm

Xét về hiệu suất đó là lựa chọn tốt hơn để thực hiện, nếu tôi có chút ít thời gian để phát triển một addon cho 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)); 
} 

cập nhật 2:
Không nên sử dụng mã trên để sử dụng sản xuất ... nó không sử dụng chức năng không đồng bộ của node.js vì vậy hãy sử dụng nó cho các bước bé

+0

Hãy thử xem http://stackoverflow.com/questions/15393039/why-v8-in-node-js-is-faster-than-in-my-native-c-addon. Tôi bắt gặp nó một ngày và thấy nó thú vị, và nó có thể được sử dụng cho bạn. –

+1

Trong C++ addon tôi đã xem github, mã đầy đủ được viết với tiêu đề v8/node ... Tôi không chắc chắn nếu một thư viện hoàn toàn viết bằng c có thể được thêm vào addon .... Tôi thấy hầu hết người dùng chỉ trích nút .js vì thiếu db libs nếu nó có thể được thực hiện thì tất cả dbs có thể được kết nối thông qua node.js – Gaurav

+2

Có một mô-đun trình điều khiển Node.js riêng mới cho MonetDB: https://www.npmjs.com/package/monetdb Nó có sẵn trên npmjs.org, vì vậy bây giờ bạn có thể chạy '' 'npm install monetdb''' để cài đặt trình điều khiển. –

Trả lời

4

Mặc dù FFI dễ dàng gọi mã nguồn gốc, bạn thực sự không nên sử dụng nó cho một cái gì đó bạn phải làm thường xuyên, như gọi một thư viện cơ sở dữ liệu. Từ tài liệu:

Có chi phí không quan trọng liên quan đến các cuộc gọi FFI. So sánh một phiên bản ràng buộc mã hóa cứng của strtoul() với một phiên bản FFI của strtoul() cho thấy ràng buộc mã hoá cứng tự nhiên là các đơn đặt hàng có cường độ nhanh hơn. Vì vậy, không chỉ sử dụng phiên bản C của một hàm chỉ vì nó nhanh hơn. Có một chi phí đáng kể trong các cuộc gọi FFI, do đó, làm cho họ có giá trị.

Nói cách khác, FFI hoạt động, nhưng là chậm. Điều này là tốt nếu bạn chỉ cần thực hiện một vài cuộc gọi, nhưng tin xấu nếu bạn cần thực hiện cuộc gọi thường xuyên.

Những gì bạn cần làm là viết addon. Addons là các mô-đun C++ cung cấp keo cho các thư viện C và C++. (Chỉ vì bạn phải viết addon trong C++ không có nghĩa là bạn không thể gọi mã C thuần túy từ addon!)

Nút docs cung cấp nhiều ví dụ sẽ giúp bạn bắt đầu. Nếu bạn đang làm việc với Windows, here's some tips để thiết lập VS.

Nếu các cuộc gọi đến thư viện C đang chặn, bạn sẽ cần phải làm cho chúng không đồng bộ. libuv provides a thread pool you can do the work on.

+1

Cảm ơn ... mọi người đã đề xuất odbc với nút-odbc và ffi. Nhưng nó đã được khuyên không nên sử dụng những phương pháp này đặc biệt cho các cuộc gọi thường xuyên. Tôi thấy các tài liệu nhưng phong cách mã hóa hơi khác nhau nên cố gắng tránh nó. có vẻ như tôi không thể tránh viết C++ addon. – Gaurav

Các vấn đề liên quan