不要怂,就是干,撸起袖子干!

Commit 8d161a59 by Mick Hansen

refactor(connections): fix maria connections, fix more tests

1 parent 546b90be
"use strict"; "use strict";
var Pooling = require('generic-pool') var Pooling = require('generic-pool')
, Promise = require('./promise') , Promise = require('../../promise')
, _ = require('lodash') , _ = require('lodash')
, defaultPoolingConfig = { , defaultPoolingConfig = {
max: 10, max: 5,
min: 0, min: 0,
idle: 10000, idle: 10000,
handleDisconnects: false handleDisconnects: false
} }
, ConnectionManager; , ConnectionManager;
ConnectionManager = function(sequelize) { ConnectionManager = function(dialect, sequelize) {
var config = sequelize.config var config = sequelize.config
, self = this; , self = this;
this.sequelize = sequelize;
this.config = config; this.config = config;
this.dialect = sequelize.dialect; this.dialect = dialect;
if (config.pool) { if (config.pool) {
config.pool = _.extend({}, config.pool); // Make sure we don't modify the existing config object (user might re-use it) config.pool = _.extend({}, config.pool); // Make sure we don't modify the existing config object (user might re-use it)
...@@ -160,6 +161,7 @@ ConnectionManager = function(sequelize) { ...@@ -160,6 +161,7 @@ ConnectionManager = function(sequelize) {
ConnectionManager.prototype.getConnection = function(options) { ConnectionManager.prototype.getConnection = function(options) {
var self = this; var self = this;
options = options || {}; options = options || {};
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
self.pool.acquire(function(err, connection) { self.pool.acquire(function(err, connection) {
if (err) return reject(err); if (err) return reject(err);
...@@ -169,6 +171,7 @@ ConnectionManager.prototype.getConnection = function(options) { ...@@ -169,6 +171,7 @@ ConnectionManager.prototype.getConnection = function(options) {
}; };
ConnectionManager.prototype.releaseConnection = function(connection) { ConnectionManager.prototype.releaseConnection = function(connection) {
var self = this; var self = this;
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
self.pool.release(connection); self.pool.release(connection);
resolve(); resolve();
......
"use strict"; "use strict";
var ConnectionManager var AbstractConnectionManager = require('../abstract/connection-manager')
, ConnectionManager
, Utils = require('../../utils')
, Promise = require('../../promise'); , Promise = require('../../promise');
ConnectionManager = function(dialect, sequelize) { ConnectionManager = function(dialect, sequelize) {
AbstractConnectionManager.call(this, dialect, sequelize);
try { try {
this.lib = require(sequelize.config.dialectModulePath || 'mariasql'); this.lib = require(sequelize.config.dialectModulePath || 'mariasql');
} catch (err) { } catch (err) {
...@@ -10,15 +14,52 @@ ConnectionManager = function(dialect, sequelize) { ...@@ -10,15 +14,52 @@ ConnectionManager = function(dialect, sequelize) {
} }
}; };
Utils._.extend(ConnectionManager.prototype, AbstractConnectionManager.prototype);
ConnectionManager.prototype.connect = function(config) { ConnectionManager.prototype.connect = function(config) {
var self = this;
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
var connectionConfig = {
host: config.host,
port: config.port,
user: config.username,
password: config.password,
db: config.database,
metadata: true
};
if (config.dialectOptions) {
Object.keys(config.dialectOptions).forEach(function(key) {
connectionConfig[key] = config.dialectOptions[key];
});
}
if (connectionConfig.unixSocket) {
delete connectionConfig.host;
delete connectionConfig.port;
}
var connection = new self.lib();
connection.connect(connectionConfig);
connection.on('error', function(err) {
return reject(err);
});
connection.on('connect', function() {
return resolve(connection);
});
}).tap(function (connection) {
connection.query("SET time_zone = '+0:00'");
}); });
}; };
ConnectionManager.prototype.disconnect = function(connection) { ConnectionManager.prototype.disconnect = function(connection) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
connection.end();
resolve();
}); });
}; };
ConnectionManager.prototype.validate = function(connection) {
return connection && connection.state !== 'disconnected';
};
module.exports = ConnectionManager; module.exports = ConnectionManager;
\ No newline at end of file
"use strict"; "use strict";
var ConnectionManager var AbstractConnectionManager = require('../abstract/connection-manager')
, ConnectionManager
, Utils = require('../../utils')
, Promise = require('../../promise'); , Promise = require('../../promise');
ConnectionManager = function(dialect, sequelize) { ConnectionManager = function(dialect, sequelize) {
AbstractConnectionManager.call(this, dialect, sequelize);
this.sequelize = sequelize;
this.sequelize.config.port = this.sequelize.config.port || 3306;
try { try {
this.lib = require(sequelize.config.dialectModulePath || 'mysql'); this.lib = require(sequelize.config.dialectModulePath || 'mysql');
} catch (err) { } catch (err) {
...@@ -10,6 +16,8 @@ ConnectionManager = function(dialect, sequelize) { ...@@ -10,6 +16,8 @@ ConnectionManager = function(dialect, sequelize) {
} }
}; };
Utils._.extend(ConnectionManager.prototype, AbstractConnectionManager.prototype);
ConnectionManager.prototype.connect = function(config) { ConnectionManager.prototype.connect = function(config) {
var self = this; var self = this;
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
......
"use strict"; "use strict";
var ConnectionManager var AbstractConnectionManager = require('../abstract/connection-manager')
, ConnectionManager
, Utils = require('../../utils')
, Promise = require('../../promise'); , Promise = require('../../promise');
ConnectionManager = function(dialect, sequelize) { ConnectionManager = function(dialect, sequelize) {
AbstractConnectionManager.call(this, dialect, sequelize);
this.sequelize = sequelize; this.sequelize = sequelize;
this.sequelize.config.port = this.sequelize.config.port || 5432; this.sequelize.config.port = this.sequelize.config.port || 5432;
try { try {
...@@ -12,6 +16,8 @@ ConnectionManager = function(dialect, sequelize) { ...@@ -12,6 +16,8 @@ ConnectionManager = function(dialect, sequelize) {
} }
}; };
Utils._.extend(ConnectionManager.prototype, AbstractConnectionManager.prototype);
ConnectionManager.prototype.connect = function(config) { ConnectionManager.prototype.connect = function(config) {
var self = this; var self = this;
......
"use strict"; "use strict";
var ConnectionManager var AbstractConnectionManager = require('../abstract/connection-manager')
, ConnectionManager
, Utils = require('../../utils')
, Promise = require('../../promise'); , Promise = require('../../promise');
ConnectionManager = function(dialect, sequelize) { ConnectionManager = function(dialect, sequelize) {
this.sequelize = sequelize; this.sequelize = sequelize;
this.config = sequelize.config;
this.dialect = dialect;
this.connection = null;
try { try {
this.lib = require(sequelize.config.dialectModulePath || 'sqlite3').verbose(); this.lib = require(sequelize.config.dialectModulePath || 'sqlite3').verbose();
...@@ -12,15 +17,20 @@ ConnectionManager = function(dialect, sequelize) { ...@@ -12,15 +17,20 @@ ConnectionManager = function(dialect, sequelize) {
} }
}; };
ConnectionManager.prototype.connect = function(config) { Utils._.extend(ConnectionManager.prototype, AbstractConnectionManager.prototype);
ConnectionManager.prototype.getConnection = function(options) {
var self = this; var self = this;
if (self.connection) return Promise.resolve(self.connection);
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
var connection = new self.lib.Database(self.sequelize.options.storage || ':memory:', function(err) { self.connection = new self.lib.Database(self.sequelize.options.storage || ':memory:', function(err) {
if (err) { if (err) {
if (err.code === 'SQLITE_CANTOPEN') return reject('Failed to find SQL server. Please double check your settings.'); if (err.code === 'SQLITE_CANTOPEN') return reject('Failed to find SQL server. Please double check your settings.');
return reject(err); return reject(err);
} }
resolve(connection); resolve(self.connection);
}); });
}).tap(function (connection) { }).tap(function (connection) {
if (self.sequelize.options.foreignKeys !== false) { if (self.sequelize.options.foreignKeys !== false) {
...@@ -30,13 +40,9 @@ ConnectionManager.prototype.connect = function(config) { ...@@ -30,13 +40,9 @@ ConnectionManager.prototype.connect = function(config) {
} }
}); });
}; };
ConnectionManager.prototype.disconnect = function(connection) {
return new Promise(function (resolve, reject) { ConnectionManager.prototype.releaseConnection = function(connection) {
connection.close(function (err) { // no-op
if (err) return reject(err);
resolve();
});
});
}; };
module.exports = ConnectionManager; module.exports = ConnectionManager;
\ No newline at end of file
...@@ -16,5 +16,6 @@ SqliteDialect.prototype.supports = _.defaults({ ...@@ -16,5 +16,6 @@ SqliteDialect.prototype.supports = _.defaults({
}, Abstract.prototype.supports); }, Abstract.prototype.supports);
SqliteDialect.prototype.Query = Query; SqliteDialect.prototype.Query = Query;
SqliteDialect.prototype.name = 'sqlite';
module.exports = SqliteDialect; module.exports = SqliteDialect;
\ No newline at end of file
...@@ -7,7 +7,6 @@ var url = require('url') ...@@ -7,7 +7,6 @@ var url = require('url')
, DataTypes = require('./data-types') , DataTypes = require('./data-types')
, ModelManager = require('./model-manager') , ModelManager = require('./model-manager')
, QueryInterface = require('./query-interface') , QueryInterface = require('./query-interface')
, ConnectionManager = require('./connection-manager')
, Transaction = require('./transaction') , Transaction = require('./transaction')
, QueryTypes = require('./query-types') , QueryTypes = require('./query-types')
, sequelizeErrors = require('./errors') , sequelizeErrors = require('./errors')
...@@ -122,7 +121,6 @@ module.exports = (function() { ...@@ -122,7 +121,6 @@ module.exports = (function() {
sync: {}, sync: {},
logging: console.log, logging: console.log,
omitNull: false, omitNull: false,
queue: true,
native: false, native: false,
replication: false, replication: false,
ssl: undefined, ssl: undefined,
...@@ -170,7 +168,7 @@ module.exports = (function() { ...@@ -170,7 +168,7 @@ module.exports = (function() {
*/ */
this.models = {}; this.models = {};
this.modelManager = this.daoFactoryManager = new ModelManager(this); this.modelManager = this.daoFactoryManager = new ModelManager(this);
this.connectionManager = new ConnectionManager(this); this.connectionManager = this.dialect.connectionManager;
this.importCache = {}; this.importCache = {};
}; };
......
...@@ -99,12 +99,10 @@ describe(Support.getTestDialectTeaser("Sequelize"), function () { ...@@ -99,12 +99,10 @@ describe(Support.getTestDialectTeaser("Sequelize"), function () {
if (dialect === 'mariadb') { if (dialect === 'mariadb') {
expect(err.message).to.match(/Access denied for user/) expect(err.message).to.match(/Access denied for user/)
} else if (dialect === 'postgres') { } else if (dialect === 'postgres') {
// When the test is run with only it produces: expect(
// Error: Error: Failed to authenticate for PostgresSQL. Please double check your settings. err.message.match(/Failed to authenticate for PostgresSQL/) ||
expect(err.message).to.match(/Failed to authenticate for PostgresSQL/) err.message.match(/invalid port number/)
// When its run with all the other tests it produces: ).to.be.ok
// Error: invalid port number: "99999"
//expect(err.message).to.match(/invalid port number/)
} else { } else {
expect(err.message).to.match(/Failed to authenticate/) expect(err.message).to.match(/Failed to authenticate/)
} }
......
...@@ -37,7 +37,7 @@ var Support = { ...@@ -37,7 +37,7 @@ var Support = {
if (dialect === 'sqlite') { if (dialect === 'sqlite') {
var options = Sequelize.Utils._.extend({}, sequelize.options, { storage: path.join(__dirname, 'tmp', 'db.sqlite') }) var options = Sequelize.Utils._.extend({}, sequelize.options, { storage: path.join(__dirname, 'tmp', 'db.sqlite') })
, _sequelize = new Sequelize(sequelize.config.datase, null, null, options) , _sequelize = new Sequelize(sequelize.config.database, null, null, options)
_sequelize.sync({ force: true }).success(function() { callback(_sequelize) }) _sequelize.sync({ force: true }).success(function() { callback(_sequelize) })
} else { } else {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!