UNPKG

pg-types

Version:

Query result type converters for node-postgres

193 lines (161 loc) 5.08 kB
const array = require('postgres-array') const parseTimestampTz = require('postgres-date') const parseInterval = require('postgres-interval') const parseByteA = require('postgres-bytea') const range = require('postgres-range') function parseBool (value) { return value === 'TRUE' || value === 't' || value === 'true' || value === 'y' || value === 'yes' || value === 'on' || value === '1' } function parseBoolArray (value) { return array.parse(value, parseBool) } function parseIntegerArray (value) { return array.parse(value, Number) } function parseBigIntegerArray (value) { return array.parse(value, function (entry) { return parseBigInteger(entry).trim() }) } const parsePointArray = function (value) { return array.parse(value, parsePoint) } const parseFloatArray = function (value) { return array.parse(value, parseFloat) } const parseStringArray = function (value) { return array.parse(value, undefined) } const parseTimestamp = function (value) { const utc = value.endsWith(' BC') ? value.slice(0, -3) + 'Z BC' : value + 'Z' return parseTimestampTz(utc) } const parseTimestampArray = function (value) { return array.parse(value, parseTimestamp) } const parseTimestampTzArray = function (value) { return array.parse(value, parseTimestampTz) } const parseIntervalArray = function (value) { return array.parse(value, parseInterval) } const parseByteAArray = function (value) { return array.parse(value, parseByteA) } const parseBigInteger = function (value) { const valStr = String(value) if (/^\d+$/.test(valStr)) { return valStr } return value } const parseJsonArray = function (value) { return array.parse(value, JSON.parse) } const parsePoint = function (value) { if (value[0] !== '(') { return null } value = value.substring(1, value.length - 1).split(',') return { x: parseFloat(value[0]), y: parseFloat(value[1]) } } const parseCircle = function (value) { if (value[0] !== '<' && value[1] !== '(') { return null } let point = '(' let radius = '' let pointParsed = false for (let i = 2; i < value.length - 1; i++) { if (!pointParsed) { point += value[i] } if (value[i] === ')') { pointParsed = true continue } else if (!pointParsed) { continue } if (value[i] === ',') { continue } radius += value[i] } const result = parsePoint(point) result.radius = parseFloat(radius) return result } function parseInt4Range (raw) { return range.parse(raw, Number) } function parseNumRange (raw) { return range.parse(raw, parseFloat) } function parseInt8Range (raw) { return range.parse(raw, parseBigInteger) } function parseTimestampRange (raw) { return range.parse(raw, parseTimestamp) } function parseTimestampTzRange (raw) { return range.parse(raw, parseTimestampTz) } const init = function (register) { register(20, parseBigInteger) // int8 register(21, Number) // int2 register(23, Number) // int4 register(26, Number) // oid register(700, parseFloat) // float4/real register(701, parseFloat) // float8/double register(16, parseBool) register(1114, parseTimestamp) // timestamp without time zone register(1184, parseTimestampTz) // timestamp with time zone register(600, parsePoint) // point register(651, parseStringArray) // cidr[] register(718, parseCircle) // circle register(1000, parseBoolArray) register(1001, parseByteAArray) register(1005, parseIntegerArray) // _int2 register(1007, parseIntegerArray) // _int4 register(1028, parseIntegerArray) // oid[] register(1016, parseBigIntegerArray) // _int8 register(1017, parsePointArray) // point[] register(1021, parseFloatArray) // _float4 register(1022, parseFloatArray) // _float8 register(1231, parseStringArray) // _numeric register(1014, parseStringArray) // char register(1015, parseStringArray) // varchar register(1008, parseStringArray) register(1009, parseStringArray) register(1040, parseStringArray) // macaddr[] register(1041, parseStringArray) // inet[] register(1115, parseTimestampArray) // timestamp without time zone[] register(1182, parseStringArray) // date[] register(1185, parseTimestampTzArray) // timestamp with time zone[] register(1186, parseInterval) register(1187, parseIntervalArray) register(17, parseByteA) register(114, JSON.parse) // json register(3802, JSON.parse) // jsonb register(199, parseJsonArray) // json[] register(3807, parseJsonArray) // jsonb[] register(3904, parseInt4Range) // int4range register(3906, parseNumRange) // numrange register(3907, parseStringArray) // numrange[] register(3908, parseTimestampRange) // tsrange register(3910, parseTimestampTzRange) // tstzrange register(3912, range.parse) // daterange register(3926, parseInt8Range) // int8range register(2951, parseStringArray) // uuid[] register(791, parseStringArray) // money[] register(1183, parseStringArray) // time[] register(1270, parseStringArray) // timetz[] } module.exports = { init: init }