Merge pull request #38 from dgsan/master

Cleaned up and added tests for collation support.
This commit is contained in:
dgsan 2013-06-13 10:09:11 -07:00
commit aef99ca919
5 changed files with 151 additions and 12 deletions

View File

@ -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;

View File

@ -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",

114
test/connection.test.js Normal file
View File

@ -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);
};

View File

@ -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;
}; };

View File

@ -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);
}); });