Skip to content

Commit 9824742

Browse files
dougwilsonseangarner
authored andcommitted
Fix pool.query to use typeCast configuration
fixes mysqljs#894
1 parent d925970 commit 9824742

File tree

5 files changed

+165
-44
lines changed

5 files changed

+165
-44
lines changed

Changes.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ This file is a manually maintained list of changes for each release. Feel free
44
to add your changes here when sending pull requests. Also send corrections if
55
you spot any mistakes.
66

7+
## HEAD
8+
9+
* Fix `pool.query` to use `typeCast` configuration
10+
711
## v2.4.2 (2014-08-03)
812

913
* Fix incorrect sequence packet errors to be catchable #867

lib/Pool.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ Pool.prototype.end = function (cb) {
163163
Pool.prototype.query = function (sql, values, cb) {
164164
var query = Connection.createQuery(sql, values, cb);
165165

166+
if (!(typeof sql === 'object' && 'typeCast' in sql)) {
167+
query.typeCast = this.config.connectionConfig.typeCast;
168+
}
169+
166170
if (this.config.connectionConfig.trace) {
167171
// Long stack trace support
168172
query._callSite = new Error;

test/integration/connection/test-custom-typecast.js

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
var assert = require('assert');
2+
var common = require('../../common');
3+
var connection = common.createConnection({
4+
port : common.fakeServerPort,
5+
typeCast : typeCast
6+
});
7+
8+
function typeCast(field, next) {
9+
if (field.type !== 'TINY') {
10+
return next();
11+
}
12+
13+
var val = field.string();
14+
15+
if (val === null) {
16+
return null;
17+
}
18+
19+
return (Number(val) > 0);
20+
}
21+
22+
var server = common.createFakeServer();
23+
24+
server.listen(common.fakeServerPort, function (err) {
25+
assert.ifError(err);
26+
27+
connection.query('SELECT value FROM typecast', function (err, rows) {
28+
assert.ifError(err);
29+
assert.equal(rows.length, 3);
30+
assert.strictEqual(rows[0].value, false);
31+
assert.strictEqual(rows[1].value, true);
32+
assert.strictEqual(rows[2].value, null);
33+
34+
connection.destroy();
35+
server.destroy();
36+
});
37+
});
38+
39+
server.on('connection', function(conn) {
40+
conn.handshake();
41+
conn.on('query', function(packet) {
42+
switch (packet.sql) {
43+
case 'SELECT value FROM typecast':
44+
this._sendPacket(new common.Packets.ResultSetHeaderPacket({
45+
fieldCount: 1
46+
}));
47+
48+
this._sendPacket(new common.Packets.FieldPacket({
49+
catalog : 'def',
50+
charsetNr : common.Charsets.UTF8_GENERAL_CI,
51+
name : 'value',
52+
protocol41 : true,
53+
type : common.Types.TINY
54+
}));
55+
56+
this._sendPacket(new common.Packets.EofPacket());
57+
58+
var writer = new common.PacketWriter();
59+
writer.writeLengthCodedString('0');
60+
this._socket.write(writer.toBuffer(this._parser));
61+
62+
var writer = new common.PacketWriter();
63+
writer.writeLengthCodedString('1');
64+
this._socket.write(writer.toBuffer(this._parser));
65+
66+
var writer = new common.PacketWriter();
67+
writer.writeLengthCodedString(null);
68+
this._socket.write(writer.toBuffer(this._parser));
69+
70+
this._sendPacket(new common.Packets.EofPacket());
71+
this._parser.resetPacketNumber();
72+
break;
73+
default:
74+
this._handleQueryPacket(packet);
75+
break;
76+
}
77+
});
78+
});
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
var assert = require('assert');
2+
var common = require('../../common');
3+
var pool = common.createPool({
4+
port : common.fakeServerPort,
5+
typeCast : typeCast
6+
});
7+
var server = common.createFakeServer();
8+
9+
function typeCast(field, next) {
10+
if (field.type !== 'TINY') {
11+
return next();
12+
}
13+
14+
var val = field.string();
15+
16+
if (val === null) {
17+
return null;
18+
}
19+
20+
return (Number(val) > 0);
21+
}
22+
23+
server.listen(common.fakeServerPort, function (err) {
24+
assert.ifError(err);
25+
26+
pool.query('SELECT value FROM typecast', function (err, rows) {
27+
assert.ifError(err);
28+
assert.equal(rows.length, 3);
29+
assert.strictEqual(rows[0].value, false);
30+
assert.strictEqual(rows[1].value, true);
31+
assert.strictEqual(rows[2].value, null);
32+
33+
pool.end(function(err) {
34+
assert.ifError(err);
35+
server.destroy();
36+
});
37+
});
38+
});
39+
40+
server.on('connection', function(conn) {
41+
conn.handshake();
42+
conn.on('query', function(packet) {
43+
switch (packet.sql) {
44+
case 'SELECT value FROM typecast':
45+
this._sendPacket(new common.Packets.ResultSetHeaderPacket({
46+
fieldCount: 1
47+
}));
48+
49+
this._sendPacket(new common.Packets.FieldPacket({
50+
catalog : 'def',
51+
charsetNr : common.Charsets.UTF8_GENERAL_CI,
52+
name : 'value',
53+
protocol41 : true,
54+
type : common.Types.TINY
55+
}));
56+
57+
this._sendPacket(new common.Packets.EofPacket());
58+
59+
var writer = new common.PacketWriter();
60+
writer.writeLengthCodedString('0');
61+
this._socket.write(writer.toBuffer(this._parser));
62+
63+
var writer = new common.PacketWriter();
64+
writer.writeLengthCodedString('1');
65+
this._socket.write(writer.toBuffer(this._parser));
66+
67+
var writer = new common.PacketWriter();
68+
writer.writeLengthCodedString(null);
69+
this._socket.write(writer.toBuffer(this._parser));
70+
71+
this._sendPacket(new common.Packets.EofPacket());
72+
this._parser.resetPacketNumber();
73+
break;
74+
default:
75+
this._handleQueryPacket(packet);
76+
break;
77+
}
78+
});
79+
});

0 commit comments

Comments
 (0)