From 54d065f4a1f05b799bd7f36ed926e0ab504ea395 Mon Sep 17 00:00:00 2001 From: Edward Faulkner Date: Fri, 29 Apr 2011 10:39:00 -0400 Subject: [PATCH] Adding a parser for postgres time intervals --- lib/types.js | 31 ++++++++++++++++++- test/unit/client/typed-query-results-tests.js | 21 +++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/types.js b/lib/types.js index 89bc5a01..a43608b6 100644 --- a/lib/types.js +++ b/lib/types.js @@ -18,6 +18,7 @@ var getStringTypeParser = function(oid) { return typeParsers[oid] || noParse; }; + //parses PostgreSQL server formatted date strings into javascript date objects var parseDate = function(isoDate) { //TODO this could do w/ a refactor @@ -86,6 +87,33 @@ var parseStringArray = function(val) { }); }; + +var NUM = '([+-]?\\d+)'; +var YEAR = NUM + '\\s+years?'; +var MON = NUM + '\\s+mons?'; +var DAY = NUM + '\\s+days?'; +var TIME = '([+-])?(\\d\\d):(\\d\\d):(\\d\\d)'; +var INTERVAL = [YEAR,MON,DAY,TIME].map(function(p){ return "("+p+")?" }).join('\\s*'); + + +var parseInterval = function(val) { + if (!val) return {}; + var m = new RegExp(INTERVAL).exec(val); + var i = {}; + if (m[2]) i.years = parseInt(m[2]); + if (m[4]) i.months = parseInt(m[4]); + if (m[6]) i.days = parseInt(m[6]); + if (m[9]) i.hours = parseInt(m[9]); + if (m[10]) i.minutes = parseInt(m[10]); + if (m[11]) i.seconds = parseInt(m[11]); + if (m[8] == '-'){ + if (i.hours) i.hours *= -1; + if (i.minutes) i.minutes *= -1; + if (i.seconds) i.seconds *= -1; + } + return i; +}; + //default string type parser registrations registerStringTypeParser(20, parseInt); registerStringTypeParser(21, parseInt); @@ -99,8 +127,9 @@ registerStringTypeParser(1114, parseDate); registerStringTypeParser(1184, parseDate); registerStringTypeParser(1007, parseIntegerArray); registerStringTypeParser(1009, parseStringArray); +registerStringTypeParser(1186, parseInterval); module.exports = { registerStringTypeParser: registerStringTypeParser, - getStringTypeParser: getStringTypeParser + getStringTypeParser: getStringTypeParser, } diff --git a/test/unit/client/typed-query-results-tests.js b/test/unit/client/typed-query-results-tests.js index 77b3beda..5b5632d9 100644 --- a/test/unit/client/typed-query-results-tests.js +++ b/test/unit/client/typed-query-results-tests.js @@ -98,6 +98,27 @@ test('typed results', function() { expected: function(val) { assert.UTCDate(val, 2010, 9, 31, 0, 0, 0, 0); } + },{ + name: 'interval time', + dataTypeID: 1186, + actual: '01:02:03', + expected: function(val) { + assert.deepEqual(val, {'hours':1, 'minutes':2, 'seconds':3}) + } + },{ + name: 'interval long', + dataTypeID: 1186, + actual: '1 year -32 days', + expected: function(val) { + assert.deepEqual(val, {'years':1, 'days':-32}) + } + },{ + name: 'interval combined negative', + dataTypeID: 1186, + actual: '1 day -00:00:03', + expected: function(val) { + assert.deepEqual(val, {'days':1, 'hours': 0, 'minutes': 0, 'seconds':-3}) + } }];