Skip to content

Commit 54d065f

Browse files
committed
Adding a parser for postgres time intervals
1 parent eba6801 commit 54d065f

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

lib/types.js

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var getStringTypeParser = function(oid) {
1818
return typeParsers[oid] || noParse;
1919
};
2020

21+
2122
//parses PostgreSQL server formatted date strings into javascript date objects
2223
var parseDate = function(isoDate) {
2324
//TODO this could do w/ a refactor
@@ -86,6 +87,33 @@ var parseStringArray = function(val) {
8687
});
8788
};
8889

90+
91+
var NUM = '([+-]?\\d+)';
92+
var YEAR = NUM + '\\s+years?';
93+
var MON = NUM + '\\s+mons?';
94+
var DAY = NUM + '\\s+days?';
95+
var TIME = '([+-])?(\\d\\d):(\\d\\d):(\\d\\d)';
96+
var INTERVAL = [YEAR,MON,DAY,TIME].map(function(p){ return "("+p+")?" }).join('\\s*');
97+
98+
99+
var parseInterval = function(val) {
100+
if (!val) return {};
101+
var m = new RegExp(INTERVAL).exec(val);
102+
var i = {};
103+
if (m[2]) i.years = parseInt(m[2]);
104+
if (m[4]) i.months = parseInt(m[4]);
105+
if (m[6]) i.days = parseInt(m[6]);
106+
if (m[9]) i.hours = parseInt(m[9]);
107+
if (m[10]) i.minutes = parseInt(m[10]);
108+
if (m[11]) i.seconds = parseInt(m[11]);
109+
if (m[8] == '-'){
110+
if (i.hours) i.hours *= -1;
111+
if (i.minutes) i.minutes *= -1;
112+
if (i.seconds) i.seconds *= -1;
113+
}
114+
return i;
115+
};
116+
89117
//default string type parser registrations
90118
registerStringTypeParser(20, parseInt);
91119
registerStringTypeParser(21, parseInt);
@@ -99,8 +127,9 @@ registerStringTypeParser(1114, parseDate);
99127
registerStringTypeParser(1184, parseDate);
100128
registerStringTypeParser(1007, parseIntegerArray);
101129
registerStringTypeParser(1009, parseStringArray);
130+
registerStringTypeParser(1186, parseInterval);
102131

103132
module.exports = {
104133
registerStringTypeParser: registerStringTypeParser,
105-
getStringTypeParser: getStringTypeParser
134+
getStringTypeParser: getStringTypeParser,
106135
}

test/unit/client/typed-query-results-tests.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,27 @@ test('typed results', function() {
9898
expected: function(val) {
9999
assert.UTCDate(val, 2010, 9, 31, 0, 0, 0, 0);
100100
}
101+
},{
102+
name: 'interval time',
103+
dataTypeID: 1186,
104+
actual: '01:02:03',
105+
expected: function(val) {
106+
assert.deepEqual(val, {'hours':1, 'minutes':2, 'seconds':3})
107+
}
108+
},{
109+
name: 'interval long',
110+
dataTypeID: 1186,
111+
actual: '1 year -32 days',
112+
expected: function(val) {
113+
assert.deepEqual(val, {'years':1, 'days':-32})
114+
}
115+
},{
116+
name: 'interval combined negative',
117+
dataTypeID: 1186,
118+
actual: '1 day -00:00:03',
119+
expected: function(val) {
120+
assert.deepEqual(val, {'days':1, 'hours': 0, 'minutes': 0, 'seconds':-3})
121+
}
101122
}];
102123

103124

0 commit comments

Comments
 (0)