├── tests
├── .gitignore
├── testdata
│ └── image.gif
├── createTestDB.sql
├── config.js
├── createTestDB.cmd
├── perf
│ ├── select-full-sync.js
│ ├── select-one-sync.js
│ ├── select-full-async.js
│ ├── select-one-async.js
│ ├── select-prep-async.js
│ ├── select-prep-async-trans.js
│ ├── select-pool-async.js
│ └── select-prep-async-pool.js
└── def
│ ├── test-concurrent-fetch.js
│ ├── test-fbres.js
│ ├── test-storedproc.js
│ ├── test-concurrent-query.js
│ ├── test-transaction.js
│ ├── test-async.js
│ ├── test-blob-stream.js
│ ├── test-blob.js
│ ├── test-sync.js
│ ├── test-binding.js
│ ├── test-datatypes.js
│ ├── test-events.js
│ └── test-prepared-stmt.js
├── .gitignore
├── .npmignore
├── fb
├── lib
│ └── fbclient_ms.lib
├── lib64
│ └── fbclient_ms.lib
└── include
│ ├── ib_util.h
│ └── perf.h
├── samples
├── fileman
│ ├── static
│ │ ├── elfinder
│ │ │ ├── images
│ │ │ │ ├── ql.png
│ │ │ │ ├── icons-big.png
│ │ │ │ ├── icons-big.psd
│ │ │ │ ├── spinner.gif
│ │ │ │ ├── toolbar.png
│ │ │ │ └── icons-small.png
│ │ │ └── css
│ │ │ │ └── elfinder.css
│ │ ├── css
│ │ │ └── smoothness
│ │ │ │ └── images
│ │ │ │ ├── ui-icons_222222_256x240.png
│ │ │ │ ├── ui-icons_2e83ff_256x240.png
│ │ │ │ ├── ui-icons_454545_256x240.png
│ │ │ │ ├── ui-icons_888888_256x240.png
│ │ │ │ ├── ui-icons_cd0a0a_256x240.png
│ │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png
│ │ │ │ ├── ui-bg_flat_75_ffffff_40x100.png
│ │ │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png
│ │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png
│ │ │ │ ├── ui-bg_glass_75_dadada_1x400.png
│ │ │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png
│ │ │ │ ├── ui-bg_glass_95_fef1ec_1x400.png
│ │ │ │ └── ui-bg_highlight-soft_75_cccccc_1x100.png
│ │ └── index.html
│ ├── fileman.js
│ └── elfinder.js
├── testDisconnect
│ ├── config.js
│ ├── testCommit.js
│ ├── test-disconnect-blob.js
│ └── test-disconnect.js
├── deferred
│ ├── sample.js
│ └── fb-deferred.js
└── simple-ws
│ └── simple-ws.js
├── .gitmodules
├── package.json
├── src
├── fb-bindings-fbeventemitter.h
├── fb-bindings.h
├── fb-bindings.cc
├── fb-bindings-statement.h
├── fb-bindings-transaction.h
├── fb-bindings-blob.h
├── fb-bindings-fbresult.h
├── fb-bindings-fbeventemitter.cc
├── fb-bindings-eventblock.h
├── fb-bindings-connection.h
├── fb-bindings-transaction.cc
├── fb-bindings-statement.cc
├── fb-bindings-blob.cc
└── fb-bindings-eventblock.cc
├── LICENSE
├── .travis.yml
├── binding.gyp
├── appveyor.yml
├── firebird.js
└── README.md
/tests/.gitignore:
--------------------------------------------------------------------------------
1 | current/
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | build/
2 | test.js
3 | package-lock.json
4 | issue*
5 | .project
6 | /node_modules
7 | *.log
8 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | test.js
2 | build
3 | issues
4 | tests
5 | tools
6 | node_modules
7 | .travis.yml
8 | appveyor.yml
9 |
--------------------------------------------------------------------------------
/fb/lib/fbclient_ms.lib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/fb/lib/fbclient_ms.lib
--------------------------------------------------------------------------------
/fb/lib64/fbclient_ms.lib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/fb/lib64/fbclient_ms.lib
--------------------------------------------------------------------------------
/tests/testdata/image.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/tests/testdata/image.gif
--------------------------------------------------------------------------------
/tests/createTestDB.sql:
--------------------------------------------------------------------------------
1 | SET SQL DIALECT 3;
2 | create database 'TEST.FDB' USER 'SYSDBA' PASSWORD 'masterkey' page_size 8192 DEFAULT CHARACTER SET UTF8;
3 |
--------------------------------------------------------------------------------
/samples/fileman/static/elfinder/images/ql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/elfinder/images/ql.png
--------------------------------------------------------------------------------
/samples/fileman/static/elfinder/images/icons-big.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/elfinder/images/icons-big.png
--------------------------------------------------------------------------------
/samples/fileman/static/elfinder/images/icons-big.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/elfinder/images/icons-big.psd
--------------------------------------------------------------------------------
/samples/fileman/static/elfinder/images/spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/elfinder/images/spinner.gif
--------------------------------------------------------------------------------
/samples/fileman/static/elfinder/images/toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/elfinder/images/toolbar.png
--------------------------------------------------------------------------------
/samples/fileman/static/elfinder/images/icons-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/elfinder/images/icons-small.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-icons_222222_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-icons_222222_256x240.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-icons_2e83ff_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-icons_2e83ff_256x240.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-icons_454545_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-icons_454545_256x240.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-icons_888888_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-icons_888888_256x240.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-icons_cd0a0a_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-icons_cd0a0a_256x240.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "tools/nodeunit"]
2 | path = tools/nodeunit
3 | url = git://github.com/caolan/nodeunit.git
4 | [submodule "tools/node-deferred"]
5 | path = tools/node-deferred
6 | url = git://github.com/felixge/node-deferred.git
7 |
--------------------------------------------------------------------------------
/samples/fileman/static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/HEAD/samples/fileman/static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
--------------------------------------------------------------------------------
/tests/config.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 |
4 | See license text in LICENSE file
5 | */
6 | const path = require('path');
7 |
8 | exports.cfg = {
9 | // Database connection settings
10 | db: "127.0.0.1:" + path.join(__dirname,"..","build","test_db","TEST.FDB"),
11 | // db: "192.168.111.133:test.fdb",
12 | user: "sysdba",
13 | password: "masterkey",
14 | role: ""
15 | };
16 |
17 | console.log(exports.cfg);
18 |
19 |
--------------------------------------------------------------------------------
/samples/testDisconnect/config.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 |
4 | See license text in LICENSE file
5 | */
6 | const path = require('path');
7 |
8 | exports.cfg = {
9 | // Database connection settings
10 | db: "127.0.0.1:" + path.join(__dirname,"..","..","build","test_db","TEST.FDB"),
11 | // db: "192.168.111.133:test.fdb",
12 | user: "sysdba",
13 | password: "masterkey",
14 | role: ""
15 | };
16 |
17 | console.log(exports.cfg);
18 |
19 |
--------------------------------------------------------------------------------
/tests/createTestDB.cmd:
--------------------------------------------------------------------------------
1 | set FB_PATH=C:\Program Files\Firebird\Firebird_2_5\bin\
2 | set BUILD_DIR=%~dp0..\build\
3 | set CREATE_SCRIPT=%~dp0..\tests\createTestDB.sql
4 | set DB_DIR=%BUILD_DIR%test_db\
5 | set TEST_DB=%DB_DIR%TEST.FDB
6 | IF EXIST %DB_DIR% GOTO RECREATE_DB
7 | cd %BUILD_DIR%
8 | mkdir test_db
9 | :RECREATE_DB
10 | rem delete old db
11 | cd %DB_DIR%
12 | if NOT EXIST %TEST_DB% GOTO CREATE_DB
13 | del %TEST_DB%
14 | :CREATE_DB
15 | "%FB_PATH%isql" -input %CREATE_SCRIPT%
16 |
17 | IF EXIST %BUILD_DIR%Release\fbclient.dll GOTO FINISHED
18 | copy "%FB_PATH%fbclient.dll" %BUILD_DIR%Release\
19 | :FINISHED
20 |
21 |
22 |
--------------------------------------------------------------------------------
/samples/deferred/sample.js:
--------------------------------------------------------------------------------
1 | var fb = require('./fb-deferred.js');
2 |
3 | var conn = fb.createConnection();
4 |
5 | conn.connect('test.fdb','sysdba','masterkey','')
6 | .trycatch()
7 | .addCallback(function(){
8 | console.log('connected');
9 | return conn.query("select * from rdb$relations");
10 | })
11 | .addCallback(function(res){
12 | console.log('fetching');
13 | return res.fetch("all",true,function(row){
14 | console.log(row);
15 | });
16 | })
17 | .addCallback(function(){
18 | console.log('all fetched');
19 | })
20 | .addErrback(function(err) {
21 | console.log('error');
22 | console.log(err);
23 | });
--------------------------------------------------------------------------------
/samples/testDisconnect/testCommit.js:
--------------------------------------------------------------------------------
1 | var cfg = require("./config").cfg;
2 |
3 | // Require modules
4 | var
5 | fb_binding = require("../../firebird.js");
6 |
7 |
8 |
9 | var conn = fb_binding.createConnection();
10 | conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
11 | if(conn.connected) {
12 | console.log("Connected to database");
13 | }
14 | var res = conn.querySync("select * from rdb$relations");
15 | console.log("Committin");
16 | conn.commit(function(err){
17 | console.log("Commit done ", err);
18 | });
19 |
20 | setTimeout(function(){
21 | console.log("after timeout");
22 |
23 | }, 5000);
24 |
25 |
--------------------------------------------------------------------------------
/samples/simple-ws/simple-ws.js:
--------------------------------------------------------------------------------
1 | var fb=require('../../firebird');
2 | var http=require('http');
3 | var sys =require('sys');
4 | // Create Firebird Connection Object
5 | var con = fb.createConnection();
6 |
7 | // Connect to Database
8 | con.connectSync('test.fdb','sysdba','masterkey','');
9 |
10 | // Create HTTP server
11 | http.createServer(function(req,res){
12 | // Query and fecth all rows
13 | var rows = con.querySync("select * from rdb$relations")
14 | .fetchSync('all',true);
15 | res.writeHead(200,{'Content-Type':'text/plain'});
16 | // Return rows object (it is array) to browser
17 | res.end(sys.inspect(rows));
18 | }).listen(8080);
19 |
20 | console.log('Server is running at http://localhost:8080');
--------------------------------------------------------------------------------
/samples/testDisconnect/test-disconnect-blob.js:
--------------------------------------------------------------------------------
1 | // Load configuration
2 | var cfg = require("./config").cfg;
3 |
4 | // Require modules
5 | var
6 | fb_binding = require("../../firebird.js");
7 |
8 |
9 |
10 | var conn = fb_binding.createConnection();
11 | conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
12 | if(conn.connected) {
13 | console.log("Connected to database");
14 | }
15 | // var trans = conn.startNewTransactionSync();
16 | var res = conn.querySync("select * from rdb$relations");
17 | // trans.rollbackSync();
18 | console.log("Query result 1", res)
19 |
20 |
21 | setTimeout(function() {
22 | console.log("Try again")
23 | var blob = conn.newBlobSync();
24 | console.log("Blob", blob);
25 |
26 |
27 | }, 20000);
28 |
29 |
--------------------------------------------------------------------------------
/samples/fileman/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Files
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/tests/perf/select-full-sync.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 | var fb = require('../../firebird');
9 | var util = require('util');
10 |
11 | var http = require('http');
12 |
13 | http.createServer(function (req, res) {
14 | res.writeHead(200, {'Content-Type': 'text/plain'});
15 | var con = fb.createConnection();
16 | con.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
17 | // var rs = con.querySync('select * from rdb$relations');
18 | var rs = con.querySync('select first 20 * from test_t where pid = 10');
19 | var rows = rs.fetchSync("all",true);
20 | con.disconnect();
21 | res.write('[');
22 | rows.forEach(function(r){
23 | res.write(JSON.stringify(r)+',');
24 | });
25 | res.end(']');
26 | }).listen(1337, "127.0.0.1");
27 | console.log('Server running at http://127.0.0.1:1337/');
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "firebird",
3 | "version": "v0.1.5-snapshot",
4 | "description": "Firebird binding to node, uses libfbclient.",
5 | "author": "Denys Khanzhiyev",
6 | "main": "./firebird",
7 | "maintainers": [
8 | {
9 | "name": "Denys Khanzhiyev",
10 | "email": "xdenser@gmail.com"
11 | }
12 | ],
13 | "bugs": {
14 | "url": "http://github.com/xdenser/node-firebird-libfbclient/issues"
15 | },
16 | "licenses": [
17 | {
18 | "type": "MIT",
19 | "url": "https://raw.githubusercontent.com/xdenser/node-firebird-libfbclient/master/LICENSE"
20 | }
21 | ],
22 | "engines": {
23 | "node": ">=0.10"
24 | },
25 | "repository": {
26 | "type": "git",
27 | "url": "http://github.com/xdenser/node-firebird-libfbclient"
28 | },
29 | "dependencies": {
30 | "nan": "^2.10.0"
31 | },
32 | "devDependencies" : {
33 | "nodeunit": "^0.11.3"
34 | },
35 | "scripts": {
36 | "test": "nodeunit tests/def"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/samples/fileman/fileman.js:
--------------------------------------------------------------------------------
1 | var connect = require('connect');
2 | var sys = require('sys');
3 | var elfinder = require('./elfinder').elfinder;
4 |
5 |
6 | connect(
7 | function(req,res,next){
8 | if(req.url=='/') req.url = '/index.html';
9 | next();
10 | },
11 | connect.favicon(),
12 | connect.static(__dirname + '/static'),
13 | connect.bodyParser(),
14 | function(req,res,next){
15 | if(req.url.match(/^\/node/)){
16 | var meth = req.url.match(/^\/node\/(.+)[\?\/]/)[1];
17 | // console.log('method '+meth);
18 | var respObj = {
19 | elfinder: function(){
20 | elfinder(req, res);
21 | }
22 | };
23 | if(meth in respObj) respObj[meth]();
24 | else next();
25 | }
26 | else next();
27 | },
28 | function(req,res){
29 | res.setHeader('Content-Type','text/html');
30 | res.statusCode = 404;
31 | res.end("Not Found !");
32 | }
33 | ).listen(8080);
34 |
35 | console.log('Server is running at http://localhost:8080');
--------------------------------------------------------------------------------
/src/fb-bindings-fbeventemitter.h:
--------------------------------------------------------------------------------
1 | /*!
2 | * Copyright by Denys Khanzhiyev aka xdenser
3 | *
4 | * See license text in LICENSE file
5 | */
6 | #ifndef SRC_FB_BINDINGS_FBEVENTEMITTER_H_
7 | #define SRC_FB_BINDINGS_FBEVENTEMITTER_H_
8 | #define BUILDING_NODE_EXTENSION 1
9 |
10 | #include "./fb-bindings.h"
11 |
12 | using namespace node;
13 | using namespace v8;
14 |
15 |
16 | class FBEventEmitter: public Nan::ObjectWrap {
17 | public:
18 | static void Initialize(v8::Local target);
19 | static Nan::Persistent constructor_template;
20 | void Emit(Local event, int argc, Local argv[]);
21 |
22 | protected:
23 | void start_async();
24 |
25 | void stop_async();
26 |
27 | FBEventEmitter ();
28 |
29 | /*static Local
30 | InAsyncGetter(Local property,
31 | const AccessorInfo &info);
32 | */
33 | static NAN_GETTER(InAsyncGetter);
34 |
35 | static Nan::AsyncResource asyncResource;
36 |
37 | private:
38 | bool in_async;
39 | };
40 |
41 | #endif
42 |
--------------------------------------------------------------------------------
/tests/perf/select-one-sync.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 | var fb = require('../../firebird');
9 | var util = require('util');
10 |
11 | var http = require('http');
12 |
13 | var con = fb.createConnection();
14 | con.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
15 |
16 | http.createServer(function (req, res) {
17 | res.writeHead(200, {'Content-Type': 'text/plain'});
18 | if(!con.inTransaction) con.startTransactionSync();
19 | //var rs = con.querySync('select * from rdb$relations');
20 | var rs = con.querySync('select * from test_t where pid = 10');
21 | var rows = rs.fetchSync("all",true);
22 | res.write('[');
23 | rows.forEach(function(r){
24 | res.write(JSON.stringify(r)+',');
25 | });
26 | res.end(']');
27 | con.commitSync();
28 | }).listen(1337, "127.0.0.1");
29 | console.log('Server running at http://127.0.0.1:1337/');
30 |
31 | process.on('exit',function(){
32 | con.disconnect();
33 | });
--------------------------------------------------------------------------------
/tests/perf/select-full-async.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 | var fb = require('../../firebird');
9 | var util = require('util');
10 |
11 | var http = require('http');
12 |
13 | http.createServer(function (req, res) {
14 | res.writeHead(200, {'Content-Type': 'text/plain'});
15 | var con = fb.createConnection();
16 | con.connect(cfg.db, cfg.user, cfg.password, cfg.role,function(){
17 | //con.query('select * from rdb$relations',function(err,rs){
18 | con.query('select first 20 * from test_t where pid = 10',function(err,rs){
19 | //var rows = [];
20 | res.write('[');
21 | rs.fetch("all",true,function(r){
22 | //rows.push(r);
23 | res.write(JSON.stringify(r)+',');
24 | }, function(err){
25 | con.disconnect();
26 | //res.end(util.inspect(rows));
27 | res.end(']');
28 | });
29 |
30 | });
31 | });
32 |
33 | }).listen(1337, "127.0.0.1");
34 | console.log('Server running at http://127.0.0.1:1337/');
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 | -----------
3 |
4 | Copyright (C) 2011 Denys Khanzhiyev aka xdenser.
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in
14 | all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | THE SOFTWARE.
23 |
--------------------------------------------------------------------------------
/src/fb-bindings.h:
--------------------------------------------------------------------------------
1 | /*!
2 | * Copyright by Denys Khanzhiyev aka xdenser
3 | *
4 | * See license text in LICENSE file
5 | */
6 |
7 | #ifndef SRC_FB_BINDINGS_H_
8 | #define SRC_FB_BINDINGS_H_
9 |
10 | // #include
11 | #include
12 | #include
13 | #include
14 |
15 | #if NODE_MODULE_VERSION < NODE_10_0_MODULE_VERSION
16 | # define FB_MAYBE_NEED_ISOLATE
17 | #else
18 | # define FB_MAYBE_NEED_ISOLATE Isolate::GetCurrent(),
19 | #endif
20 |
21 | #define MAX_ERR_MSG_LEN 1024
22 | #define ERR_MSG(obj,class) \
23 | Nan::New(ErrorMessage(obj->status,obj->err_message,sizeof(obj->err_message))).ToLocalChecked()
24 |
25 | #define ERR_MSG_STAT(status,class) \
26 | Nan::New(ErrorMessage(status,class::err_message,sizeof(class::err_message))).ToLocalChecked()
27 |
28 |
29 | #define REQ_EXT_ARG(I, VAR) \
30 | if (info.Length() <= (I) || !info[I]->IsExternal()) \
31 | return Nan::ThrowTypeError( \
32 | "Argument " #I " invalid"); \
33 | Local VAR = Local::Cast(info[I]);
34 |
35 | char * ErrorMessage(const ISC_STATUS *pvector, char *err_msg, int max_len);
36 |
37 | class Connection;
38 | class Transaction;
39 |
40 | #endif
41 |
42 |
--------------------------------------------------------------------------------
/fb/include/ib_util.h:
--------------------------------------------------------------------------------
1 | /*
2 | * PROGRAM: UDF and Blob filter Utilities library
3 | * MODULE: ib_util.h
4 | * DESCRIPTION: Prototype header file for ib_util.c
5 | *
6 | * The contents of this file are subject to the Interbase Public
7 | * License Version 1.0 (the "License"); you may not use this file
8 | * except in compliance with the License. You may obtain a copy
9 | * of the License at http://www.Inprise.com/IPL.html
10 | *
11 | * Software distributed under the License is distributed on an
12 | * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
13 | * or implied. See the License for the specific language governing
14 | * rights and limitations under the License.
15 | *
16 | * The Original Code was created by Inprise Corporation
17 | * and its predecessors. Portions created by Inprise Corporation are
18 | * Copyright (C) Inprise Corporation.
19 | *
20 | * All Rights Reserved.
21 | * Contributor(s): ______________________________________.
22 | */
23 |
24 | #ifndef _IB_UTIL_H
25 | #define _IB_UTIL_H
26 |
27 | #ifdef __cplusplus
28 | extern "C" {
29 | #endif
30 |
31 | extern void *ib_util_malloc(long);
32 |
33 | #ifdef __cplusplus
34 | } /* extern "C" */
35 | #endif
36 |
37 | #endif /* _IB_UTIL_H */
38 |
--------------------------------------------------------------------------------
/samples/testDisconnect/test-disconnect.js:
--------------------------------------------------------------------------------
1 | // Load configuration
2 | var cfg = require("./config").cfg;
3 |
4 | // Require modules
5 | var
6 | fb_binding = require("../../firebird.js");
7 |
8 |
9 |
10 | var conn = fb_binding.createConnection();
11 | conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
12 | if(conn.connected) {
13 | console.log("Connected to database");
14 | }
15 | // var trans = conn.startNewTransactionSync();
16 | // var res = conn.querySync("select * from rdb$relations");
17 | // trans.rollbackSync();
18 | //console.log("Query result 1", res)
19 |
20 |
21 | setTimeout(function() {
22 | console.log("Try again")
23 | var res = conn.query("select * from rdb$relations", function(err){
24 | console.log("Error", err);
25 | });
26 | /*
27 | conn.startNewTransaction(function(err, trans){
28 | if(err) {
29 | console.log("error", err);
30 | conn.disconnect();
31 | console.log("Connection is not ok", conn);
32 | return;
33 | }
34 | trans.rollbackSync();
35 | console.log("Connection is ok", conn);
36 | });
37 | */
38 |
39 |
40 | }, 20000);
41 |
42 |
--------------------------------------------------------------------------------
/tests/def/test-concurrent-fetch.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 | var sys = require("util");
9 |
10 | var zexports = {};
11 | // Require modules
12 | var
13 | fb_binding = require("../../firebird");
14 |
15 |
16 | exports.FetchFromSameConnection = function(test){
17 | var num_of_fetches = 100
18 | test.expect(1 + num_of_fetches );
19 | var conn = fb_binding.createConnection();
20 | conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
21 | test.ok(conn.connected,"Connected to database");
22 | var res = [];
23 | for(var i = 0; i target)
45 | {
46 | Nan::HandleScope scope;
47 |
48 | event_block::Init();
49 | FBEventEmitter::Initialize(target);
50 | FBResult::Initialize(target);
51 | Connection::Initialize(target);
52 | FBblob::Initialize(target);
53 | FBStatement::Initialize (target);
54 | Transaction::Initialize(target);
55 | }
56 |
57 | NODE_MODULE(binding, init)
58 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "stable"
4 | - v14
5 | - v12
6 | - v10
7 | env:
8 | - CXX=g++-5
9 | notifications:
10 | email:
11 | - xdenser@gmail.com
12 | before_install:
13 | - sudo add-apt-repository ppa:mapopa/ppa -y
14 | - sudo apt-get update -qq
15 | - sudo apt-get install -qq --force-yes firebird2.5-superclassic firebird2.5-dev
16 | - sudo sed /ENABLE_FIREBIRD_SERVER=/s/no/yes/ -i /etc/default/firebird2.5
17 | - cat /etc/default/firebird2.5 | grep ENABLE_FIREBIRD_SERVER
18 | - sudo service firebird2.5-superclassic start
19 | - sudo cat /etc/firebird/2.5/SYSDBA.password
20 | - sudo bash -c '(export FB_VER="2.5"; export FB_FLAVOUR="superclassic";source /usr/share/firebird2.5-common/functions.sh; writeNewPassword masterkey)'
21 | - sudo cat /etc/firebird/2.5/SYSDBA.password
22 | - npm install nodeunit
23 | - rm -f package-lock.json
24 | - sleep 5
25 | before_script:
26 | - cd build
27 | - mkdir test_db
28 | - cd test_db
29 | - sudo isql-fb -input ../../tests/createTestDB.sql
30 | - sudo chmod -c 0666 TEST.FDB
31 | - sudo chmod -v a+x /home/travis/build/xdenser/node-firebird-libfbclient/build/test_db
32 | - sudo chmod -v a+x /home/travis/build/xdenser/node-firebird-libfbclient/build
33 | - sudo chmod -v a+x /home/travis/build/xdenser/node-firebird-libfbclient
34 | - sudo chmod -v a+x /home/travis/build/xdenser
35 | - sudo chmod -v a+x /home/travis/build
36 | - sudo chmod -v a+x /home/travis
37 | - sudo chmod -v a+x /home
38 | - pwd
39 | - ls -l
40 | - cd ../..
41 | - sleep 5
42 |
43 |
--------------------------------------------------------------------------------
/binding.gyp:
--------------------------------------------------------------------------------
1 | {
2 | 'targets': [
3 | {
4 | 'target_name': 'binding',
5 | 'sources': [ './src/fb-bindings.cc', './src/fb-bindings-blob.cc',
6 | './src/fb-bindings-fbresult.cc',
7 | './src/fb-bindings-connection.cc','./src/fb-bindings-eventblock.cc',
8 | './src/fb-bindings-fbeventemitter.cc',
9 | './src/fb-bindings-statement.cc',
10 | './src/fb-bindings-transaction.cc' ],
11 | 'include_dirs': [
12 | '<(module_root_dir)/fb/include',
13 | " error_symbol;
17 | static Nan::Persistent result_symbol;
18 |
19 | class FBStatement:public FBResult{
20 | public:
21 | static Nan::Persistent constructor_template;
22 |
23 | static void
24 | Initialize (v8::Local target);
25 |
26 | protected:
27 | static NAN_METHOD(New);
28 |
29 | void InstExecSync(const Nan::FunctionCallbackInfo& info, Transaction* transaction, int firstArg);
30 | static NAN_METHOD(ExecSync);
31 | static NAN_METHOD(ExecInTransSync);
32 |
33 | struct exec_request {
34 | FBStatement *statement;
35 | Transaction *trans;
36 | bool result;
37 | };
38 |
39 | static void EIO_After_Exec(uv_work_t *req);
40 |
41 | static void EIO_Exec(uv_work_t *req);
42 |
43 | void InstExec(const Nan::FunctionCallbackInfo& info, Transaction* transaction, int firstArg);
44 | static NAN_METHOD(Exec);
45 | static NAN_METHOD(ExecInTrans);
46 |
47 |
48 | FBStatement(XSQLDA *insqlda, XSQLDA *outsqlda, isc_stmt_handle *astmtp, Connection* aconn);
49 | ~FBStatement();
50 |
51 | private:
52 | XSQLDA *in_sqlda;
53 | int statement_type;
54 | bool retres;
55 |
56 | void finished() override {};
57 | char cursor[50];
58 |
59 | };
60 |
61 |
62 | #endif
63 |
--------------------------------------------------------------------------------
/tests/perf/select-prep-async.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 | var fb = require('../../firebird');
9 | var util = require('util');
10 |
11 | var http = require('http');
12 | var con = fb.createConnection();
13 | con.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
14 | var stmt = con.prepareSync('select * from rdb$relations');
15 | stmt.setMaxListeners(2000);
16 | stmt.lock = false;
17 |
18 | http.createServer(function (req, res) {
19 | res.writeHead(200, {'Content-Type': 'text/plain'});
20 | // console.log(stmt);
21 |
22 | var resp = function(){
23 | console.log('resp');
24 | if(stmt.lock){
25 | stmt.once('unlock',resp);
26 | return;
27 | }
28 | stmt.lock = true;
29 | console.log('resp start');
30 |
31 | stmt.once('result',function(err){
32 | var rows = [];
33 | if(err) console.log('exec error '+err.message);
34 | console.log('before fetch');
35 | stmt.fetch("all",true,function(r){
36 | rows.push(r);
37 | }, function(err){
38 | if(err) console.log('error '+err.message);
39 | console.log('after fetch ' +rows.length);
40 | res.end(util.inspect(rows));
41 | stmt.lock = false;
42 | process.nextTick(function(){
43 | stmt.emit('unlock');
44 | });
45 | });
46 | });
47 | stmt.exec();
48 |
49 | }
50 |
51 |
52 | resp();
53 |
54 | }).listen(1337, "127.0.0.1");
55 | console.log('Server running at http://127.0.0.1:1337/');
56 |
57 | process.on('exit',function(){
58 | con.disconnect();
59 | });
--------------------------------------------------------------------------------
/tests/def/test-fbres.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 |
9 | // Require modules
10 | var
11 | fb_binding = require("../../firebird.js");
12 |
13 | var
14 | testCase = require("nodeunit").testCase;
15 |
16 | module.exports = testCase({
17 | setUp: function(callback){
18 | this.conn = fb_binding.createConnection();
19 | this.conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
20 | this.res = this.conn.querySync("select * from rdb$relations");
21 | callback();
22 | },
23 | tearDown: function(callback){
24 | this.conn.disconnect();
25 | callback();
26 | },
27 | FBResult: function(test){
28 | test.expect(1);
29 | test.ok(this.res,"There is result");
30 | test.done();
31 | },
32 | FBResultFetchSyncArgs: function(test){
33 | test.expect(1);
34 | test.throws(function(){
35 | this.res.fetchSync();
36 | },"Expect Arguments");
37 | test.done();
38 | },
39 | FBResFetchSyncOne: function(test){
40 | test.expect(1);
41 | var row = this.res.fetchSync("all",false);
42 | test.ok(row, "There is row");
43 | test.done();
44 | },
45 | FBResFetchMany: function(test){
46 | var c = 0;
47 | test.expect(3);
48 | this.res.fetch(2,false, function(row){
49 | c++;
50 | test.ok(row,"A Row");
51 | }, function(err,eof){
52 | test.ok(!err,"No Error");
53 | test.done();
54 | });
55 | }
56 | });
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/fb-bindings-transaction.h:
--------------------------------------------------------------------------------
1 | #ifndef SRC_FB_BINDINGS_TRANSACTION_H_
2 | #define SRC_FB_BINDINGS_TRANSACTION_H_
3 |
4 |
5 | #include "./fb-bindings.h"
6 | #include "./fb-bindings-fbeventemitter.h"
7 |
8 | class Transaction : public FBEventEmitter {
9 |
10 | public:
11 |
12 | Connection *connection;
13 | isc_tr_handle trans;
14 | ISC_STATUS_ARRAY status;
15 |
16 | static Nan::Persistent constructor_template;
17 | static void Initialize(v8::Local target);
18 | static NAN_METHOD(New);
19 |
20 | bool commit_transaction();
21 |
22 | bool rollback_transaction();
23 |
24 | bool start_transaction();
25 |
26 | enum TransReqType {
27 | rCommit,
28 | rRollback,
29 | rStart
30 | };
31 |
32 | struct transaction_request {
33 | Nan::Callback *callback;
34 | Transaction *transaction;
35 | TransReqType type;
36 | bool result;
37 | };
38 |
39 | Transaction(Connection *conn);
40 | ~Transaction();
41 |
42 | static void EIO_After_TransactionRequest(uv_work_t *req);
43 |
44 | static void EIO_TransactionRequest(uv_work_t *req);
45 |
46 | void makeTrRequest(const Nan::FunctionCallbackInfo& info, TransReqType type);
47 |
48 | char err_message[MAX_ERR_MSG_LEN];
49 |
50 | static NAN_GETTER(InTransactionGetter);
51 |
52 | static NAN_METHOD(Commit);
53 | void InstCommit(const Nan::FunctionCallbackInfo& info);
54 | static NAN_METHOD(Rollback);
55 | void InstRollback(const Nan::FunctionCallbackInfo& info);
56 | static NAN_METHOD(Start);
57 | void InstStart(const Nan::FunctionCallbackInfo& info);
58 |
59 | static NAN_METHOD(CommitSync);
60 | static NAN_METHOD(RollbackSync);
61 | static NAN_METHOD(StartSync);
62 |
63 | static NAN_METHOD(QuerySync);
64 | static NAN_METHOD(Query);
65 |
66 | static NAN_METHOD(PrepareSync);
67 | };
68 | #endif
--------------------------------------------------------------------------------
/tests/perf/select-prep-async-trans.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 | var fb = require('../../firebird');
9 | var util = require('util');
10 |
11 | var http = require('http');
12 | var con = fb.createConnection();
13 | con.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
14 | var stmt = con.prepareSync('select * from rdb$relations');
15 | stmt.setMaxListeners(2000);
16 | stmt.lock = false;
17 |
18 | http.createServer(function (req, res) {
19 | res.writeHead(200, {'Content-Type': 'text/plain'});
20 | // console.log(stmt);
21 | var exec = function(){
22 | stmt.exec();
23 | stmt.once('result',function(err){
24 | //var rows = [];
25 | res.write('[');
26 | stmt.fetch("all",true,function(r){
27 | // rows.push(r);
28 | res.write(JSON.stringify(r)+',');
29 | }, function(err){
30 | res.end(']');
31 | con.commit(function(err){
32 | //if(err) return;
33 | stmt.lock = false;
34 | process.nextTick(function(){
35 | stmt.emit('unlock');
36 | });
37 | });
38 | });
39 | });
40 | };
41 |
42 | var resp = function(){
43 | if(stmt.lock){
44 | stmt.once('unlock',resp);
45 | return;
46 | }
47 | stmt.lock = true;
48 | if(!con.inTransaction) con.startTransaction(function(err){
49 | if(!err) exec();
50 | });
51 | else exec();
52 | }
53 |
54 |
55 | resp();
56 |
57 | }).listen(1337, "127.0.0.1");
58 | console.log('Server running at http://127.0.0.1:1337/');
59 |
60 | process.on('exit',function(){
61 | con.disconnect();
62 | });
--------------------------------------------------------------------------------
/tests/def/test-storedproc.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 |
9 | // Require modules
10 | var
11 | fb_binding = require("../../firebird.js");
12 |
13 | var
14 | testCase = require("nodeunit").testCase;
15 |
16 | module.exports = testCase({
17 | setUp: function(callback){
18 | this.conn = new fb_binding.createConnection();
19 | this.conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
20 | var sql = 'CREATE OR ALTER PROCEDURE TESTINGPROCEDURE (TESTINPUT BIGINT) RETURNS ( TESTOUTPUT BIGINT ) AS declare variable CON integer; declare variable MAXCON integer; begin TESTOUTPUT = TESTINPUT; end';
21 | this.conn.querySync(sql);
22 | callback();
23 | },
24 | tearDown: function(callback){
25 | this.conn.disconnect();
26 | this.conn = null;
27 | var conn = new fb_binding.createConnection();
28 | conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
29 | conn.querySync('drop procedure TESTINGPROCEDURE');
30 | conn.disconnect();
31 | callback();
32 | },
33 | testProc : function(test) {
34 | test.expect(2);
35 |
36 | const query = "EXECUTE PROCEDURE TESTINGPROCEDURE (1);"
37 |
38 | this.conn.startNewTransaction((err, transaction) => {
39 | transaction.query(query, (err, result) => {
40 | if(err) {
41 | console.log(err);
42 | }
43 | test.ok(!err, "error on query");
44 | transaction.commit(err => {
45 | //console.log(result);
46 | test.equal(result.TESTOUTPUT, 1, "wrong result");
47 | test.done();
48 | })
49 | });
50 | });
51 |
52 | }
53 | });
--------------------------------------------------------------------------------
/src/fb-bindings-blob.h:
--------------------------------------------------------------------------------
1 | /*!
2 | * Copyright by Denys Khanzhiyev aka xdenser
3 | *
4 | * See license text in LICENSE file
5 | */
6 | #ifndef SRC_FB_BINDINGS_BLOB_H_
7 | #define SRC_FB_BINDINGS_BLOB_H_
8 | #define BUILDING_NODE_EXTENSION 1
9 |
10 |
11 | #include "./fb-bindings.h"
12 | #include
13 | #include
14 |
15 | #include "./fb-bindings-fbeventemitter.h"
16 | #include "./fb-bindings-transaction.h"
17 |
18 |
19 |
20 | class FBblob : public FBEventEmitter {
21 |
22 | public:
23 |
24 | static Nan::Persistent constructor_template;
25 |
26 | static void
27 | Initialize (v8::Local target);
28 |
29 | static bool HasInstance(v8::Local val);
30 | void getId(ISC_QUAD* Idp);
31 |
32 |
33 | protected:
34 |
35 | static NAN_METHOD(New);
36 | static NAN_METHOD(ReadSync);
37 | static NAN_METHOD(Read);
38 | static NAN_METHOD(OpenSync);
39 | static NAN_METHOD(CloseSync);
40 | static NAN_METHOD(WriteSync);
41 | static NAN_METHOD(Write);
42 |
43 | struct rw_request {
44 | Nan::Callback *callback;
45 | FBblob *blob;
46 | char* buffer;
47 | uint32_t length;
48 | int res;
49 | ISC_STATUS_ARRAY status;
50 | };
51 |
52 |
53 | static void EIO_After_Read(uv_work_t *req);
54 |
55 | static void EIO_Read(uv_work_t *req);
56 |
57 | static void EIO_After_Write(uv_work_t *req);
58 |
59 | static void EIO_Write(uv_work_t *req);
60 |
61 | static NAN_GETTER(IsReadGetter);
62 |
63 | FBblob(ISC_QUAD *id, Transaction *trans, ISC_STATUS *status);
64 | ~FBblob();
65 |
66 | bool open(ISC_STATUS *status);
67 | int read(ISC_STATUS *status,char *buf, unsigned short len, unsigned short* alen);
68 | bool close(ISC_STATUS *status);
69 |
70 |
71 |
72 | private:
73 | ISC_QUAD blob_id;
74 | Transaction *trans;
75 | isc_blob_handle handle;
76 | bool is_read;
77 | static char err_message[MAX_ERR_MSG_LEN];
78 |
79 |
80 |
81 | };
82 |
83 |
84 |
85 | #endif
86 |
--------------------------------------------------------------------------------
/samples/deferred/fb-deferred.js:
--------------------------------------------------------------------------------
1 | var Deferred = require('../../tools/node-deferred/lib/deferred.js').Deferred,
2 | fb=require('../../firebird');
3 |
4 |
5 | exports.createConnection = fb.createConnection;
6 |
7 | var Connection = fb.binding.Connection,
8 | FBResult = fb.binding.FBResult,
9 | FBStatement = fb.binding.FBStatement;
10 |
11 |
12 |
13 | function MakeDeferred(obj,meth,cb_num){
14 | var super = obj.prototype[meth];
15 | obj.prototype[meth] = function(){
16 |
17 | var d = new Deferred();
18 | var args = [].slice.call(arguments);
19 | args[cb_num] = function(){
20 | var err = arguments[0];
21 | var args = [].slice.call(arguments,1);
22 | if(err) d.errback(err);
23 | else d.callback(args);
24 | }
25 | super.apply(this,args);
26 | return d;
27 | }
28 | }
29 |
30 | MakeDeferred(Connection,'connect',4);
31 | MakeDeferred(Connection,'query',2);
32 | MakeDeferred(Connection,'commit',0);
33 | MakeDeferred(Connection,'rollback',0);
34 | MakeDeferred(FBResult,'fetch',3);
35 |
36 |
37 | var superExec = FBStatement.prototype.exec;
38 | FBStatement.prototype.exec = function(){
39 | var d = new Deferred();
40 | this.once('error', function(err){
41 | d.errback(err);
42 | });
43 | var self = this;
44 | this.once('result', function(){
45 | d.callback(self);
46 | });
47 | superExec.apply(this,arguments);
48 | return d;
49 | };
50 |
51 |
52 | /*
53 | var superConnect = Connection.prototype.connect;
54 | Connection.prototype.connect = function(db,user,pass,role,cb){
55 | var d = new Deferred();
56 | superConnect.call(this,db,user,pass,role,function (err){
57 | if(err) d.errback(err);
58 | else d.callback();
59 | });
60 | return d;
61 | };
62 |
63 | var superQuery = Connection.prototype.query;
64 | Connection.prototype.query = function(sql,cb){
65 | var d = new Deferred();
66 | superQuery.call(this,sql,function(err,res){
67 | if(err) obj.emit('error',err);
68 | else obj.emit('result',res);
69 | if(cb) cb(err,res);
70 | });
71 | };
72 | */
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/samples/fileman/elfinder.js:
--------------------------------------------------------------------------------
1 | var url = require('url');
2 | var crypto = require('crypto');
3 | var sys = require('sys');
4 |
5 | function _hash(str){
6 | var h = crypto.createHash('md5');
7 | h.update(str);
8 | return h.digest('hex');
9 | }
10 |
11 | function _cwd(obj,name){
12 | if(name=='') name = 'root';
13 | obj.cwd = {
14 | hash: _hash(name),
15 | name: name,
16 | mime: 'directory',
17 | rel : name,
18 | size: 0,
19 | date: (new Date()).toString(),
20 | read: true,
21 | write: true,
22 | rm: false
23 | };
24 | }
25 |
26 | function _cdc(obj,path){
27 | obj.cdc = [];
28 | }
29 |
30 | function _tree(path){
31 | return {
32 | hash:_hash('root'),
33 | name: 'root',
34 | read: true,
35 | write: true,
36 | dirs:[]
37 | }
38 | }
39 |
40 | function _open(qry,cb){
41 | var obj = {};
42 | _cwd(obj,'');
43 | _cdc(obj,'');
44 | if(('tree' in qry)&& qry.tree){
45 | obj.tree = _tree('');
46 | }
47 | cb(obj);
48 | }
49 |
50 | var commands = {
51 | open: _open
52 | }
53 |
54 | function extend(obj)
55 | {
56 | for(var f in obj){
57 | if(obj.hasOwnProperty(f)) this[f] = obj[f];
58 | }
59 | }
60 |
61 | function elfinder(req,res){
62 | // console.log('in elfinder');
63 | var q = url.parse(req.url,true);
64 | var command = 'open';
65 | if('cmd' in q.query) command =q.query.cmd;
66 |
67 | var add = {};
68 | if('init' in q.query){
69 | // console.log(sys.inspect(req.headers));
70 | add.disabled = [];
71 | add.params = {
72 | url : 'http://'+req.headers.host+'/node/elfinder',
73 | dotFiles: true,
74 | uplMaxSize: '15M',
75 | extract: [],
76 | archives: []
77 | };
78 | };
79 |
80 | if(command in commands){
81 | commands[command](q.query,function(obj){
82 | res.setHeader('Content-Type','application/json');
83 | extend.call(obj,add);
84 | res.end(JSON.stringify(obj));
85 | })
86 | }
87 | else
88 | {
89 | res.setHeader('Content-Type','text/html');
90 | res.statusCode = 503;
91 | res.end('Unknown command!');
92 | }
93 | }
94 |
95 | exports.elfinder = elfinder;
--------------------------------------------------------------------------------
/tests/def/test-concurrent-query.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright by Denys Khanzhiyev
3 | See license text in LICENSE file
4 | */
5 |
6 | // Load configuration
7 | var cfg = require("../config").cfg;
8 |
9 | var zexports = {};
10 | // Require modules
11 | var
12 | fb_binding = require("../../firebird");
13 |
14 |
15 | exports.TwoSmallQueries = function (test) {
16 | test.expect(6);
17 | var conn = fb_binding.createConnection();
18 | conn.connect(cfg.db, cfg.user, cfg.password, cfg.role, function(){
19 | test.ok(conn.connected,"Connected to database");
20 | var queries = 0;
21 | function check(){
22 | if(queries==2)
23 | {
24 | conn.disconnect();
25 | test.ok(!conn.connected,"Disconnected from database");
26 | test.done();
27 | }
28 | };
29 | conn.query("select * from rdb$relations", function(err,res){
30 | test.ok(!err,"No Error");
31 | test.ok(res,"Can query");
32 | queries++;
33 | check();
34 | });
35 | conn.query("select * from rdb$relations", function(err,res){
36 | test.ok(!err,"No Error");
37 | test.ok(res,"Can query");
38 | queries++;
39 | check();
40 | });
41 | });
42 | }
43 |
44 | exports.AHundredOfQueries = function(test){
45 | var query_count = 200;
46 | test.expect(query_count*2+2);
47 | var conn = fb_binding.createConnection();
48 | conn.addListener('z',function(){});
49 | conn.setMaxListeners(0);
50 |
51 | var queried = 0;
52 | function Finish(){
53 | if(queried==query_count){
54 | conn.disconnect();
55 | test.ok(!conn.connected,"Disconnected from database");
56 | test.done();
57 | }
58 | }
59 | function MakeQuery(){
60 | conn.query("select * from rdb$relations", function(err,res){
61 | test.ok(!err,"No Error");
62 | if(err) console.log(err.message);
63 | test.ok(res,"Can query");
64 | queried++;
65 | Finish();
66 | });
67 | }
68 | conn.connect(cfg.db, cfg.user, cfg.password, cfg.role, function(){
69 | test.ok(conn.connected,"Connected to database");
70 | for(var i = 0; i< query_count; i++) MakeQuery();
71 | });
72 | }
--------------------------------------------------------------------------------
/src/fb-bindings-fbresult.h:
--------------------------------------------------------------------------------
1 | /*!
2 | * Copyright by Denys Khanzhiyev aka xdenser
3 | *
4 | * See license text in LICENSE file
5 | */
6 | #ifndef SRC_FB_BINDINGS_FBRESULT_H_
7 | #define SRC_FB_BINDINGS_FBRESULT_H_
8 |
9 |
10 | #define BUILDING_NODE_EXTENSION 1
11 | #include
12 | #include
13 | #include
14 | #include
15 | //#include
16 | #include "./fb-bindings.h"
17 | #include "./fb-bindings-fbeventemitter.h"
18 | #include "./fb-bindings-blob.h"
19 | #include "./fb-bindings-connection.h"
20 |
21 |
22 | class FBResult : public FBEventEmitter {
23 |
24 | public:
25 |
26 | static Nan::Persistent constructor_template;
27 |
28 | static void
29 | Initialize (v8::Local target);
30 |
31 | // bool process_result(XSQLDA **sqldap, isc_stmt_handle *stmtp, Local res);
32 |
33 | static bool prepare_sqlda(XSQLDA *sqlda);
34 | static void clean_sqlda(XSQLDA *sqlda);
35 | static bool clone_sqlda(XSQLDA *src_sqlda,XSQLDA **dest_sqlda);
36 | static void set_params(XSQLDA *sqlda, Nan::NAN_METHOD_ARGS_TYPE info, int firstArg);
37 | Local