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;
s.collation = (s.collation || 'utf8mb4_general_ci');
s.charset = (s.charset || 'utf8mb4');
if (s.collation) {
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.timezone = (s.timezone || 'local');
@ -22,7 +27,7 @@ exports.initialize = function initializeSchema(schema, callback) {
timezone: s.timezone,
debug: s.debug,
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
});
@ -42,7 +47,6 @@ exports.initialize = function initializeSchema(schema, callback) {
var q = 'CREATE DATABASE ' + dbName + ' CHARACTER SET ' + charset + ' COLLATE ' + collation;
schema.client.query(q, function (error) {
if (!error) {
console.log('go');
schema.client.query('USE ' + s.database, callback);
} else {
throw error;

View File

@ -13,7 +13,8 @@
"devDependencies": {
"coffee-script": "latest",
"should": "~1.2.2",
"mocha": "~1.8.2"
"mocha": "~1.8.2",
"semicov": "*"
},
"repository": {
"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;
global.getSchema = function() {
var db = new Schema(require('../'), {
global.getConfig = function(options) {
var dbConf = {
database: 'myapp_test',
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;
};

View File

@ -2,7 +2,7 @@ var should = require('./init.js');
var assert = require('assert');
var Schema = require('jugglingdb').Schema;
var db, UserData, StringData, NumberData, DateData;
var db, UserData, StringData, NumberData, DateData;
describe('migrations', function() {
@ -331,6 +331,9 @@ describe('migrations', function() {
});
function setup(done) {
require('./init.js');
db = getSchema();
UserData = db.define('UserData', {
@ -380,8 +383,13 @@ var blankDatabase = function (db, cb) {
var cs = db.settings.charset;
var co = db.settings.collation;
query('DROP DATABASE IF EXISTS ' + dbn, function(err) {
var q = 'CREATE DATABASE ' + dbn + ' CHARACTER SET ' + cs + ' COLLATE ' + co;
// console.log(q);
var q = 'CREATE DATABASE ' + dbn;
if(cs){
q += ' CHARACTER SET ' + cs;
}
if(co){
q += ' COLLATE ' + co;
}
query(q, function(err) {
query('USE '+ dbn, cb);
});