pg-types
Advanced tools
Comparing version 3.0.1 to 4.0.0
11
index.js
@@ -1,4 +0,4 @@ | ||
var textParsers = require('./lib/textParsers') | ||
var binaryParsers = require('./lib/binaryParsers') | ||
var builtinTypes = require('./lib/builtins') | ||
const textParsers = require('./lib/textParsers') | ||
const binaryParsers = require('./lib/binaryParsers') | ||
const builtinTypes = require('./lib/builtins') | ||
@@ -9,3 +9,3 @@ exports.getTypeParser = getTypeParser | ||
var typeParsers = { | ||
const typeParsers = { | ||
text: {}, | ||
@@ -37,2 +37,5 @@ binary: {} | ||
} | ||
if (!Number.isInteger(oid)) { | ||
throw new TypeError('oid must be an integer: ' + oid) | ||
} | ||
typeParsers[format][oid] = parseFn | ||
@@ -39,0 +42,0 @@ }; |
@@ -1,53 +0,37 @@ | ||
var parseInt64 = require('pg-int8') | ||
var parseNumeric = require('pg-numeric') | ||
const parseInt64 = require('pg-int8') | ||
const parseNumeric = require('pg-numeric') | ||
var parseInt16 = function (value) { | ||
const parseInt16 = function (value) { | ||
return value.readInt16BE(0) | ||
} | ||
var parseInt32 = function (value) { | ||
const parseInt32 = function (value) { | ||
return value.readInt32BE(0) | ||
} | ||
var parseFloat32 = function (value) { | ||
const parseFloat32 = function (value) { | ||
return value.readFloatBE(0) | ||
} | ||
var parseFloat64 = function (value) { | ||
const parseFloat64 = function (value) { | ||
return value.readDoubleBE(0) | ||
} | ||
var parseDate = function (isUTC, value) { | ||
var rawValue = 0x100000000 * value.readInt32BE(0) + value.readUInt32BE(4) | ||
const parseTimestampUTC = function (value) { | ||
const rawValue = 0x100000000 * value.readInt32BE(0) + value.readUInt32BE(4) | ||
// discard usecs and shift from 2000 to 1970 | ||
var result = new Date((rawValue / 1000) + 946684800000) | ||
const result = new Date(Math.round(rawValue / 1000) + 946684800000) | ||
if (!isUTC) { | ||
result.setTime(result.getTime() + result.getTimezoneOffset() * 60000) | ||
} | ||
// add microseconds to the date | ||
result.usec = rawValue % 1000 | ||
result.getMicroSeconds = function () { | ||
return this.usec | ||
} | ||
result.setMicroSeconds = function (value) { | ||
this.usec = value | ||
} | ||
result.getUTCMicroSeconds = function () { | ||
return this.usec | ||
} | ||
return result | ||
} | ||
var parseArray = function (value) { | ||
var dim = value.readInt32BE(0) | ||
const parseArray = function (value) { | ||
const dim = value.readInt32BE(0) | ||
var elementType = value.readUInt32BE(8) | ||
const elementType = value.readUInt32BE(8) | ||
var offset = 12 | ||
var dims = [] | ||
for (var i = 0; i < dim; i++) { | ||
let offset = 12 | ||
const dims = [] | ||
for (let i = 0; i < dim; i++) { | ||
// parse dimension | ||
@@ -61,5 +45,5 @@ dims[i] = value.readInt32BE(offset) | ||
var parseElement = function (elementType) { | ||
const parseElement = function (elementType) { | ||
// parse content length | ||
var length = value.readInt32BE(offset) | ||
const length = value.readInt32BE(offset) | ||
offset += 4 | ||
@@ -72,3 +56,3 @@ | ||
var result | ||
let result | ||
if (elementType === 0x17) { | ||
@@ -92,8 +76,8 @@ // int | ||
var parse = function (dimension, elementType) { | ||
var array = [] | ||
var i | ||
const parse = function (dimension, elementType) { | ||
const array = [] | ||
let i | ||
if (dimension.length > 1) { | ||
var count = dimension.shift() | ||
const count = dimension.shift() | ||
for (i = 0; i < count; i++) { | ||
@@ -115,12 +99,11 @@ array[i] = parse(dimension, elementType) | ||
var parseText = function (value) { | ||
const parseText = function (value) { | ||
return value.toString('utf8') | ||
} | ||
var parseBool = function (value) { | ||
if (value === null) return null | ||
const parseBool = function (value) { | ||
return value[0] !== 0 | ||
} | ||
var init = function (register) { | ||
const init = function (register) { | ||
register(20, parseInt64) | ||
@@ -134,4 +117,4 @@ register(21, parseInt16) | ||
register(16, parseBool) | ||
register(1114, parseDate.bind(null, false)) | ||
register(1184, parseDate.bind(null, true)) | ||
register(1114, parseTimestampUTC) | ||
register(1184, parseTimestampUTC) | ||
register(1000, parseArray) | ||
@@ -138,0 +121,0 @@ register(1007, parseArray) |
@@ -1,8 +0,8 @@ | ||
var array = require('postgres-array') | ||
var parseDate = require('postgres-date') | ||
var parseInterval = require('postgres-interval') | ||
var parseByteA = require('postgres-bytea') | ||
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) { | ||
if (value === null) return value | ||
return value === 'TRUE' || | ||
@@ -18,3 +18,2 @@ value === 't' || | ||
function parseBoolArray (value) { | ||
if (!value) return null | ||
return array.parse(value, parseBool) | ||
@@ -28,3 +27,2 @@ } | ||
function parseIntegerArray (value) { | ||
if (!value) return null | ||
return array.parse(value, parseBaseTenInt) | ||
@@ -34,3 +32,2 @@ } | ||
function parseBigIntegerArray (value) { | ||
if (!value) return null | ||
return array.parse(value, function (entry) { | ||
@@ -41,34 +38,40 @@ return parseBigInteger(entry).trim() | ||
var parsePointArray = function (value) { | ||
if (!value) { return null } | ||
const parsePointArray = function (value) { | ||
return array.parse(value, parsePoint) | ||
} | ||
var parseFloatArray = function (value) { | ||
if (!value) { return null } | ||
const parseFloatArray = function (value) { | ||
return array.parse(value, parseFloat) | ||
} | ||
var parseStringArray = function (value) { | ||
if (!value) { return null } | ||
const parseStringArray = function (value) { | ||
return array.parse(value, undefined) | ||
} | ||
var parseDateArray = function (value) { | ||
if (!value) { return null } | ||
return array.parse(value, parseDate) | ||
const parseTimestamp = function (value) { | ||
const utc = value.endsWith(' BC') | ||
? value.slice(0, -3) + 'Z BC' | ||
: value + 'Z' | ||
return parseTimestampTz(utc) | ||
} | ||
var parseIntervalArray = function (value) { | ||
if (!value) { return null } | ||
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) | ||
} | ||
var parseByteAArray = function (value) { | ||
if (!value) { return null } | ||
const parseByteAArray = function (value) { | ||
return array.parse(value, parseByteA) | ||
} | ||
var parseBigInteger = function (value) { | ||
var valStr = String(value) | ||
const parseBigInteger = function (value) { | ||
const valStr = String(value) | ||
if (/^\d+$/.test(valStr)) { return valStr } | ||
@@ -78,8 +81,7 @@ return value | ||
var parseJsonArray = function (value) { | ||
if (!value) { return null } | ||
const parseJsonArray = function (value) { | ||
return array.parse(value, JSON.parse) | ||
} | ||
var parsePoint = function (value) { | ||
const parsePoint = function (value) { | ||
if (value[0] !== '(') { return null } | ||
@@ -95,9 +97,9 @@ | ||
var parseCircle = function (value) { | ||
const 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++) { | ||
let point = '(' | ||
let radius = '' | ||
let pointParsed = false | ||
for (let i = 2; i < value.length - 1; i++) { | ||
if (!pointParsed) { | ||
@@ -120,3 +122,3 @@ point += value[i] | ||
} | ||
var result = parsePoint(point) | ||
const result = parsePoint(point) | ||
result.radius = parseFloat(radius) | ||
@@ -127,3 +129,23 @@ | ||
var init = function (register) { | ||
function parseInt4Range (raw) { | ||
return range.parse(raw, parseBaseTenInt) | ||
} | ||
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 | ||
@@ -136,5 +158,4 @@ register(21, parseBaseTenInt) // int2 | ||
register(16, parseBool) | ||
register(1082, parseDate) // date | ||
register(1114, parseDate) // timestamp without timezone | ||
register(1184, parseDate) // timestamp | ||
register(1114, parseTimestamp) // timestamp without time zone | ||
register(1184, parseTimestampTz) // timestamp with time zone | ||
register(600, parsePoint) // point | ||
@@ -159,5 +180,5 @@ register(651, parseStringArray) // cidr[] | ||
register(1041, parseStringArray) // inet[] | ||
register(1115, parseDateArray) // timestamp without time zone[] | ||
register(1182, parseDateArray) // _date | ||
register(1185, parseDateArray) // timestamp with time zone[] | ||
register(1115, parseTimestampArray) // timestamp without time zone[] | ||
register(1182, parseStringArray) // date[] | ||
register(1185, parseTimestampTzArray) // timestamp with time zone[] | ||
register(1186, parseInterval) | ||
@@ -170,3 +191,9 @@ register(1187, parseIntervalArray) | ||
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[] | ||
@@ -173,0 +200,0 @@ register(791, parseStringArray) // money[] |
{ | ||
"name": "pg-types", | ||
"version": "3.0.1", | ||
"version": "4.0.0", | ||
"description": "Query result type converters for node-postgres", | ||
@@ -29,9 +29,10 @@ "main": "index.js", | ||
"devDependencies": { | ||
"codecov": "^3.5.0", | ||
"nyc": "^14.1.1", | ||
"open-cli": "^5.0.0", | ||
"standard": "^14.3.1", | ||
"@types/node": "^14.14.33", | ||
"codecov": "^3.8.1", | ||
"nyc": "^15.1.0", | ||
"open-cli": "^6.0.1", | ||
"standard": "^16.0.3", | ||
"tap-spec": "^5.0.0", | ||
"tape": "^4.0.0", | ||
"tsd": "^0.9.0" | ||
"tape": "^5.2.2", | ||
"tsd": "^0.14.0" | ||
}, | ||
@@ -41,6 +42,7 @@ "dependencies": { | ||
"pg-numeric": "1.0.2", | ||
"postgres-array": "~2.0.0", | ||
"postgres-array": "~3.0.1", | ||
"postgres-bytea": "~3.0.0", | ||
"postgres-date": "~1.0.4", | ||
"postgres-interval": "^1.1.0" | ||
"postgres-date": "~2.0.1", | ||
"postgres-interval": "^3.0.0", | ||
"postgres-range": "^1.1.1" | ||
}, | ||
@@ -53,4 +55,4 @@ "files": [ | ||
"engines": { | ||
"node": ">=8" | ||
"node": ">=10" | ||
} | ||
} |
@@ -15,3 +15,3 @@ # pg-types | ||
Let's do something I commonly like to do on projects: return 64-bit integers `(int8)` as JavaScript integers. Because JavaScript doesn't have support for 64-bit integers node-postgres cannot confidently parse `int8` data type results as numbers because if you have a _huge_ number it will overflow and the result you'd get back from node-postgres would not be the result in the database. That would be a __very bad thing__ so node-postgres just returns `int8` results as strings and leaves the parsing up to you. Let's say that you know you don't and wont ever have numbers greater than `int4` in your database, but you're tired of recieving results from the `COUNT(*)` function as strings (because that function returns `int8`). You would do this: | ||
Let's do something I commonly like to do on projects: return 64-bit integers `(int8)` as JavaScript integers. Because JavaScript doesn't have support for 64-bit integers node-postgres cannot confidently parse `int8` data type results as numbers because if you have a _huge_ number it will overflow and the result you'd get back from node-postgres would not be the result in the database. That would be a __very bad thing__ so node-postgres just returns `int8` results as strings and leaves the parsing up to you. Let's say that you know you don't and wont ever have numbers greater than `int4` in your database, but you're tired of receiving results from the `COUNT(*)` function as strings (because that function returns `int8`). You would do this: | ||
@@ -21,3 +21,3 @@ ```js | ||
types.setTypeParser(20, function(val) { | ||
return parseInt(val) | ||
return parseInt(val, 10) | ||
}) | ||
@@ -24,0 +24,0 @@ ``` |
17649
450
7
8
+ Addedpostgres-range@^1.1.1
+ Addedpostgres-array@3.0.2(transitive)
+ Addedpostgres-date@2.0.1(transitive)
+ Addedpostgres-interval@3.0.0(transitive)
+ Addedpostgres-range@1.1.4(transitive)
- Removedpostgres-array@2.0.0(transitive)
- Removedpostgres-date@1.0.7(transitive)
- Removedpostgres-interval@1.2.0(transitive)
- Removedxtend@4.0.2(transitive)
Updatedpostgres-array@~3.0.1
Updatedpostgres-date@~2.0.1
Updatedpostgres-interval@^3.0.0