Skip to content

Commit f827f56

Browse files
author
sevastos
committed
BigInt parsing bullet-proofing
1 parent 30d97e3 commit f827f56

File tree

5 files changed

+17
-12
lines changed

5 files changed

+17
-12
lines changed

lib/types/binaryParsers.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var ref = require('ref');
2+
13
var parseBits = function(data, bits, offset, invert, callback) {
24
offset = offset || 0;
35
invert = invert || false;
@@ -106,11 +108,7 @@ var parseInt32 = function(value) {
106108
};
107109

108110
var parseInt64 = function(value) {
109-
if (parseBits(value, 1) == 1) {
110-
return -1 * (parseBits(value, 63, 1, true) + 1);
111-
}
112-
113-
return parseBits(value, 63, 1);
111+
return String(ref.readInt64BE(value, 0));
114112
};
115113

116114
var parseFloat32 = function(value) {

lib/types/textParsers.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,14 @@ var parseInteger = function(val) {
162162
return parseInt(val, 10);
163163
};
164164

165+
var parseBigInteger = function(val) {
166+
var valStr = String(val);
167+
if (/^\d+$/.test(valStr)) { return valStr; }
168+
return val;
169+
};
170+
165171
var init = function(register) {
166-
register(20, parseInteger);
172+
register(20, parseBigInteger);
167173
register(21, parseInteger);
168174
register(23, parseInteger);
169175
register(26, parseInteger);

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"main": "./lib",
2020
"dependencies": {
2121
"generic-pool": "2.0.3",
22-
"buffer-writer": "1.0.0"
22+
"buffer-writer": "1.0.0",
23+
"ref": "0.1.3"
2324
},
2425
"devDependencies": {
2526
"jshint": "1.1.0",

test/integration/client/type-coercion-tests.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ var types = [{
4646
values: [-1, 0, 1, null]
4747
},{
4848
name: 'bigint',
49-
values: [-10000, 0, 10000, null]
49+
values: ['-9223372036854775808', '-9007199254740992', '0', '72057594037928030', '9007199254740992', '9223372036854775807', null]
5050
},{
5151
name: 'varchar(5)',
5252
values: ['yo', '', 'zomg!', null]

test/unit/client/typed-query-results-tests.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ test('typed results', function() {
3030
name: 'bigint/int8',
3131
format: 'text',
3232
dataTypeID: 20,
33-
actual: '102',
34-
expected: 102
33+
actual: '9223372036854775807',
34+
expected: '9223372036854775807'
3535
},{
3636
name: 'oid',
3737
format: 'text',
@@ -222,13 +222,13 @@ test('typed results', function() {
222222
format: 'binary',
223223
dataTypeID: 20,
224224
actual: [0, 0, 0, 0, 0, 0, 0, 102],
225-
expected: 102
225+
expected: '102'
226226
},{
227227
name: 'binary-bigint/int8-full',
228228
format: 'binary',
229229
dataTypeID: 20,
230230
actual: [1, 0, 0, 0, 0, 0, 0, 102],
231-
expected: 72057594037928030
231+
expected: '72057594037928038'
232232
},{
233233
name: 'binary-oid',
234234
format: 'binary',

0 commit comments

Comments
 (0)