From 074779b5ff8816530468585b9c6b0dfe9eea1e04 Mon Sep 17 00:00:00 2001 From: brianc Date: Sun, 31 Oct 2010 17:12:13 -0500 Subject: [PATCH] initial work on dates --- lib/client.js | 93 ++++++++++--------- .../integration/client/type-coercion-tests.js | 1 - test/unit/client/typed-query-results.js | 35 ++++++- 3 files changed, 81 insertions(+), 48 deletions(-) diff --git a/lib/client.js b/lib/client.js index 30077f41..09c60e79 100644 --- a/lib/client.js +++ b/lib/client.js @@ -221,32 +221,51 @@ p.onDataRow = function(msg) { this.emit('row', msg); }; +var dateParser = function(isoDate) { + //TODO find some regexp help + //this method works but it's ooglay + var split = isoDate.split(' '); + var date = split[0]; + var time = split[1]; + var splitDate = date.split('-'); + var year = (splitDate[0]); + var month = parseInt(splitDate[1])-1; + var day = (splitDate[2]); + var splitTime = time.split(':'); + var hour = parseInt(splitTime[0]); + var min = splitTime[1]; + var end = splitTime[2]; + var seconds = /(\d{2})/.exec(end); + seconds = (seconds ? seconds[1] : 0); + var mili = /\.(\d{1,})/.exec(end); + mili = mili ? mili[1].slice(0,3) : 0; + var tZone = /([Z|+\-])(\d{2})?(\d{2})?/.exec(end); + //minutes to adjust for timezone + var tzAdjust = 0; + if(tZone) { + var type = tZone[1]; + switch(type) { + case 'Z': break; + case '-': + tzAdjust = -(((parseInt(tZone[2])*60)+(parseInt(tZone[3]||0)))); + break; + case '+': + tzAdjust = (((parseInt(tZone[2])*60)+(parseInt(tZone[3]||0)))); + break; + default: + throw new Error("Unidentifed tZone part " + type); + } + } + console.log("tzAdjust " + tzAdjust); + var utcOffset = Date.UTC(year, month, day, hour, min, seconds, mili); + var date = new Date(utcOffset+(tzAdjust*1000*60)); -// var intParser = { -// fromDbValue: parseInt -// }; - -// var floatParser = { -// fromDbValue: parseFloat -// }; - -// var timeParser = { -// fromDbValue: function(isoTime) { -// var when = new Date(); -// var split = isoTime.split(':'); -// when.setHours(split[0]); -// when.setMinutes(split[1]); -// when.setSeconds(split[2].split('-') [0]); -// return when; -// } -// }; - -// var dateParser = { -// fromDbValue: function(isoDate) { -// return Date.parse(isoDate); -// } -// }; + console.log(isoDate); + console.log(date); + console.log(""); + return isoDate; +}; Client.dataTypeParser = { 20: parseInt, @@ -256,32 +275,14 @@ Client.dataTypeParser = { 1700: parseFloat, 700: parseFloat, 701: parseFloat, - 16: function(dbVal) { + 16: function(dbVal) { //boolean return dbVal === 't'; - } + }, // 1083: timeParser, // 1266: timeParser, - // 1114: dateParser, - // 1184: dateParser + 1114: dateParser, + 1184: dateParser }; -// p.processRowDescription = function(description) { -// this.fields = description.fields; -// }; - -// p.processDataRow = function(dataRow) { -// var row = dataRow.fields; -// var fields = this.fields || []; -// var field, dataType; -// for(var i = 0, len = row.length; i < len; i++) { -// field = fields[i] || 0 -// var dataType = Client.dataTypes[field.dataTypeID]; -// if(dataType) { -// row[i] = dataType.fromDbValue(row[i]); -// } -// } -// this.emit('row',row); -// }; - //end parsing methods module.exports = Client; diff --git a/test/integration/client/type-coercion-tests.js b/test/integration/client/type-coercion-tests.js index 4c3ef05c..b249629c 100644 --- a/test/integration/client/type-coercion-tests.js +++ b/test/integration/client/type-coercion-tests.js @@ -36,7 +36,6 @@ var testForTypeCoercion = function(type){ }); }; -//TODO test for nulls var types = [{ name: 'integer', values: [1, -1, null] diff --git a/test/unit/client/typed-query-results.js b/test/unit/client/typed-query-results.js index de97dbc6..4606a643 100644 --- a/test/unit/client/typed-query-results.js +++ b/test/unit/client/typed-query-results.js @@ -63,6 +63,34 @@ test('typed results', function() { dataTypeID: 16, actual: null, expected: null + },{ + name: 'timestamptz with minutes in timezone', + dataTypeID: 1184, + actual: '2010-10-31 14:54:13.74-0530', + expected: function(val) { + return false; + } + },{ + name: 'timestampz with huge miliseconds in UTC', + dataTypeID: 1184, + actual: '2010-10-30 14:11:12.730838Z', + expected: function(val) { + return false; + } + },{ + name: 'timestampz with no miliseconds', + dataTypeID: 1184, + actual: '2010-10-30 13:10:01+05', + expected: function(val) { + return false; + } + },{ + name: 'timestamp', + dataTypeID: 1114, + actual: '2010-10-31 00:00:00', + expected: function(val) { + return false; + } }]; @@ -74,7 +102,12 @@ test('typed results', function() { assert.emits(query, 'row', function(row) { for(var i = 0; i < tests.length; i++) { test('parses ' + tests[i].name, function() { - assert.strictEqual(row.fields[i], tests[i].expected); + var expected = tests[i].expected; + if(typeof expected === 'function') { + return expected(row.fields[i]); + } + assert.strictEqual(row.fields[i], expected); + }); } });