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

Commit f290fb5c by Sushant Committed by GitHub

fix(connection-manager): mssql datatype parsing (#9470)

1 parent b5c76a0c
...@@ -6,7 +6,6 @@ language: node_js ...@@ -6,7 +6,6 @@ language: node_js
branches: branches:
only: only:
- master - master
- v5
- /^greenkeeper/.*$/ - /^greenkeeper/.*$/
except: except:
- /^v\d+\.\d+\.\d+$/ - /^v\d+\.\d+\.\d+$/
......
...@@ -8,12 +8,9 @@ services: ...@@ -8,12 +8,9 @@ services:
shallow_clone: true shallow_clone: true
cache:
- node_modules
environment: environment:
matrix: matrix:
- {NODE_VERSION: 6, DIALECT: mssql, COVERAGE: true} - { NODE_VERSION: 6, DIALECT: mssql, COVERAGE: true }
install: install:
- ps: Install-Product node $env:NODE_VERSION x64 - ps: Install-Product node $env:NODE_VERSION x64
...@@ -43,4 +40,4 @@ after_test: ...@@ -43,4 +40,4 @@ after_test:
branches: branches:
only: only:
- master - master
- v5 - /^greenkeeper/.*$/
...@@ -7,8 +7,8 @@ const Utils = require('../../utils'); ...@@ -7,8 +7,8 @@ const Utils = require('../../utils');
const debug = Utils.getLogger().debugContext('connection:mssql'); const debug = Utils.getLogger().debugContext('connection:mssql');
const debugTedious = Utils.getLogger().debugContext('connection:mssql:tedious'); const debugTedious = Utils.getLogger().debugContext('connection:mssql:tedious');
const sequelizeErrors = require('../../errors'); const sequelizeErrors = require('../../errors');
const DataTypes = require('../../data-types').mssql;
const parserStore = require('../parserStore')('mssql'); const parserStore = require('../parserStore')('mssql');
const _ = require('lodash');
class ConnectionManager extends AbstractConnectionManager { class ConnectionManager extends AbstractConnectionManager {
constructor(dialect, sequelize) { constructor(dialect, sequelize) {
...@@ -28,9 +28,10 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -28,9 +28,10 @@ class ConnectionManager extends AbstractConnectionManager {
} }
throw err; throw err;
} }
this.refreshTypeParser(DataTypes);
} }
// Expose this as a method so that the parsing may be updated when the user has added additional, custom types
_refreshTypeParser(dataType) { _refreshTypeParser(dataType) {
parserStore.refresh(dataType); parserStore.refresh(dataType);
} }
...@@ -88,15 +89,15 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -88,15 +89,15 @@ class ConnectionManager extends AbstractConnectionManager {
switch (err.code) { switch (err.code) {
case 'ESOCKET': case 'ESOCKET':
if (_.includes(err.message, 'connect EHOSTUNREACH')) { if (err.message.includes('connect EHOSTUNREACH')) {
reject(new sequelizeErrors.HostNotReachableError(err)); reject(new sequelizeErrors.HostNotReachableError(err));
} else if (_.includes(err.message, 'connect ENETUNREACH')) { } else if (err.message.includes('connect ENETUNREACH')) {
reject(new sequelizeErrors.HostNotReachableError(err)); reject(new sequelizeErrors.HostNotReachableError(err));
} else if (_.includes(err.message, 'connect EADDRNOTAVAIL')) { } else if (err.message.includes('connect EADDRNOTAVAIL')) {
reject(new sequelizeErrors.HostNotReachableError(err)); reject(new sequelizeErrors.HostNotReachableError(err));
} else if (_.includes(err.message, 'getaddrinfo ENOTFOUND')) { } else if (err.message.includes('getaddrinfo ENOTFOUND')) {
reject(new sequelizeErrors.HostNotFoundError(err)); reject(new sequelizeErrors.HostNotFoundError(err));
} else if (_.includes(err.message, 'connect ECONNREFUSED')) { } else if (err.message.includes('connect ECONNREFUSED')) {
reject(new sequelizeErrors.ConnectionRefusedError(err)); reject(new sequelizeErrors.ConnectionRefusedError(err));
} else { } else {
reject(new sequelizeErrors.ConnectionError(err)); reject(new sequelizeErrors.ConnectionError(err));
......
'use strict'; 'use strict';
const _ = require('lodash');
const AbstractConnectionManager = require('../abstract/connection-manager'); const AbstractConnectionManager = require('../abstract/connection-manager');
const SequelizeErrors = require('../../errors'); const SequelizeErrors = require('../../errors');
const Utils = require('../../utils'); const Utils = require('../../utils');
const DataTypes = require('../../data-types').mysql; const DataTypes = require('../../data-types').mysql;
const momentTz = require('moment-timezone'); const momentTz = require('moment-timezone');
const debug = Utils.getLogger().debugContext('connection:mysql'); const debug = Utils.getLogger().debugContext('connection:mysql');
const parserMap = new Map(); const parserStore = require('../parserStore')('mysql');
/** /**
* MySQL Connection Managger * MySQL Connection Manager
* *
* Get connections, validate and disconnect them. * Get connections, validate and disconnect them.
* AbstractConnectionManager pooling use it to handle MySQL specific connections * AbstractConnectionManager pooling use it to handle MySQL specific connections
...@@ -43,20 +42,17 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -43,20 +42,17 @@ class ConnectionManager extends AbstractConnectionManager {
this.refreshTypeParser(DataTypes); this.refreshTypeParser(DataTypes);
} }
// Update parsing when the user has added additional, custom types
_refreshTypeParser(dataType) { _refreshTypeParser(dataType) {
for (const type of dataType.types.mysql) { parserStore.refresh(dataType);
parserMap.set(type, dataType.parse);
}
} }
_clearTypeParser() { _clearTypeParser() {
parserMap.clear(); parserStore.clear();
} }
static _typecast(field, next) { static _typecast(field, next) {
if (parserMap.has(field.type)) { if (parserStore.get(field.type)) {
return parserMap.get(field.type)(field, this.sequelize.options, next); return parserStore.get(field.type)(field, this.sequelize.options, next);
} }
return next(); return next();
} }
...@@ -180,8 +176,6 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -180,8 +176,6 @@ class ConnectionManager extends AbstractConnectionManager {
} }
} }
_.extend(ConnectionManager.prototype, AbstractConnectionManager.prototype);
module.exports = ConnectionManager; module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager; module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager; module.exports.default = ConnectionManager;
...@@ -252,8 +252,6 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -252,8 +252,6 @@ class ConnectionManager extends AbstractConnectionManager {
} }
} }
_.extend(ConnectionManager.prototype, AbstractConnectionManager.prototype);
module.exports = ConnectionManager; module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager; module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager; module.exports.default = ConnectionManager;
...@@ -94,7 +94,6 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -94,7 +94,6 @@ class ConnectionManager extends AbstractConnectionManager {
} }
} }
module.exports = ConnectionManager; module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager; module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager; module.exports.default = ConnectionManager;
...@@ -5,7 +5,6 @@ const expectsql = Support.expectsql; ...@@ -5,7 +5,6 @@ const expectsql = Support.expectsql;
const current = Support.sequelize; const current = Support.sequelize;
const TableHints = require('../../../../lib/table-hints'); const TableHints = require('../../../../lib/table-hints');
const QueryGenerator = require('../../../../lib/dialects/mssql/query-generator'); const QueryGenerator = require('../../../../lib/dialects/mssql/query-generator');
const _ = require('lodash');
if (current.dialect.name === 'mssql') { if (current.dialect.name === 'mssql') {
describe('[MSSQL Specific] QueryGenerator', () => { describe('[MSSQL Specific] QueryGenerator', () => {
...@@ -50,7 +49,10 @@ if (current.dialect.name === 'mssql') { ...@@ -50,7 +49,10 @@ if (current.dialect.name === 'mssql') {
}); });
it('selectFromTableFragment', function() { it('selectFromTableFragment', function() {
const modifiedGen = _.cloneDeep(this.queryGenerator); const modifiedGen = new QueryGenerator({
sequelize: this.sequelize,
_dialect: this.sequelize.dialect
});
// Test newer versions first // Test newer versions first
// Should be all the same since handling is done in addLimitAndOffset // Should be all the same since handling is done in addLimitAndOffset
// for SQL Server 2012 and higher (>= v11.0.0) // for SQL Server 2012 and higher (>= v11.0.0)
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!