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