mirror of
https://github.com/brianc/node-postgres.git
synced 2026-01-18 15:55:05 +00:00
Adding a parser for postgres time intervals
This commit is contained in:
parent
eba68017d1
commit
54d065f4a1
31
lib/types.js
31
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,
|
||||
}
|
||||
|
||||
@ -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})
|
||||
}
|
||||
}];
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user