var array = require('postgres-array') var arrayParser = require('./arrayParser'); var parseDate = require('postgres-date'); var parseInterval = require('postgres-interval'); var parseByteA = require('postgres-bytea'); function allowNull (fn) { return function nullAllowed (value) { if (value === null) return value return fn(value) } } function parseBool (value) { if (value === null) return value return value === 'TRUE' || value === 't' || value === 'true' || value === 'y' || value === 'yes' || value === 'on' || value === '1'; } function parseBoolArray (value) { if (!value) return null return array.parse(value, parseBool) } function parseBaseTenInt (string) { return parseInt(string, 10) } function parseIntegerArray (value) { if (!value) return null return array.parse(value, allowNull(parseBaseTenInt)) } function parseBigIntegerArray (value) { if (!value) return null return array.parse(value, allowNull(function (entry) { return parseBigInteger(entry).trim() })) } var parsePointArray = function(value) { if(!value) { return null; } var p = arrayParser.create(value, function(entry) { if(entry !== null) { entry = parsePoint(entry); } return entry; }); return p.parse(); }; var parseFloatArray = function(value) { if(!value) { return null; } var p = arrayParser.create(value, function(entry) { if(entry !== null) { entry = parseFloat(entry); } return entry; }); return p.parse(); }; var parseStringArray = function(value) { if(!value) { return null; } var p = arrayParser.create(value); return p.parse(); }; var parseDateArray = function(value) { if (!value) { return null; } var p = arrayParser.create(value, function(entry) { if (entry !== null) { entry = parseDate(entry); } return entry; }); return p.parse(); }; var parseIntervalArray = function(value) { if (!value) { return null; } var p = arrayParser.create(value, function(entry) { if (entry !== null) { entry = parseInterval(entry); } return entry; }); return p.parse(); }; var parseByteAArray = function(value) { if (!value) { return null; } return array.parse(value, allowNull(parseByteA)); }; var parseInteger = function(value) { return parseInt(value, 10); }; var parseBigInteger = function(value) { var valStr = String(value); if (/^\d+$/.test(valStr)) { return valStr; } return value; }; var parseJsonArray = function(value) { if (!value) { return null; } return array.parse(value, allowNull(JSON.parse)); }; var 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]) }; }; var parseCircle = function(value) { if (value[0] !== '<' && value[1] !== '(') { return null; } var point = '('; var radius = ''; var pointParsed = false; for (var 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]; } var result = parsePoint(point); result.radius = parseFloat(radius); return result; }; var init = function(register) { register(20, parseBigInteger); // int8 register(21, parseInteger); // int2 register(23, parseInteger); // int4 register(26, parseInteger); // oid register(700, parseFloat); // float4/real register(701, parseFloat); // float8/double register(16, parseBool); register(1082, parseDate); // date register(1114, parseDate); // timestamp without timezone register(1184, parseDate); // timestamp 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, parseFloatArray); // _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, parseDateArray); // timestamp without time zone[] register(1182, parseDateArray); // _date register(1185, parseDateArray); // timestamp with time zone[] register(1186, parseInterval); register(1187, parseIntervalArray); register(17, parseByteA); register(114, JSON.parse.bind(JSON)); // json register(3802, JSON.parse.bind(JSON)); // jsonb register(199, parseJsonArray); // json[] register(3807, parseJsonArray); // jsonb[] register(3907, parseStringArray); // numrange[] register(2951, parseStringArray); // uuid[] register(791, parseStringArray); // money[] register(1183, parseStringArray); // time[] register(1270, parseStringArray); // timetz[] }; module.exports = { init: init };