Merge pull request #38 from dgsan/master
Cleaned up and added tests for collation support.
This commit is contained in:
commit
aef99ca919
12
lib/mysql.js
12
lib/mysql.js
|
@ -9,8 +9,13 @@ exports.initialize = function initializeSchema(schema, callback) {
|
||||||
|
|
||||||
var s = schema.settings;
|
var s = schema.settings;
|
||||||
|
|
||||||
s.collation = (s.collation || 'utf8mb4_general_ci');
|
if (s.collation) {
|
||||||
s.charset = (s.charset || 'utf8mb4');
|
s.charset = s.collation.substr(0,s.collation.indexOf('_')); // Charset should be first 'chunk' of collation.
|
||||||
|
} else {
|
||||||
|
s.collation = 'utf8mb4_general_ci';
|
||||||
|
s.charset = 'utf8mb4';
|
||||||
|
}
|
||||||
|
|
||||||
s.supportBigNumbers = (s.supportBigNumbers || false);
|
s.supportBigNumbers = (s.supportBigNumbers || false);
|
||||||
s.timezone = (s.timezone || 'local');
|
s.timezone = (s.timezone || 'local');
|
||||||
|
|
||||||
|
@ -22,7 +27,7 @@ exports.initialize = function initializeSchema(schema, callback) {
|
||||||
timezone: s.timezone,
|
timezone: s.timezone,
|
||||||
debug: s.debug,
|
debug: s.debug,
|
||||||
socketPath: s.socketPath,
|
socketPath: s.socketPath,
|
||||||
charset: s.collation, // Correct by docs despite seeming odd.
|
charset: s.collation.toUpperCase(), // Correct by docs despite seeming odd.
|
||||||
supportBigNumbers: s.supportBigNumbers
|
supportBigNumbers: s.supportBigNumbers
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -42,7 +47,6 @@ exports.initialize = function initializeSchema(schema, callback) {
|
||||||
var q = 'CREATE DATABASE ' + dbName + ' CHARACTER SET ' + charset + ' COLLATE ' + collation;
|
var q = 'CREATE DATABASE ' + dbName + ' CHARACTER SET ' + charset + ' COLLATE ' + collation;
|
||||||
schema.client.query(q, function (error) {
|
schema.client.query(q, function (error) {
|
||||||
if (!error) {
|
if (!error) {
|
||||||
console.log('go');
|
|
||||||
schema.client.query('USE ' + s.database, callback);
|
schema.client.query('USE ' + s.database, callback);
|
||||||
} else {
|
} else {
|
||||||
throw error;
|
throw error;
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"coffee-script": "latest",
|
"coffee-script": "latest",
|
||||||
"should": "~1.2.2",
|
"should": "~1.2.2",
|
||||||
"mocha": "~1.8.2"
|
"mocha": "~1.8.2",
|
||||||
|
"semicov": "*"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
var should = require('./init.js');
|
||||||
|
var assert = require('assert');
|
||||||
|
var Schema = require('jugglingdb').Schema;
|
||||||
|
|
||||||
|
var db, settings, adapter, DummyModel, odb;
|
||||||
|
|
||||||
|
describe('migrations', function() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
before(function() {
|
||||||
|
require('./init.js');
|
||||||
|
|
||||||
|
odb = getSchema({collation: 'utf8mb4_general_ci'});
|
||||||
|
db = odb;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should use utf8mb4 charset', function(done) {
|
||||||
|
|
||||||
|
var test_set = /utf8mb4/;
|
||||||
|
var test_collo = /utf8mb4_general_ci/;
|
||||||
|
var test_set_str = 'utf8mb4';
|
||||||
|
var test_set_collo = 'utf8mb4_general_ci';
|
||||||
|
charsetTest(test_set, test_collo, test_set_str, test_set_collo, done);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should disconnect first db', function(done) {
|
||||||
|
db.client.end(function(){
|
||||||
|
odb = getSchema();
|
||||||
|
done()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should use latin1 charset', function(done) {
|
||||||
|
|
||||||
|
var test_set = /latin1/;
|
||||||
|
var test_collo = /latin1_general_ci/;
|
||||||
|
var test_set_str = 'latin1';
|
||||||
|
var test_set_collo = 'latin1_general_ci';
|
||||||
|
charsetTest(test_set, test_collo, test_set_str, test_set_collo, done);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should drop db and disconnect all', function(done) {
|
||||||
|
db.adapter.query('DROP DATABASE IF EXISTS ' + db.settings.database, function(err) {
|
||||||
|
db.client.end(function(){
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function charsetTest(test_set, test_collo, test_set_str, test_set_collo, done){
|
||||||
|
|
||||||
|
query('DROP DATABASE IF EXISTS ' + odb.settings.database, function(err) {
|
||||||
|
assert.ok(!err);
|
||||||
|
odb.client.end(function(){
|
||||||
|
|
||||||
|
db = getSchema({collation: test_set_collo});
|
||||||
|
DummyModel = db.define('DummyModel', {string: String});
|
||||||
|
db.automigrate(function(){
|
||||||
|
var q = 'SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ' + db.client.escape(db.settings.database) + ' LIMIT 1';
|
||||||
|
db.client.query(q, function(err, r) {
|
||||||
|
assert.ok(!err);
|
||||||
|
assert.ok(r[0].DEFAULT_COLLATION_NAME.match(test_collo));
|
||||||
|
db.client.query('SHOW VARIABLES LIKE "character_set%"', function(err, r){
|
||||||
|
assert.ok(!err);
|
||||||
|
var hit_all = 0;
|
||||||
|
for (var result in r) {
|
||||||
|
hit_all += matchResult(r[result], 'character_set_connection', test_set);
|
||||||
|
hit_all += matchResult(r[result], 'character_set_database', test_set);
|
||||||
|
hit_all += matchResult(r[result], 'character_set_results', test_set);
|
||||||
|
hit_all += matchResult(r[result], 'character_set_client', test_set);
|
||||||
|
}
|
||||||
|
assert.equal(hit_all, 4);
|
||||||
|
});
|
||||||
|
db.client.query('SHOW VARIABLES LIKE "collation%"', function(err, r){
|
||||||
|
assert.ok(!err);
|
||||||
|
var hit_all = 0;
|
||||||
|
for (var result in r) {
|
||||||
|
hit_all += matchResult(r[result], 'collation_connection', test_set);
|
||||||
|
hit_all += matchResult(r[result], 'collation_database', test_set);
|
||||||
|
}
|
||||||
|
assert.equal(hit_all, 2);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function matchResult(result, variable_name, match) {
|
||||||
|
if(result.Variable_name == variable_name){
|
||||||
|
assert.ok(result.Value.match(match));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var query = function (sql, cb) {
|
||||||
|
odb.adapter.query(sql, cb);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
20
test/init.js
20
test/init.js
|
@ -2,11 +2,23 @@ module.exports = require('should');
|
||||||
|
|
||||||
var Schema = require('jugglingdb').Schema;
|
var Schema = require('jugglingdb').Schema;
|
||||||
|
|
||||||
global.getSchema = function() {
|
global.getConfig = function(options) {
|
||||||
var db = new Schema(require('../'), {
|
|
||||||
|
var dbConf = {
|
||||||
database: 'myapp_test',
|
database: 'myapp_test',
|
||||||
username: 'root'
|
username: 'root'
|
||||||
});
|
};
|
||||||
// db.log = function (a) { console.log(a); };
|
|
||||||
|
if (options) {
|
||||||
|
for (var el in options) {
|
||||||
|
dbConf[el] = options[el]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dbConf;
|
||||||
|
}
|
||||||
|
|
||||||
|
global.getSchema = function(options) {
|
||||||
|
var db = new Schema(require('../'), getConfig(options));
|
||||||
return db;
|
return db;
|
||||||
};
|
};
|
||||||
|
|
|
@ -331,6 +331,9 @@ describe('migrations', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
function setup(done) {
|
function setup(done) {
|
||||||
|
|
||||||
|
require('./init.js');
|
||||||
|
|
||||||
db = getSchema();
|
db = getSchema();
|
||||||
|
|
||||||
UserData = db.define('UserData', {
|
UserData = db.define('UserData', {
|
||||||
|
@ -380,8 +383,13 @@ var blankDatabase = function (db, cb) {
|
||||||
var cs = db.settings.charset;
|
var cs = db.settings.charset;
|
||||||
var co = db.settings.collation;
|
var co = db.settings.collation;
|
||||||
query('DROP DATABASE IF EXISTS ' + dbn, function(err) {
|
query('DROP DATABASE IF EXISTS ' + dbn, function(err) {
|
||||||
var q = 'CREATE DATABASE ' + dbn + ' CHARACTER SET ' + cs + ' COLLATE ' + co;
|
var q = 'CREATE DATABASE ' + dbn;
|
||||||
// console.log(q);
|
if(cs){
|
||||||
|
q += ' CHARACTER SET ' + cs;
|
||||||
|
}
|
||||||
|
if(co){
|
||||||
|
q += ' COLLATE ' + co;
|
||||||
|
}
|
||||||
query(q, function(err) {
|
query(q, function(err) {
|
||||||
query('USE '+ dbn, cb);
|
query('USE '+ dbn, cb);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue