diff --git a/lib/discovery.js b/lib/discovery.js index a3c2bf0..087cbab 100644 --- a/lib/discovery.js +++ b/lib/discovery.js @@ -319,7 +319,7 @@ function mixinDiscovery(MySQL) { } else { return 'String'; } - + break; case 'VARCHAR': case 'TINYTEXT': case 'MEDIUMTEXT': @@ -343,6 +343,7 @@ function mixinDiscovery(MySQL) { case 'YEAR': case 'FLOAT': case 'DOUBLE': + case 'BIGINT': return 'Number'; case 'DATE': case 'TIMESTAMP': diff --git a/lib/mysql.js b/lib/mysql.js index 7033a80..f132ffa 100644 --- a/lib/mysql.js +++ b/lib/mysql.js @@ -304,7 +304,12 @@ MySQL.prototype.toDatabase = function (prop, val) { if (prop.type.name === 'GeoPoint') { return val ? 'Point(' + val.lat + ',' + val.lng + ')' : 'NULL'; } - if (typeof prop.type === 'function') return this.client.escape(prop.type(val)); + if (prop.type === Object) { + return this.client.escape(val); + } + if (typeof prop.type === 'function') { + return this.client.escape(prop.type(val)); + } return this.client.escape(val.toString()); }; @@ -445,6 +450,12 @@ MySQL.prototype._buildWhere = function (model, conds) { case 'neq': sqlCond += ' != '; break; + case 'like': + sqlCond += ' LIKE '; + break; + case 'nlike': + sqlCond += ' NOT LIKE '; + break; } sqlCond += (condType === 'inq' || condType === 'nin') ? '(' + val + ')' : val; cs.push(sqlCond); @@ -544,10 +555,10 @@ MySQL.prototype.destroyAll = function destroyAll(model, where, callback) { where = undefined; } this.query('DELETE FROM ' - + this.tableEscaped(model) + ' ' + this.buildWhere(model, where || {}), + + this.tableEscaped(model) + ' ' + this.buildWhere(model, where || {}), function (err, data) { callback && callback(err, data); - }.bind(this)); + }.bind(this)); }; /** @@ -962,8 +973,13 @@ function stringOptionsByType(p, dt) { switch (dt.toLowerCase()) { default: case 'varchar': + // The maximum length for an ID column is 1000 bytes + var len = p.limit || ((p.type !== String) ? 32768 : p.id ? 255: 1024); + dt += '(' + len + ')'; + break; case 'char': - dt += '(' + (p.limit || 255) + ')'; + len = p.limit || 255; + dt += '(' + len + ')'; break; case 'text': diff --git a/package.json b/package.json index 2f366ef..df3e715 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "loopback-connector-mysql", - "version": "1.2.1", + "version": "1.2.2", "description": "MySQL connector for loopback-datasource-juggler", "main": "index.js", "scripts": { diff --git a/test/datatypes.test.js b/test/datatypes.test.js index 71673b7..c754ae7 100644 --- a/test/datatypes.test.js +++ b/test/datatypes.test.js @@ -49,6 +49,24 @@ describe('MySQL specific datatypes', function () { }); }); + it('should create a model instance with object/json types', function (done) { + var note = {a: 1, b: '2'}; + var extras = {c: 3, d: '4'}; + var em = EnumModel.create({animal: ANIMAL_ENUM.DOG, condition: 'sleepy', + mood: 'happy', note: note, extras: extras}, function (err, obj) { + assert.ok(!err); + assert.equal(obj.condition, 'sleepy'); + EnumModel.findOne({where: {animal: ANIMAL_ENUM.DOG}}, function (err, found) { + assert.ok(!err); + assert.equal(found.mood, 'happy'); + assert.equal(found.animal, ANIMAL_ENUM.DOG); + assert.deepEqual(found.note, note); + assert.deepEqual(found.extras, extras); + done(); + }); + }); + }); + it('should disconnect when done', function (done) { db.disconnect(); done() @@ -67,7 +85,9 @@ function setup(done) { EnumModel = db.define('EnumModel', { animal: { type: ANIMAL_ENUM, null: false }, condition: { type: db.EnumFactory('hungry', 'sleepy', 'thirsty') }, - mood: { type: db.EnumFactory('angry', 'happy', 'sad') } + mood: { type: db.EnumFactory('angry', 'happy', 'sad') }, + note: Object, + extras: 'JSON' }); blankDatabase(db, done); diff --git a/test/migration.test.js b/test/migration.test.js index 4ae80ed..3746346 100644 --- a/test/migration.test.js +++ b/test/migration.test.js @@ -26,14 +26,14 @@ describe('migrations', function () { Extra: 'auto_increment' }, email: { Field: 'email', - Type: 'varchar(255)', + Type: 'varchar(1024)', Null: 'NO', Key: 'MUL', Default: null, Extra: '' }, name: { Field: 'name', - Type: 'varchar(255)', + Type: 'varchar(1024)', Null: 'YES', Key: '', Default: null, @@ -74,7 +74,6 @@ describe('migrations', function () { it('UserData should have correct indexes', function (done) { // Note: getIndexes truncates multi-key indexes to the first member. Hence index1 is correct. getIndexes('UserData', function (err, fields) { - // console.log('....', fields); assert.deepEqual(fields, { PRIMARY: { Table: 'UserData', Non_unique: 0, Key_name: 'PRIMARY', @@ -94,7 +93,7 @@ describe('migrations', function () { Column_name: 'email', Collation: 'A', Cardinality: null, - Sub_part: null, + Sub_part: 333, Packed: null, Null: '', Index_type: 'BTREE', @@ -106,7 +105,7 @@ describe('migrations', function () { Column_name: 'email', Collation: 'A', Cardinality: null, - Sub_part: null, + Sub_part: 333, Packed: null, Null: '', Index_type: 'BTREE',