From 09953a397b1ddd1937fdd015458021301adff770 Mon Sep 17 00:00:00 2001 From: cnx Date: Sat, 14 Apr 2012 15:52:25 +0800 Subject: [PATCH 1/7] add the support for execute using other charset --- lib/mysql-native/charset.js | 1 - lib/mysql-native/commands/execute.js | 2 +- lib/mysql-native/commands/query.js | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mysql-native/charset.js b/lib/mysql-native/charset.js index 5670bfb..20d6643 100644 --- a/lib/mysql-native/charset.js +++ b/lib/mysql-native/charset.js @@ -36,7 +36,6 @@ exports.Charset.prototype.convertFromBytes = function(bytes) { var convertUTF8ToBytes = function(str) { if(typeof(str)=='undefined') return undefined; if(typeof(str)=='undefined') return undefined; - var surrogate_1st = 0; var unicode_codes = []; for (var i = 0; i < str.length; ++i) { diff --git a/lib/mysql-native/commands/execute.js b/lib/mysql-native/commands/execute.js index 279579a..cdbfd2e 100644 --- a/lib/mysql-native/commands/execute.js +++ b/lib/mysql-native/commands/execute.js @@ -173,7 +173,7 @@ function execPrepared(sql, parameters) if (!null_bit_map[f]) { var value = r.unpackBinary(field.type, field.flags & field_flags.UNSIGNED); - this.store_column(row, field, value, use_hash); + this.store_column(row, field, this.client.charset.convertFromBytes(value), use_hash); } else { this.store_column(row, field, null, use_hash); } diff --git a/lib/mysql-native/commands/query.js b/lib/mysql-native/commands/query.js index 356fe23..f4e4b66 100644 --- a/lib/mysql-native/commands/query.js +++ b/lib/mysql-native/commands/query.js @@ -156,6 +156,7 @@ module.exports = function(sql) var strValue = r.lcstring(); if( charset ) strValue = charset.convertFromBytes( strValue ); + console.log(strValue); var value = string2type(strValue, field.type); // todo: move to serialiser unpackString this.store_column(row, field, value, use_hash) field_index++; From 110e858800996be0048bfee6f7e4adf695d03050 Mon Sep 17 00:00:00 2001 From: cnx Date: Sat, 14 Apr 2012 16:02:34 +0800 Subject: [PATCH 2/7] delete the console sentence --- lib/mysql-native/commands/query.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mysql-native/commands/query.js b/lib/mysql-native/commands/query.js index f4e4b66..77853fd 100644 --- a/lib/mysql-native/commands/query.js +++ b/lib/mysql-native/commands/query.js @@ -156,7 +156,7 @@ module.exports = function(sql) var strValue = r.lcstring(); if( charset ) strValue = charset.convertFromBytes( strValue ); - console.log(strValue); + var value = string2type(strValue, field.type); // todo: move to serialiser unpackString this.store_column(row, field, value, use_hash) field_index++; From 1583a14fad0b2d926139c67170a8263629191a86 Mon Sep 17 00:00:00 2001 From: cnx Date: Sat, 14 Apr 2012 16:59:18 +0800 Subject: [PATCH 3/7] fix some codes checking string --- lib/mysql-native/charset.js | 7 +++---- lib/mysql-native/commands/execute.js | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/mysql-native/charset.js b/lib/mysql-native/charset.js index 20d6643..6b96200 100644 --- a/lib/mysql-native/charset.js +++ b/lib/mysql-native/charset.js @@ -34,8 +34,7 @@ exports.Charset.prototype.convertFromBytes = function(bytes) { // "あい" => "\xE3\x81\x82\xE3\x81\x84" // UTF-8 var convertUTF8ToBytes = function(str) { - if(typeof(str)=='undefined') return undefined; - if(typeof(str)=='undefined') return undefined; + if(typeof(str)!='string')return str; var surrogate_1st = 0; var unicode_codes = []; for (var i = 0; i < str.length; ++i) { @@ -84,7 +83,7 @@ var convertUTF8ToBytes = function(str) { } var convertUTF8FromBytes = function(str) { - if(typeof(str)=='undefined') return undefined; + if(typeof(str)!='string')return str; var unicode_str = ""; var unicode_code = 0; @@ -132,7 +131,7 @@ var convertUTF8FromBytes = function(str) { } else { // Malformed UTF-8 sequence ignored. } - + return unicode_str.substring(1); } diff --git a/lib/mysql-native/commands/execute.js b/lib/mysql-native/commands/execute.js index cdbfd2e..192c02f 100644 --- a/lib/mysql-native/commands/execute.js +++ b/lib/mysql-native/commands/execute.js @@ -172,8 +172,8 @@ function execPrepared(sql, parameters) var field = this.ps.fields[f]; if (!null_bit_map[f]) { - var value = r.unpackBinary(field.type, field.flags & field_flags.UNSIGNED); - this.store_column(row, field, this.client.charset.convertFromBytes(value), use_hash); + var value = this.client.charset.convertFromBytes(r.unpackBinary(field.type, field.flags & field_flags.UNSIGNED)); + this.store_column(row, field, value, use_hash); } else { this.store_column(row, field, null, use_hash); } From d7f44abddf6e9f247d431f455b8d3fb3bfa9cb6d Mon Sep 17 00:00:00 2001 From: cnx Date: Sun, 15 Apr 2012 15:43:41 +0800 Subject: [PATCH 4/7] add test for execute --- test/insert.test.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/insert.test.js b/test/insert.test.js index a3b80be..1941f0e 100644 --- a/test/insert.test.js +++ b/test/insert.test.js @@ -61,6 +61,27 @@ module.exports = { }) }) + }, + + 'test insert multibyte using execute':function(cb) { + + var db = createConnection(); + var parent = 43; + var field = "中文语言支持了"; + db.execute('INSERT INTO tbl SET id = NULL,parent = ?,field = (?)',[parent , field]).on('end', function(){ + var insert_id = this.result.insert_id; + + assert.ok(insert_id >= 0) + + db.execute('SELECT id,parent,field FROM tbl WHERE id = ' + insert_id).on('row', function(row){ + assert.equal( row.id, insert_id ); + assert.equal( row.field, "中文语言支持了" ); + }).on('end', function() { + db.close(); + if(cb) + cb(); + }) + }); } } From 41d8b76e9c0f45519135d7fcc609355a67363b19 Mon Sep 17 00:00:00 2001 From: cnx Date: Sun, 15 Apr 2012 15:51:26 +0800 Subject: [PATCH 5/7] add the check if it's need to convert --- lib/mysql-native/commands/execute.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/mysql-native/commands/execute.js b/lib/mysql-native/commands/execute.js index 192c02f..1c48a20 100644 --- a/lib/mysql-native/commands/execute.js +++ b/lib/mysql-native/commands/execute.js @@ -172,7 +172,9 @@ function execPrepared(sql, parameters) var field = this.ps.fields[f]; if (!null_bit_map[f]) { - var value = this.client.charset.convertFromBytes(r.unpackBinary(field.type, field.flags & field_flags.UNSIGNED)); + var value = r.unpackBinary(field.type, field.flags & field_flags.UNSIGNED); + if(this.client.charset) + value = this.client.charset.convertFromBytes(value); this.store_column(row, field, value, use_hash); } else { this.store_column(row, field, null, use_hash); From 4478b2332f2c1d3b1e66f6fa033fafac32327dc2 Mon Sep 17 00:00:00 2001 From: cnx Date: Sun, 15 Apr 2012 16:25:21 +0800 Subject: [PATCH 6/7] add insert multibytes characters --- lib/mysql-native/commands/execute.js | 3 +++ test/insert.js | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/insert.js diff --git a/lib/mysql-native/commands/execute.js b/lib/mysql-native/commands/execute.js index 1c48a20..de27646 100644 --- a/lib/mysql-native/commands/execute.js +++ b/lib/mysql-native/commands/execute.js @@ -96,6 +96,9 @@ function execPrepared(sql, parameters) if(typeof parameters[i] == "boolean" || (parameters[i] instanceof Array && parameters[i].every(function(x){return typeof x == 'boolean';}))){ packet.lcbits(parameters[i]); } + if(this.client.charset){ + parameters[i] = this.client.charset.convertToBytes(parameters[i]); + } packet.lcstring(parameters[i].toString()) } } diff --git a/test/insert.js b/test/insert.js new file mode 100644 index 0000000..6f8db26 --- /dev/null +++ b/test/insert.js @@ -0,0 +1,18 @@ +var test=require('./insert.test.js'); +var mysql=require('./common.js'); +var db=mysql.createConnection(); + +test['test insert quoted'](); +test['test insert quoted multiline'](); +test['test insert multibyte characters'](); +test['test insert multibyte using execute'](); + +setTimeout(function(){ + db.query("select * from tbl").on('row',function(r){ + console.log(r); + }); +},3000); + +setTimeout(function(){ + process.exit(0); +},4500); From fc9fcb191e8f8ab6ca35823bb120a298ddc7df6b Mon Sep 17 00:00:00 2001 From: cnx Date: Thu, 3 May 2012 23:38:07 +0800 Subject: [PATCH 7/7] Update lib/mysql-native/commands/query.js --- lib/mysql-native/commands/query.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mysql-native/commands/query.js b/lib/mysql-native/commands/query.js index 77853fd..b57d563 100644 --- a/lib/mysql-native/commands/query.js +++ b/lib/mysql-native/commands/query.js @@ -102,7 +102,7 @@ module.exports = function(sql) start: function() { this.stmt = sql; - var charset = this.connection.charset; + var charset = this.client.charset; this.write( new writer().add("\u0003").add( charset ? charset.convertToBytes( this.stmt ) : this.stmt )); return 'rs_ok'; },