Changeset: 52bad36aaca2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=52bad36aaca2
Added Files:
        clients/nodejs/Tests/nodetest.js
Modified Files:
        clients/nodejs/monetdb/mapiclient.js
        clients/nodejs/monetdb/package.json
Branch: Oct2014
Log Message:

Node.JS connector: Fixes and test cases


diffs (199 lines):

diff --git a/clients/nodejs/Tests/nodetest.js b/clients/nodejs/Tests/nodetest.js
new file mode 100644
--- /dev/null
+++ b/clients/nodejs/Tests/nodetest.js
@@ -0,0 +1,78 @@
+var monetdb = require('../monetdb');
+var assert = require('assert');
+
+var dbport = parseInt(process.argv[2]);
+var dbname = process.argv[3];
+
+/* lets first check some failing connection attempts */
+monetdb.connect({host:'veryinvalidhostnamethathopefullyresolvesnowhere'}, 
function(resp) {
+       assert.equal(false,resp.success);
+       assert(resp.message.trim().length > 0);
+});
+
+monetdb.connect({dbname:'nonexist', port:dbport}, function(resp) {
+       assert.equal(false,resp.success);
+       assert(resp.message.trim().length > 0);
+});
+
+monetdb.connect({dbname:dbname, user:'nonexist', port:dbport}, function(resp) {
+       assert.equal(false,resp.success);
+       assert(resp.message.trim().length > 0);
+});
+
+/* now actually connect */
+var conn = monetdb.connect({dbname:dbname, port:dbport}, function(resp) {
+       assert.equal(true,resp.success);
+});
+
+
+/* some querying */
+conn.query('start transaction');
+
+conn.query('create table foo(a int, b float, c clob)');
+conn.query("insert into foo values 
(42,4.2,'42'),(43,4.3,'43'),(44,4.4,'44'),(45,4.5,'45')");
+
+conn.query('select * from foo', function(res) {
+       assert.equal(true, res.success);
+
+       assert.equal('table', res.type);
+       assert.equal(4, res.rows);
+       assert.equal(3, res.cols);
+
+       assert.equal(3, res.structure.length);
+
+       assert.equal('a', res.structure[0].column);
+       assert.equal('int', res.structure[0].type);
+
+       assert.equal(4, res.data.length);
+
+       assert.equal(42, res.data[0][res.structure[0].index]);
+       assert.equal(4.3, res.data[1][1]);
+       assert.equal('44', res.data[2][2]);
+});
+
+conn.query('delete from foo; drop table foo; rollback');
+
+/* query that will force multi-block operations */
+function rep(str,n) {
+       ret = '';
+       for (var i = 0; i< n; i++) {
+               ret += str;
+       }
+       return ret;
+}
+var longstr = rep('ABCDEFGHIJKLMNOP',10000);
+
+conn.query("SELECT '"+longstr+"'", function(res) {
+       assert.equal(true, res.success);
+       assert.equal(longstr,res.data[0][0]);
+
+});
+
+/* failing query */
+conn.query('MEHR BIER', function(res) {
+       assert.equal(false,res.success);
+       assert(res.message.trim().length > 0);
+});
+
+conn.close();
\ No newline at end of file
diff --git a/clients/nodejs/monetdb/mapiclient.js 
b/clients/nodejs/monetdb/mapiclient.js
--- a/clients/nodejs/monetdb/mapiclient.js
+++ b/clients/nodejs/monetdb/mapiclient.js
@@ -92,13 +92,14 @@ MonetDBConnection.prototype.handleMessag
        /* error message */
        if (message.charAt(0) == '!') {
                response.success = false;
-               response.error = message.substring(1);
+               response.message = message.substring(1,message.length-1);
        }
 
        /* query result */
        if (message.charAt(0) == '&') {
                response = _parseresponse(message);
                response.success = true;
+               response.message = 'ok';
        }
 
        if (this.read_callback != undefined) {
@@ -163,14 +164,13 @@ MonetDBConnection.prototype.sendMessage 
        while (final == 0) {
                var bs = Math.min(buf.length, this.mapi_blocksize - 2)
                var sendbuf = buf.slice(0, bs);
-               buf = buf.slice(bs + 1);
+               buf = buf.slice(bs);
                if (buf.length == 0) {
                        final = 1;
                }
 
                if (this.options.debug)
                        console.log('writing ' + bs + ' bytes, final=' + final);
-
                var hdrbuf = new Buffer(2);
                hdrbuf.writeInt16LE((bs << 1) | final, 0);
                this.socket.write(Buffer.concat([hdrbuf, sendbuf]));
@@ -189,7 +189,7 @@ function _parsetuples(names, types, line
        var resultarr = [];
        for (li in lines) {
                var line = lines[li];
-               var resultline = {};
+               var resultline = [];
                var tokenStart = 2;
                var endQuote = 0;
                var valPtr = '';
@@ -215,27 +215,27 @@ function _parsetuples(names, types, line
                                        var tokenLen = curPos - tokenStart - 
endQuote;
                                        valPtr = line.substring(tokenStart, 
tokenStart + tokenLen);
                                        if (tokenLen < 1 || valPtr == 'NULL') {
-                                               resultline[names[cCol]] = 
undefined;
+                                               resultline.push(undefined);
 
                                        } else {
                                                switch(types[cCol]) {
                                                        case 'boolean':
-                                                               
resultline[names[cCol]] = valPtr == 'true';
+                                                               
resultline.push(valPtr == 'true');
                                                                break;
                                                        case 'tinyint':
                                                        case 'smallint':
                                                        case 'int':
                                                        case 'wrd':
                                                        case 'bigint':
-                                                               
resultline[names[cCol]] = parseInt(valPtr);
+                                                               
resultline.push(parseInt(valPtr));
                                                                break
                                                        case 'real':
                                                        case 'double':
                                                        case 'decimal':
-                                                               
resultline[names[cCol]] = parseFloat(valPtr);
+                                                               
resultline.push(parseFloat(valPtr));
                                                                break
                                                        default:
-                                                               
resultline[names[cCol]] = valPtr;
+                                                               
resultline.push(valPtr);
                                                                break;
                                                }
                                        }
@@ -290,12 +290,14 @@ function _parseresponse(msg) {
 
                resp.structure = [];
                for (var i = 0; i < table_names.length; i++) {
-                       resp.structure.push({
+                       var colinfo = {
                                table : table_names[i],
                                column : column_names[i],
                                type : column_types[i],
-                               typelen : parseInt(type_lengths[i])
-                       });
+                               typelen : parseInt(type_lengths[i]),
+                               index : i
+                       };
+                       resp.structure.push(colinfo);
                }
                resp.data = _parsetuples(column_names, column_types, 
lines.slice(5, lines.length-1));
        }
@@ -346,7 +348,7 @@ function getConnectArgs(options) {
        __check_arg(options, 'user'    , 'string' , 'monetdb');
        __check_arg(options, 'password', 'string' , 'monetdb');
        __check_arg(options, 'host'    , 'string' , 'localhost');
-       __check_arg(options, 'port'    , 'int'    , 50000);
+       __check_arg(options, 'port'    , 'number'    , 50000);
        __check_arg(options, 'language', 'string' , 'sql');
        __check_arg(options, 'debug'   , 'boolean', false);
   return options;
diff --git a/clients/nodejs/monetdb/package.json 
b/clients/nodejs/monetdb/package.json
--- a/clients/nodejs/monetdb/package.json
+++ b/clients/nodejs/monetdb/package.json
@@ -1,6 +1,6 @@
 {
   "name": "monetdb",
-  "version": "0.0.3",
+  "version": "0.0.5",
   "description": "Connect MonetDB and node.js",
   "main": "mapiclient.js",
   "author": "Hannes Mühleisen <[email protected]>",
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to