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

Commit 6d116f87 by Sushant Committed by GitHub

fix(pool): show deprecation when engine is not supported (#12218)

1 parent bc4fe8a3
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
## v6-beta ## v6-beta
| Engine | Minimum supported version | | Engine | Minimum supported version |
| ------------ | :------------: | | :------------: | :------------: |
| Postgre | [9.5 ](https://www.postgresql.org/docs/9.5/ ) | | Postgre | [9.5 ](https://www.postgresql.org/docs/9.5/ ) |
| MySQL | [5.7](https://dev.mysql.com/doc/refman/5.7/en/) | | MySQL | [5.7](https://dev.mysql.com/doc/refman/5.7/en/) |
| MariaDB | [10.1](https://mariadb.com/kb/en/changes-improvements-in-mariadb-101/) | | MariaDB | [10.1](https://mariadb.com/kb/en/changes-improvements-in-mariadb-101/) |
| Microsoft SQL | ? | | Microsoft SQL | `12.0.2000` |
| SQLite | [3.0](https://www.sqlite.org/version3.html) | SQLite | [3.0](https://www.sqlite.org/version3.html)
...@@ -9,7 +9,7 @@ const momentTz = require('moment-timezone'); ...@@ -9,7 +9,7 @@ const momentTz = require('moment-timezone');
const moment = require('moment'); const moment = require('moment');
const { logger } = require('./utils/logger'); const { logger } = require('./utils/logger');
const warnings = {}; const warnings = {};
const { classToInvokable } = require('./utils/classToInvokable'); const { classToInvokable } = require('./utils/class-to-invokable');
const { joinSQLFragments } = require('./utils/join-sql-fragments'); const { joinSQLFragments } = require('./utils/join-sql-fragments');
class ABSTRACT { class ABSTRACT {
......
...@@ -5,6 +5,7 @@ const _ = require('lodash'); ...@@ -5,6 +5,7 @@ const _ = require('lodash');
const semver = require('semver'); const semver = require('semver');
const errors = require('../../errors'); const errors = require('../../errors');
const { logger } = require('../../utils/logger'); const { logger } = require('../../utils/logger');
const deprecations = require('../../utils/deprecations');
const debug = logger.debugContext('pool'); const debug = logger.debugContext('pool');
/** /**
...@@ -260,7 +261,12 @@ class ConnectionManager { ...@@ -260,7 +261,12 @@ class ConnectionManager {
const parsedVersion = _.get(semver.coerce(version), 'version') || version; const parsedVersion = _.get(semver.coerce(version), 'version') || version;
this.sequelize.options.databaseVersion = semver.valid(parsedVersion) this.sequelize.options.databaseVersion = semver.valid(parsedVersion)
? parsedVersion ? parsedVersion
: this.defaultVersion; : this.dialect.defaultVersion;
}
if (semver.lt(this.sequelize.options.databaseVersion, this.dialect.defaultVersion)) {
deprecations.unsupportedEngine();
debug(`Unsupported database engine version ${this.sequelize.options.databaseVersion}`);
} }
this.versionPromise = null; this.versionPromise = null;
......
'use strict'; 'use strict';
const semver = require('semver');
const AbstractConnectionManager = require('../abstract/connection-manager'); const AbstractConnectionManager = require('../abstract/connection-manager');
const SequelizeErrors = require('../../errors'); const SequelizeErrors = require('../../errors');
const { logger } = require('../../utils/logger'); const { logger } = require('../../utils/logger');
...@@ -84,7 +85,8 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -84,7 +85,8 @@ class ConnectionManager extends AbstractConnectionManager {
try { try {
const connection = await this.lib.createConnection(connectionConfig); const connection = await this.lib.createConnection(connectionConfig);
this.sequelize.options.databaseVersion = connection.serverVersion(); this.sequelize.options.databaseVersion = semver.coerce(connection.serverVersion()).version;
debug('connection acquired'); debug('connection acquired');
connection.on('error', error => { connection.on('error', error => {
switch (error.code) { switch (error.code) {
......
...@@ -52,7 +52,7 @@ MariadbDialect.prototype.supports = _.merge( ...@@ -52,7 +52,7 @@ MariadbDialect.prototype.supports = _.merge(
REGEXP: true REGEXP: true
}); });
ConnectionManager.prototype.defaultVersion = '5.5.3'; MariadbDialect.prototype.defaultVersion = '10.1.44';
MariadbDialect.prototype.Query = Query; MariadbDialect.prototype.Query = Query;
MariadbDialect.prototype.QueryGenerator = QueryGenerator; MariadbDialect.prototype.QueryGenerator = QueryGenerator;
MariadbDialect.prototype.DataTypes = DataTypes; MariadbDialect.prototype.DataTypes = DataTypes;
......
...@@ -54,7 +54,7 @@ MssqlDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype. ...@@ -54,7 +54,7 @@ MssqlDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.
tmpTableTrigger: true tmpTableTrigger: true
}); });
ConnectionManager.prototype.defaultVersion = '12.0.2000'; // SQL Server 2014 Express MssqlDialect.prototype.defaultVersion = '12.0.2000'; // SQL Server 2014 Express
MssqlDialect.prototype.Query = Query; MssqlDialect.prototype.Query = Query;
MssqlDialect.prototype.name = 'mssql'; MssqlDialect.prototype.name = 'mssql';
MssqlDialect.prototype.TICK_CHAR = '"'; MssqlDialect.prototype.TICK_CHAR = '"';
......
...@@ -50,7 +50,7 @@ MysqlDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype. ...@@ -50,7 +50,7 @@ MysqlDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.
REGEXP: true REGEXP: true
}); });
ConnectionManager.prototype.defaultVersion = '5.6.0'; MysqlDialect.prototype.defaultVersion = '5.7.0';
MysqlDialect.prototype.Query = Query; MysqlDialect.prototype.Query = Query;
MysqlDialect.prototype.QueryGenerator = QueryGenerator; MysqlDialect.prototype.QueryGenerator = QueryGenerator;
MysqlDialect.prototype.DataTypes = DataTypes; MysqlDialect.prototype.DataTypes = DataTypes;
......
...@@ -132,7 +132,7 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -132,7 +132,7 @@ class ConnectionManager extends AbstractConnectionManager {
const version = semver.coerce(message.parameterValue).version; const version = semver.coerce(message.parameterValue).version;
this.sequelize.options.databaseVersion = semver.valid(version) this.sequelize.options.databaseVersion = semver.valid(version)
? version ? version
: this.defaultVersion; : this.dialect.defaultVersion;
} }
break; break;
case 'standard_conforming_strings': case 'standard_conforming_strings':
......
...@@ -61,7 +61,7 @@ PostgresDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototy ...@@ -61,7 +61,7 @@ PostgresDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototy
searchPath: true searchPath: true
}); });
ConnectionManager.prototype.defaultVersion = '9.4.0'; PostgresDialect.prototype.defaultVersion = '9.5.0';
PostgresDialect.prototype.Query = Query; PostgresDialect.prototype.Query = Query;
PostgresDialect.prototype.DataTypes = DataTypes; PostgresDialect.prototype.DataTypes = DataTypes;
PostgresDialect.prototype.name = 'postgres'; PostgresDialect.prototype.name = 'postgres';
......
...@@ -48,7 +48,7 @@ SqliteDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype ...@@ -48,7 +48,7 @@ SqliteDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype
JSON: true JSON: true
}); });
ConnectionManager.prototype.defaultVersion = '3.8.0'; SqliteDialect.prototype.defaultVersion = '3.8.0';
SqliteDialect.prototype.Query = Query; SqliteDialect.prototype.Query = Query;
SqliteDialect.prototype.DataTypes = DataTypes; SqliteDialect.prototype.DataTypes = DataTypes;
SqliteDialect.prototype.name = 'sqlite'; SqliteDialect.prototype.name = 'sqlite';
......
...@@ -10,7 +10,7 @@ const operatorsSet = new Set(Object.values(operators)); ...@@ -10,7 +10,7 @@ const operatorsSet = new Set(Object.values(operators));
let inflection = require('inflection'); let inflection = require('inflection');
exports.classToInvokable = require('./utils/classToInvokable').classToInvokable; exports.classToInvokable = require('./utils/class-to-invokable').classToInvokable;
exports.joinSQLFragments = require('./utils/join-sql-fragments').joinSQLFragments; exports.joinSQLFragments = require('./utils/join-sql-fragments').joinSQLFragments;
function useInflection(_inflection) { function useInflection(_inflection) {
......
...@@ -9,3 +9,4 @@ exports.noTrueLogging = deprecate(noop, 'The logging-option should be either a f ...@@ -9,3 +9,4 @@ exports.noTrueLogging = deprecate(noop, 'The logging-option should be either a f
exports.noStringOperators = deprecate(noop, 'String based operators are deprecated. Please use Symbol based operators for better security, read more at https://sequelize.org/master/manual/querying.html#operators', 'SEQUELIZE0003'); exports.noStringOperators = deprecate(noop, 'String based operators are deprecated. Please use Symbol based operators for better security, read more at https://sequelize.org/master/manual/querying.html#operators', 'SEQUELIZE0003');
exports.noBoolOperatorAliases = deprecate(noop, 'A boolean value was passed to options.operatorsAliases. This is a no-op with v5 and should be removed.', 'SEQUELIZE0004'); exports.noBoolOperatorAliases = deprecate(noop, 'A boolean value was passed to options.operatorsAliases. This is a no-op with v5 and should be removed.', 'SEQUELIZE0004');
exports.noDoubleNestedGroup = deprecate(noop, 'Passing a double nested nested array to `group` is unsupported and will be removed in v6.', 'SEQUELIZE0005'); exports.noDoubleNestedGroup = deprecate(noop, 'Passing a double nested nested array to `group` is unsupported and will be removed in v6.', 'SEQUELIZE0005');
exports.unsupportedEngine = deprecate(noop, 'This database engine version is not supported, please update your database server. More information https://github.com/sequelize/sequelize/blob/master/ENGINE.md', 'SEQUELIZE0006');
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
const chai = require('chai'), const chai = require('chai'),
expect = chai.expect, expect = chai.expect,
deprecations = require('../../../../lib/utils/deprecations'),
Support = require('../../support'), Support = require('../../support'),
sinon = require('sinon'), sinon = require('sinon'),
Config = require('../../../config/config'), Config = require('../../../config/config'),
...@@ -15,7 +16,7 @@ const poolEntry = { ...@@ -15,7 +16,7 @@ const poolEntry = {
pool: {} pool: {}
}; };
describe('Connection Manager', () => { describe(Support.getTestDialectTeaser('Connection Manager'), () => {
let sandbox; let sandbox;
beforeEach(() => { beforeEach(() => {
...@@ -31,7 +32,7 @@ describe('Connection Manager', () => { ...@@ -31,7 +32,7 @@ describe('Connection Manager', () => {
replication: null replication: null
}; };
const sequelize = Support.createSequelizeInstance(options); const sequelize = Support.createSequelizeInstance(options);
const connectionManager = new ConnectionManager(Support.getTestDialect(), sequelize); const connectionManager = new ConnectionManager(sequelize.dialect, sequelize);
connectionManager.initPools(); connectionManager.initPools();
expect(connectionManager.pool).to.be.instanceOf(Pool); expect(connectionManager.pool).to.be.instanceOf(Pool);
...@@ -47,7 +48,7 @@ describe('Connection Manager', () => { ...@@ -47,7 +48,7 @@ describe('Connection Manager', () => {
} }
}; };
const sequelize = Support.createSequelizeInstance(options); const sequelize = Support.createSequelizeInstance(options);
const connectionManager = new ConnectionManager(Support.getTestDialect(), sequelize); const connectionManager = new ConnectionManager(sequelize.dialect, sequelize);
connectionManager.initPools(); connectionManager.initPools();
expect(connectionManager.pool.read).to.be.instanceOf(Pool); expect(connectionManager.pool.read).to.be.instanceOf(Pool);
...@@ -71,7 +72,7 @@ describe('Connection Manager', () => { ...@@ -71,7 +72,7 @@ describe('Connection Manager', () => {
} }
}; };
const sequelize = Support.createSequelizeInstance(options); const sequelize = Support.createSequelizeInstance(options);
const connectionManager = new ConnectionManager(Support.getTestDialect(), sequelize); const connectionManager = new ConnectionManager(sequelize.dialect, sequelize);
const res = { const res = {
queryType: 'read' queryType: 'read'
...@@ -79,7 +80,7 @@ describe('Connection Manager', () => { ...@@ -79,7 +80,7 @@ describe('Connection Manager', () => {
const connectStub = sandbox.stub(connectionManager, '_connect').resolves(res); const connectStub = sandbox.stub(connectionManager, '_connect').resolves(res);
sandbox.stub(connectionManager, '_disconnect').resolves(res); sandbox.stub(connectionManager, '_disconnect').resolves(res);
sandbox.stub(sequelize, 'databaseVersion').resolves(res); sandbox.stub(sequelize, 'databaseVersion').resolves(sequelize.dialect.defaultVersion);
connectionManager.initPools(); connectionManager.initPools();
const queryOptions = { const queryOptions = {
...@@ -104,6 +105,34 @@ describe('Connection Manager', () => { ...@@ -104,6 +105,34 @@ describe('Connection Manager', () => {
}); });
}); });
it('should trigger deprecation for non supported engine version', () => {
const deprecationStub = sandbox.stub(deprecations, 'unsupportedEngine');
const sequelize = Support.createSequelizeInstance();
const connectionManager = new ConnectionManager(sequelize.dialect, sequelize);
sandbox.stub(sequelize, 'databaseVersion').resolves('0.0.1');
const res = {
queryType: 'read'
};
sandbox.stub(connectionManager, '_connect').resolves(res);
sandbox.stub(connectionManager, '_disconnect').resolves(res);
connectionManager.initPools();
const queryOptions = {
priority: 0,
type: 'SELECT',
useMaster: true
};
return connectionManager.getConnection(queryOptions)
.then(() => {
chai.expect(deprecationStub).to.have.been.calledOnce;
});
});
it('should allow forced reads from the write pool', () => { it('should allow forced reads from the write pool', () => {
const master = { ...poolEntry }; const master = { ...poolEntry };
master.host = 'the-boss'; master.host = 'the-boss';
...@@ -115,14 +144,15 @@ describe('Connection Manager', () => { ...@@ -115,14 +144,15 @@ describe('Connection Manager', () => {
} }
}; };
const sequelize = Support.createSequelizeInstance(options); const sequelize = Support.createSequelizeInstance(options);
const connectionManager = new ConnectionManager(Support.getTestDialect(), sequelize); const connectionManager = new ConnectionManager(sequelize.dialect, sequelize);
const res = { const res = {
queryType: 'read' queryType: 'read'
}; };
const connectStub = sandbox.stub(connectionManager, '_connect').resolves(res); const connectStub = sandbox.stub(connectionManager, '_connect').resolves(res);
sandbox.stub(connectionManager, '_disconnect').resolves(res); sandbox.stub(connectionManager, '_disconnect').resolves(res);
sandbox.stub(sequelize, 'databaseVersion').resolves(res); sandbox.stub(sequelize, 'databaseVersion').resolves(sequelize.dialect.defaultVersion);
connectionManager.initPools(); connectionManager.initPools();
const queryOptions = { const queryOptions = {
...@@ -144,7 +174,7 @@ describe('Connection Manager', () => { ...@@ -144,7 +174,7 @@ describe('Connection Manager', () => {
replication: null replication: null
}; };
const sequelize = Support.createSequelizeInstance(options); const sequelize = Support.createSequelizeInstance(options);
const connectionManager = new ConnectionManager(Support.getTestDialect(), sequelize); const connectionManager = new ConnectionManager(sequelize.dialect, sequelize);
connectionManager.initPools(); connectionManager.initPools();
...@@ -156,5 +186,4 @@ describe('Connection Manager', () => { ...@@ -156,5 +186,4 @@ describe('Connection Manager', () => {
expect(poolClearSpy.calledOnce).to.be.true; expect(poolClearSpy.calledOnce).to.be.true;
}); });
}); });
}); });
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!