UNPKG

pg-range

Version:

node-postgres plugin to parse range columns

70 lines (57 loc) 1.57 kB
var curry = require("lodash.partial") , Range = require("./range"); var RANGE_MATCHER = /(\[|\()("((?:\\"|[^"])*)"|[^"]*),("((?:\\"|[^"])*)"|[^"]*)(\]|\))/; var oids = { INTEGER: 23, BIGINT: 20, NUMERIC: 1700, TIMESTAMP: 1114, TIMESTAMPTZ: 1184, DATE: 1082, INT4RANGE: 3904, INT8RANGE: 3926, NUMRANGE: 3906, TSRANGE: 3908, TSTZRANGE: 3910, DATERANGE: 3912, }; function parseRangeSegment(whole, quoted) { if (quoted) { return quoted.replace(/\\(.)/g, "$1"); } if (whole === "") { return null; } return whole; } function parseRange(parseBound, rangeLiteral) { var matches = rangeLiteral.match(RANGE_MATCHER); if (!matches) { // empty return Range(); } var bounds = matches[1] + matches[6]; var lower = parseRangeSegment(matches[2], matches[3]); var upper = parseRangeSegment(matches[4], matches[5]); return Range( lower ? parseBound(lower) : null, upper ? parseBound(upper) : null, bounds); } function install(pg, rangeOid, subtypeOid) { var subtypeParser; if (!rangeOid && !subtypeOid) { install(pg, oids.INT4RANGE, oids.INTEGER); install(pg, oids.INT8RANGE, oids.BIGINT); install(pg, oids.NUMRANGE, oids.NUMERIC); install(pg, oids.TSRANGE, oids.TIMESTAMP); install(pg, oids.TSTZRANGE, oids.TIMESTAMPTZ); install(pg, oids.DATERANGE, oids.DATE); } subtypeParser = pg.types.getTypeParser(subtypeOid, "text"); pg.types.setTypeParser(rangeOid, curry(parseRange, subtypeParser)); } module.exports = { install: install, parseRange: parseRange };