Skip to content

Commit 5cc6c68

Browse files
bbitodougwilson
authored andcommitted
Accept array of type names to dateStrings option
closes #605 closes #1481
1 parent ed9b8bb commit 5cc6c68

File tree

6 files changed

+135
-7
lines changed

6 files changed

+135
-7
lines changed

Changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ you spot any mistakes.
66

77
## HEAD
88

9+
* Accept array of type names to `dateStrings` option #605 #1481
910
* Add `query` method to `PoolNamespace` #1256 #1505 #1506
1011
- Used as `cluster.of(...).query(...)`
1112
* Fix typo in `HANDSHAKE_NO_SSL_SUPPORT` error message #1534

Readme.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ issue [#501](https://github.com/mysqljs/mysql/issues/501). (Default: `false`)
211211
(which happens when they exceed the [-2^53, +2^53] range), otherwise they will be returned as
212212
Number objects. This option is ignored if `supportBigNumbers` is disabled.
213213
* `dateStrings`: Force date types (TIMESTAMP, DATETIME, DATE) to be returned as strings rather then
214-
inflated into JavaScript Date objects. (Default: `false`)
214+
inflated into JavaScript Date objects. Can be `true`/`false` or an array of type names to keep as
215+
strings. (Default: `false`)
215216
* `debug`: Prints protocol details to stdout. (Default: `false`)
216217
* `trace`: Generates stack traces on `Error` to include call site of library
217218
entrance ("long stack traces"). Slight performance penalty for most calls.

lib/protocol/packets/RowDataPacket.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings,
6161
case Types.DATETIME2:
6262
case Types.NEWDATE:
6363
var dateString = parser.parseLengthCodedString();
64-
if (dateStrings) {
64+
65+
if (typeMatch(field.type, dateStrings)) {
6566
return dateString;
6667
}
67-
var dt;
6868

6969
if (dateString === null) {
7070
return null;
@@ -79,7 +79,7 @@ function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings,
7979
dateString += ' ' + timeZone;
8080
}
8181

82-
dt = new Date(dateString);
82+
var dt = new Date(dateString);
8383
if (isNaN(dt.getTime())) {
8484
return originalString;
8585
}
@@ -120,3 +120,14 @@ function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings,
120120
return parser.parseLengthCodedString();
121121
}
122122
}
123+
124+
function typeMatch(type, list) {
125+
if (Array.isArray(list)) {
126+
for (var i = 0; i < list.length; i++) {
127+
if (Types[list[i]] === type) return true;
128+
}
129+
return false;
130+
} else {
131+
return Boolean(list);
132+
}
133+
}

test/unit/connection/test-date-type-cast.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var server = common.createFakeServer();
66
server.listen(common.fakeServerPort, function (err) {
77
assert.ifError(err);
88

9-
var done = after(2, function () {
9+
var done = after(4, function () {
1010
server.destroy();
1111
});
1212

@@ -41,6 +41,39 @@ server.listen(common.fakeServerPort, function (err) {
4141
conn2.destroy();
4242
done();
4343
});
44+
45+
var conn3 = common.createConnection({
46+
dateStrings : ['DATE'],
47+
port : common.fakeServerPort,
48+
timezone : 'Z'
49+
});
50+
conn3.query('SELECT value FROM date_rows', function (err, rows) {
51+
assert.ifError(err);
52+
assert.equal(rows.length, 4);
53+
assert.strictEqual(rows[0].value, '0000-00-00');
54+
assert.strictEqual(rows[1].value, '2000-00-00');
55+
assert.strictEqual(rows[2].value, '2000-01-00');
56+
assert.strictEqual(rows[3].value, '2000-01-02');
57+
conn3.destroy();
58+
done();
59+
});
60+
61+
var conn4 = common.createConnection({
62+
dateStrings : ['DATETIME', 'TIMESTAMP'],
63+
port : common.fakeServerPort,
64+
timezone : 'Z'
65+
});
66+
conn4.query('SELECT value FROM date_rows', function (err, rows) {
67+
assert.ifError(err);
68+
assert.equal(rows.length, 4);
69+
assert.strictEqual(rows[0].value, '0000-00-00');
70+
assert.strictEqual(rows[1].value, '2000-00-00');
71+
assert.strictEqual(rows[2].value, '2000-01-00');
72+
assert.ok(rows[3].value instanceof Date);
73+
assert.strictEqual(rows[3].value.toISOString(), '2000-01-02T00:00:00.000Z');
74+
conn4.destroy();
75+
done();
76+
});
4477
});
4578

4679
server.on('connection', function(conn) {

test/unit/connection/test-datetime-type-cast.js

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var server = common.createFakeServer();
66
server.listen(common.fakeServerPort, function (err) {
77
assert.ifError(err);
88

9-
var done = after(2, function () {
9+
var done = after(4, function () {
1010
server.destroy();
1111
});
1212

@@ -49,6 +49,47 @@ server.listen(common.fakeServerPort, function (err) {
4949
conn2.destroy();
5050
done();
5151
});
52+
53+
var conn3 = common.createConnection({
54+
dateStrings : ['DATE'],
55+
port : common.fakeServerPort,
56+
timezone : 'Z'
57+
});
58+
conn3.query('SELECT value FROM datetime_rows', function (err, rows) {
59+
assert.ifError(err);
60+
assert.equal(rows.length, 7);
61+
assert.strictEqual(rows[0].value, '0000-00-00 00:00:00');
62+
assert.strictEqual(rows[1].value, '2000-00-00 00:00:00');
63+
assert.strictEqual(rows[2].value, '2000-01-00 00:00:00');
64+
assert.strictEqual(rows[3].value, '2000-01-02 03:04:60');
65+
assert.ok(rows[4].value instanceof Date);
66+
assert.strictEqual(rows[4].value.toISOString(), '2000-01-02T00:00:00.000Z');
67+
assert.ok(rows[5].value instanceof Date);
68+
assert.strictEqual(rows[5].value.toISOString(), '2000-01-02T03:04:05.000Z');
69+
assert.ok(rows[6].value instanceof Date);
70+
assert.strictEqual(rows[6].value.toISOString(), '2000-01-02T03:04:05.006Z');
71+
conn3.destroy();
72+
done();
73+
});
74+
75+
var conn4 = common.createConnection({
76+
dateStrings : ['DATETIME', 'TIMESTAMP'],
77+
port : common.fakeServerPort,
78+
timezone : 'Z'
79+
});
80+
conn4.query('SELECT value FROM datetime_rows', function (err, rows) {
81+
assert.ifError(err);
82+
assert.equal(rows.length, 7);
83+
assert.strictEqual(rows[0].value, '0000-00-00 00:00:00');
84+
assert.strictEqual(rows[1].value, '2000-00-00 00:00:00');
85+
assert.strictEqual(rows[2].value, '2000-01-00 00:00:00');
86+
assert.strictEqual(rows[3].value, '2000-01-02 03:04:60');
87+
assert.strictEqual(rows[4].value, '2000-01-02 00:00:00');
88+
assert.strictEqual(rows[5].value, '2000-01-02 03:04:05');
89+
assert.strictEqual(rows[6].value, '2000-01-02 03:04:05.006');
90+
conn4.destroy();
91+
done();
92+
});
5293
});
5394

5495
server.on('connection', function(conn) {

test/unit/connection/test-timestamp-type-cast.js

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var server = common.createFakeServer();
66
server.listen(common.fakeServerPort, function (err) {
77
assert.ifError(err);
88

9-
var done = after(2, function () {
9+
var done = after(4, function () {
1010
server.destroy();
1111
});
1212

@@ -49,6 +49,47 @@ server.listen(common.fakeServerPort, function (err) {
4949
conn2.destroy();
5050
done();
5151
});
52+
53+
var conn3 = common.createConnection({
54+
dateStrings : ['DATE'],
55+
port : common.fakeServerPort,
56+
timezone : 'Z'
57+
});
58+
conn3.query('SELECT value FROM datetime_rows', function (err, rows) {
59+
assert.ifError(err);
60+
assert.equal(rows.length, 7);
61+
assert.strictEqual(rows[0].value, '0000-00-00 00:00:00');
62+
assert.strictEqual(rows[1].value, '2000-00-00 00:00:00');
63+
assert.strictEqual(rows[2].value, '2000-01-00 00:00:00');
64+
assert.strictEqual(rows[3].value, '2000-01-02 03:04:60');
65+
assert.ok(rows[4].value instanceof Date);
66+
assert.strictEqual(rows[4].value.toISOString(), '2000-01-02T00:00:00.000Z');
67+
assert.ok(rows[5].value instanceof Date);
68+
assert.strictEqual(rows[5].value.toISOString(), '2000-01-02T03:04:05.000Z');
69+
assert.ok(rows[6].value instanceof Date);
70+
assert.strictEqual(rows[6].value.toISOString(), '2000-01-02T03:04:05.006Z');
71+
conn3.destroy();
72+
done();
73+
});
74+
75+
var conn4 = common.createConnection({
76+
dateStrings : ['DATETIME', 'TIMESTAMP'],
77+
port : common.fakeServerPort,
78+
timezone : 'Z'
79+
});
80+
conn4.query('SELECT value FROM datetime_rows', function (err, rows) {
81+
assert.ifError(err);
82+
assert.equal(rows.length, 7);
83+
assert.strictEqual(rows[0].value, '0000-00-00 00:00:00');
84+
assert.strictEqual(rows[1].value, '2000-00-00 00:00:00');
85+
assert.strictEqual(rows[2].value, '2000-01-00 00:00:00');
86+
assert.strictEqual(rows[3].value, '2000-01-02 03:04:60');
87+
assert.strictEqual(rows[4].value, '2000-01-02 00:00:00');
88+
assert.strictEqual(rows[5].value, '2000-01-02 03:04:05');
89+
assert.strictEqual(rows[6].value, '2000-01-02 03:04:05.006');
90+
conn4.destroy();
91+
done();
92+
});
5293
});
5394

5495
server.on('connection', function(conn) {

0 commit comments

Comments
 (0)