Skip to content

Commit b7933df

Browse files
author
Andrey Sidorov
committed
use results encoding dor data deserializing and connection encoding for serializing
1 parent 1331029 commit b7933df

File tree

9 files changed

+65
-51
lines changed

9 files changed

+65
-51
lines changed

lib/commands/execute.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Execute.prototype.buildParserFromFields = function (fields, connection) {
4040
};
4141

4242
Execute.prototype.start = function (packet, connection) {
43-
var executePacket = new Packets.Execute(this.statement.id, this.parameters);
43+
var executePacket = new Packets.Execute(this.statement.id, this.parameters, connection.config.charsetNumber);
4444
connection.writePacket(executePacket.toPacket(1));
4545
return Execute.prototype.resultsetHeader;
4646
};

lib/compile_binary_parser.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var vm = require('vm');
22

33
var FieldFlags = require('./constants/field_flags.js');
44
var Charsets = require('./constants/charsets.js');
5+
var CharsetToEncoding = require('./constants/charset_encodings.js');
56
var Types = require('./constants/types.js');
67
var srcEscape = require('./helpers').srcEscape;
78

@@ -150,7 +151,7 @@ function readCodeFor (field, config, options) {
150151
if (field.characterSet == Charsets.BINARY) {
151152
return 'packet.readLengthCodedBuffer();';
152153
} else {
153-
return 'packet.readLengthCodedString();';
154+
return 'packet.readLengthCodedString("' + CharsetToEncoding[field.characterSet] + '")';
154155
}
155156
}
156157
}

lib/compile_text_parser.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
var Types = require('./constants/types');
2-
var Charsets = require('./constants/charsets');
1+
var Types = require('./constants/types.js');
2+
var Charsets = require('./constants/charsets.js');
3+
var CharsetToEncoding = require('./constants/charset_encodings.js');
34
var vm = require('vm');
45
var srcEscape = require('./helpers').srcEscape;
56

@@ -146,7 +147,7 @@ function readCodeFor (type, charset, config, options) {
146147
if (charset == Charsets.BINARY) {
147148
return 'packet.readLengthCodedBuffer()';
148149
} else {
149-
return 'packet.readLengthCodedString(' + charset + ')';
150+
return 'packet.readLengthCodedString("' + CharsetToEncoding[charset] + '")';
150151
}
151152
}
152153
}

lib/packets/auth_switch_request.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ AuthSwitchRequest.prototype.toPacket = function ()
1616
var packet = new Packet(0, buffer, 0, length);
1717
packet.offset = 4;
1818
packet.writeInt8(0xfe);
19-
packet.writeNullTerminatedString(this.pluginName);
19+
20+
// TODO: use server encoding
21+
packet.writeNullTerminatedString(this.pluginName, 'cesu8');
2022
packet.writeBuffer(this.pluginData);
2123
return packet;
2224
};
@@ -26,7 +28,8 @@ AuthSwitchRequest.fromPacket = function (packet)
2628
var marker = packet.readInt8();
2729
// assert marker == 0xfe?
2830

29-
var name = packet.readNullTerminatedString();
31+
// TODO: use server encoding
32+
var name = packet.readNullTerminatedString('cesu8');
3033
var data = packet.readBuffer();
3134

3235
return new AuthSwitchRequest({

lib/packets/change_user.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var CommandCode = require('../constants/commands.js');
44
var ClientConstants = require('../constants/client.js');
55
var Packet = require('../packets/packet.js');
66
var auth41 = require('../auth_41.js');
7+
var CharsetToEncoding = require('./constants/charset_encodings.js');
8+
79

810
function ChangeUser (opts)
911
{
@@ -39,16 +41,18 @@ ChangeUser.prototype.serializeToBuffer = function (buffer)
3941
var packet = new Packet(0, buffer, 0, buffer.length);
4042
packet.offset = 4;
4143

44+
var encoding = CharsetToEncoding[this.charsetNumber];
45+
4246
packet.writeInt8(CommandCode.CHANGE_USER);
43-
packet.writeNullTerminatedString(this.user);
47+
packet.writeNullTerminatedString(this.user, encoding);
4448
if (isSet('SECURE_CONNECTION')) {
4549
packet.writeInt8(this.authToken.length);
4650
packet.writeBuffer(this.authToken);
4751
} else {
4852
packet.writeBuffer(this.authToken);
4953
packet.writeInt8(0);
5054
}
51-
packet.writeNullTerminatedString(this.database);
55+
packet.writeNullTerminatedString(this.database, encoding);
5256
packet.writeInt16(this.charsetNumber);
5357

5458
if (isSet('PLUGIN_AUTH')) {
@@ -60,13 +64,13 @@ ChangeUser.prototype.serializeToBuffer = function (buffer)
6064
var attrNames = Object.keys(connectAttributes);
6165
var keysLength = 0;
6266
for (k = 0; k < attrNames.length; ++k) {
63-
keysLength += Packet.lengthCodedStringLength(attrNames[k]);
64-
keysLength += Packet.lengthCodedStringLength(connectAttributes[attrNames[k]]);
67+
keysLength += Packet.lengthCodedStringLength(attrNames[k], encoding);
68+
keysLength += Packet.lengthCodedStringLength(connectAttributes[attrNames[k]], encoding);
6569
}
6670
packet.writeLengthCodedNumber(keysLength);
6771
for (k = 0; k < attrNames.length; ++k) {
68-
packet.writeLengthCodedString(attrNames[k]);
69-
packet.writeLengthCodedString(connectAttributes[attrNames[k]]);
72+
packet.writeLengthCodedString(attrNames[k], encoding);
73+
packet.writeLengthCodedString(connectAttributes[attrNames[k]], encoding);
7074
}
7175
}
7276
return packet;

lib/packets/execute.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ var CursorType = require('../constants/cursor');
33
var CommandCodes = require('../constants/commands');
44
var Types = require('../constants/types');
55
var Packet = require('../packets/packet');
6+
var CharsetToEncoding = require('./constants/charset_encodings.js');
67

7-
function Execute (id, parameters)
8+
function Execute (id, parameters, charsetNumber)
89
{
910
this.id = id;
1011
this.parameters = parameters;
12+
this.encoding = CharsetToEncoding[charsetNumber];
1113
}
1214

1315
Execute.prototype.toPacket = function ()
@@ -43,9 +45,7 @@ Execute.prototype.toPacket = function ()
4345
}
4446
else {
4547
var str = this.parameters[i].toString();
46-
var byteLen = Buffer.byteLength(str, 'utf8');
47-
length += Packet.lengthCodedNumberLength(byteLen);
48-
length += byteLen;
48+
length += Packet.lengthCodedStringLength(str, this.encoding);
4949
}
5050
}
5151
}
@@ -99,7 +99,7 @@ Execute.prototype.toPacket = function ()
9999
if (Buffer.isBuffer(this.parameters[i])) {
100100
packet.writeLengthCodedBuffer(this.parameters[i]);
101101
} else {
102-
packet.writeLengthCodedString(this.parameters[i].toString());
102+
packet.writeLengthCodedString(this.parameters[i].toString(), this.encoding);
103103
}
104104
}
105105
}

lib/packets/handshake_response.js

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var Buffer = require('safe-buffer').Buffer;
22

33
var ClientConstants = require('../constants/client.js');
44
var Charsets = require('../constants/charsets.js');
5+
var CharsetToEncoding = require('./constants/charset_encodings.js');
56
var Packet = require('../packets/packet.js');
67

78
var auth41 = require('../auth_41.js');
@@ -39,29 +40,30 @@ HandshakeResponse.fromPacket = function (packet)
3940

4041
args.maxPacketSize = packet.readInt32();
4142
args.charsetNumber = packet.readInt8();
43+
var encoding = CharsetToEncoding[args.charsetNumber];
4244
packet.skip(23);
4345
args.user = packet.readNullTerminatedString();
4446
var authTokenLength;
4547
if (isSet('PLUGIN_AUTH_LENENC_CLIENT_DATA')) {
46-
authTokenLength = packet.readLengthCodedNumber();
48+
authTokenLength = packet.readLengthCodedNumber(encoding);
4749
args.authToken = packet.readBuffer(authTokenLength);
4850
} else if (isSet('SECURE_CONNECTION')) {
4951
authTokenLength = packet.readInt8();
5052
args.authToken = packet.readBuffer(authTokenLength);
5153
} else {
52-
args.authToken = packet.readNullTerminatedString();
54+
args.authToken = packet.readNullTerminatedString(encoding);
5355
} if (isSet('CONNECT_WITH_DB')) {
54-
args.database = packet.readNullTerminatedString();
56+
args.database = packet.readNullTerminatedString(encoding);
5557
}
5658
if (isSet('PLUGIN_AUTH')) {
57-
args.authPluginName = packet.readNullTerminatedString();
59+
args.authPluginName = packet.readNullTerminatedString(encoding);
5860
}
5961
if (isSet('CONNECT_ATTRS')) {
60-
var keysLength = packet.readLengthCodedNumber();
62+
var keysLength = packet.readLengthCodedNumber(encoding);
6163
var keysEnd = packet.offset + keysLength;
6264
var attrs = {};
6365
while (packet.offset < keysEnd) {
64-
attrs[packet.readLengthCodedString()] = packet.readLengthCodedString();
66+
attrs[packet.readLengthCodedString(encoding)] = packet.readLengthCodedString(encoding);
6567
}
6668
args.connectAttributes = attrs;
6769
}
@@ -80,7 +82,9 @@ HandshakeResponse.prototype.serializeResponse = function (buffer) {
8082
packet.writeInt32(0); // max packet size. todo: move to config
8183
packet.writeInt8(this.charsetNumber);
8284
packet.skip(23);
83-
packet.writeNullTerminatedString(this.user);
85+
86+
var encoding = CharsetToEncoding[args.charsetNumber];
87+
packet.writeNullTerminatedString(this.user, encoding);
8488

8589
var authTokenLength, k;
8690
if (isSet('PLUGIN_AUTH_LENENC_CLIENT_DATA')) {
@@ -90,9 +94,10 @@ HandshakeResponse.prototype.serializeResponse = function (buffer) {
9094
packet.writeInt8(this.authToken.length);
9195
packet.writeBuffer(this.authToken);
9296
} else {
93-
packet.writeNullTerminatedString(Buffer.from(this.authToken));
97+
packet.writeBuffer(this.authToken);
98+
packet.writeInt8(0);
9499
} if (isSet('CONNECT_WITH_DB')) {
95-
packet.writeNullTerminatedString(this.database);
100+
packet.writeNullTerminatedString(this.database, encoding);
96101
}
97102
if (isSet('PLUGIN_AUTH')) {
98103
// TODO: pass from config
@@ -103,13 +108,13 @@ HandshakeResponse.prototype.serializeResponse = function (buffer) {
103108
var attrNames = Object.keys(connectAttributes);
104109
var keysLength = 0;
105110
for (k = 0; k < attrNames.length; ++k) {
106-
keysLength += Packet.lengthCodedStringLength(attrNames[k]);
107-
keysLength += Packet.lengthCodedStringLength(connectAttributes[attrNames[k]]);
111+
keysLength += Packet.lengthCodedStringLength(attrNames[k], encoding);
112+
keysLength += Packet.lengthCodedStringLength(connectAttributes[attrNames[k]], encoding);
108113
}
109114
packet.writeLengthCodedNumber(keysLength);
110115
for (k = 0; k < attrNames.length; ++k) {
111-
packet.writeLengthCodedString(attrNames[k]);
112-
packet.writeLengthCodedString(connectAttributes[attrNames[k]]);
116+
packet.writeLengthCodedString(attrNames[k], encoding);
117+
packet.writeLengthCodedString(connectAttributes[attrNames[k]], encoding);
113118
}
114119
}
115120
return packet;

lib/packets/packet.js

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ Packet.prototype.readTimeString = function (convertTtoMs) {
342342
return (sign === -1 ? '-' : '') + [(d ? (d * 24) + H : H), leftPad(2, M), leftPad(2, S)].join(':') + (ms ? '.' + ms : '');
343343
};
344344

345-
Packet.prototype.readLengthCodedString = function (characterSetCode) {
345+
Packet.prototype.readLengthCodedString = function (encoding) {
346346
var len = this.readLengthCodedNumber();
347347
// TODO: check manually first byte here to avoid polymorphic return type?
348348
if (len === null) {
@@ -352,22 +352,22 @@ Packet.prototype.readLengthCodedString = function (characterSetCode) {
352352

353353
// TODO: Use characterSetCode to get proper encoding
354354
// https://github.com/sidorares/node-mysql2/pull/374
355-
return StringParser.decode(this.buffer.slice(this.offset - len, this.offset), 'cesu8');
355+
return StringParser.decode(this.buffer.slice(this.offset - len, this.offset), encoding);
356356
};
357357

358358
Packet.prototype.readLengthCodedBuffer = function () {
359359
var len = this.readLengthCodedNumber();
360360
return this.readBuffer(len);
361361
};
362362

363-
Packet.prototype.readNullTerminatedString = function () {
363+
Packet.prototype.readNullTerminatedString = function (encoding) {
364364
var start = this.offset;
365365
var end = this.offset;
366366
while (this.buffer[end]) {
367367
end = end + 1; // TODO: handle OOB check
368368
}
369369
this.offset = end + 1;
370-
return this.buffer.utf8Slice(start, end);
370+
return StringParser.decode(this.buffer.slice(start, end), encoding);
371371
};
372372

373373
// TODO reuse?
@@ -566,7 +566,7 @@ Packet.prototype.parseDate = function () {
566566
};
567567

568568
Packet.prototype.parseDateTime = function () {
569-
var str = this.readLengthCodedString();
569+
var str = this.readLengthCodedString('binary');
570570
if (str === null) {
571571
return null;
572572
}
@@ -687,8 +687,9 @@ Packet.lengthCodedNumberLength = function (n) {
687687
}
688688
};
689689

690-
Packet.lengthCodedStringLength = function (str) {
691-
var slen = Buffer.byteLength(str, 'utf8');
690+
Packet.lengthCodedStringLength = function (str, encoding) {
691+
var buf = StringParser.encode(s, encoding);
692+
var slen = buf.length;
692693
return Packet.lengthCodedNumberLength(slen) + slen;
693694
};
694695

@@ -723,9 +724,9 @@ Packet.prototype.writeNull = function () {
723724
};
724725

725726
// TODO: refactor following three?
726-
Packet.prototype.writeNullTerminatedString = function (s) {
727-
this.buffer.write(s, this.offset);
728-
this.offset += s.length;
727+
Packet.prototype.writeNullTerminatedString = function (s, encoding) {
728+
var buf = StringParser.encode(s, encoding);
729+
this.offset += buf.copy(this.buffer, this.offset);
729730
this.writeInt8(0);
730731
};
731732

@@ -744,15 +745,14 @@ Packet.prototype.writeString = function (s, encoding) {
744745
// this.buffer.write(s, this.offset, bytes, 'utf8');
745746
// this.offset += bytes;
746747

747-
var buf = StringParser.encode(s, encoding || 'cesu8');
748+
var buf = StringParser.encode(s, encoding);
748749
this.offset += buf.copy(this.buffer, this.offset);
749750
};
750751

751-
Packet.prototype.writeLengthCodedString = function (s) {
752-
var bytes = Buffer.byteLength(s, 'utf8');
753-
this.writeLengthCodedNumber(bytes);
754-
this.buffer.write(s, this.offset, bytes, 'utf8');
755-
this.offset += bytes;
752+
Packet.prototype.writeLengthCodedString = function (s, encoding) {
753+
var buf = StringParser.encode(s, encoding);
754+
this.writeLengthCodedNumber(buf.length);
755+
this.offset += buf.copy(this.buffer, this.offset);
756756
};
757757

758758
Packet.prototype.writeLengthCodedBuffer = function (b) {

lib/packets/prepare_statement.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,25 @@ var Buffer = require('safe-buffer').Buffer;
22
var Packet = require('../packets/packet');
33
var CommandCodes = require('../constants/commands');
44
var StringParser = require('../parsers/string.js');
5+
var CharsetToEncoding = require('./constants/charset_encodings.js');
56

67
function PrepareStatement (sql, charsetNumber)
78
{
89
this.query = sql;
910
this.charsetNumber = charsetNumber;
11+
this.encoding = CharsetToEncoding[charsetNumber];
1012
}
1113

1214
PrepareStatement.prototype.toPacket = function ()
1315
{
14-
// TODO: use this.charsetNumber and get proper encoding type
15-
var buf = StringParser.encode(this.query, 'cesu8');
16+
var buf = StringParser.encode(this.query, this.encoding);
1617
var length = 5 + buf.length;
1718

1819
var buffer = Buffer.allocUnsafe(length);
1920
var packet = new Packet(0, buffer, 0, length);
2021
packet.offset = 4;
2122
packet.writeInt8(CommandCodes.STMT_PREPARE);
22-
// TODO: pass down encoding to this method too
23-
packet.writeString(this.query, 'cesu8');
23+
packet.writeBuffer(buf);
2424
return packet;
2525
};
2626

0 commit comments

Comments
 (0)