Changeset: 4df8eb0e3e1a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4df8eb0e3e1a Modified Files: clients/nodejs/Tests/nodetest.js clients/nodejs/monetdb/mapiclient.js Branch: default Log Message:
Node.JS Connector: String quoting fun
diffs (112 lines):
diff --git a/clients/nodejs/Tests/nodetest.js b/clients/nodejs/Tests/nodetest.js
--- a/clients/nodejs/Tests/nodetest.js
+++ b/clients/nodejs/Tests/nodetest.js
@@ -90,6 +90,16 @@ conn.query('SELECT id from tables where
});
+/* some quoting fun, jesus */
+conn.query("SELECT '\\\\asdf','\"', '\\\"', '\\\\\"', '\\''", function(err,
res) {
+ assert.equal(null, err);
+ assert.equal('\\asdf', res.data[0][0]);
+ assert.equal('"', res.data[0][1]);
+ assert.equal('\"', res.data[0][2]);
+ assert.equal('\\"', res.data[0][3]);
+ assert.equal("'", res.data[0][4]);
+});
+
/* prepared statements can also be re-used */
conn.prepare('SELECT id from tables where name=? and type=? and readonly=?',
function(err, res){
assert.equal(null, err);
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
@@ -328,73 +328,72 @@ function _parsetuples(names, types, line
for (li in lines) {
var line = lines[li];
var resultline = [];
- var tokenStart = 2;
- var endQuote = 0;
- var valPtr = '';
var cCol = 0;
-
+ var curtok = '';
/* mostly adapted from clients/R/MonetDB.R/src/mapisplit.c */
- for (var curPos = tokenStart; curPos < line.length - 1;
curPos++) {
+ for (var curPos = 2; curPos < line.length - 1; curPos++) {
var chr = line.charAt(curPos);
switch (state) {
case 'INCRAP':
if (chr != '\t' && chr != ',') {
- tokenStart = curPos;
if (chr == '"') {
state = 'INQUOTES';
- tokenStart++;
} else {
state = 'INTOKEN';
+ curtok += chr;
}
}
break;
case 'INTOKEN':
if (chr == ',' || curPos == line.length - 2) {
- var tokenLen = curPos - tokenStart -
endQuote;
- valPtr = line.substring(tokenStart,
tokenStart + tokenLen);
- if (tokenLen < 1 || valPtr == 'NULL') {
+ if (curtok == 'NULL') {
resultline.push(undefined);
} else {
switch(types[cCol]) {
case 'boolean':
-
resultline.push(valPtr == 'true');
+
resultline.push(curtok == 'true');
break;
case 'tinyint':
case 'smallint':
case 'int':
case 'wrd':
case 'bigint':
-
resultline.push(parseInt(valPtr));
+
resultline.push(parseInt(curtok));
break
case 'real':
case 'double':
case 'decimal':
-
resultline.push(parseFloat(valPtr));
+
resultline.push(parseFloat(curtok));
break
default:
-
resultline.push(valPtr);
+ // we need to
unescape double quotes
+ //valPtr =
valPtr.replace(/[^\\]\\"/g, '"');
+
resultline.push(curtok);
break;
}
}
cCol++;
- endQuote = 0;
state = 'INCRAP';
+ curtok = '';
+ } else {
+ curtok += chr;
}
break;
case 'ESCAPED':
state = 'INQUOTES';
+ curtok += chr;
break;
case 'INQUOTES':
if (chr == '"') {
state = 'INTOKEN';
- endQuote++;
break;
}
if (chr == '\\') {
state = 'ESCAPED';
break;
}
+ curtok += chr;
break;
}
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
