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

Reply via email to