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

Commit ceb4b679 by Erik Seliger Committed by Simon Schick

fix: cleanup parser-store (#10895)

1 parent c28e034e
...@@ -7,6 +7,7 @@ const Promise = require('../../promise'); ...@@ -7,6 +7,7 @@ const Promise = require('../../promise');
const errors = require('../../errors'); const errors = require('../../errors');
const { logger } = require('../../utils/logger'); const { logger } = require('../../utils/logger');
const debug = logger.debugContext('pool'); const debug = logger.debugContext('pool');
const { ParserStore } = require('./parser-store');
/** /**
* Abstract Connection Manager * Abstract Connection Manager
...@@ -40,6 +41,8 @@ class ConnectionManager { ...@@ -40,6 +41,8 @@ class ConnectionManager {
...config.pool ...config.pool
}; };
this.parserStore = new ParserStore(this.dialectName);
this.initPools(); this.initPools();
} }
...@@ -103,6 +106,14 @@ class ConnectionManager { ...@@ -103,6 +106,14 @@ class ConnectionManager {
}); });
} }
_refreshTypeParser(dataType) {
this.parserStore.refresh(dataType);
}
_clearTypeParser() {
this.parserStore.clear();
}
/** /**
* Drain the pool and close it permanently * Drain the pool and close it permanently
* *
......
'use strict';
class ParserStore extends Map {
constructor(dialectName) {
super();
this.dialectName = dialectName;
}
refresh(dataType) {
for (const type of dataType.types[this.dialectName]) {
this.set(type, dataType.parse);
}
}
}
module.exports.ParserStore = ParserStore;
...@@ -7,7 +7,6 @@ const { logger } = require('../../utils/logger'); ...@@ -7,7 +7,6 @@ const { logger } = require('../../utils/logger');
const DataTypes = require('../../data-types').mariadb; const DataTypes = require('../../data-types').mariadb;
const momentTz = require('moment-timezone'); const momentTz = require('moment-timezone');
const debug = logger.debugContext('connection:mariadb'); const debug = logger.debugContext('connection:mariadb');
const parserStore = require('../parserStore')('mariadb');
/** /**
* MariaDB Connection Manager * MariaDB Connection Manager
...@@ -29,21 +28,6 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -29,21 +28,6 @@ class ConnectionManager extends AbstractConnectionManager {
this.refreshTypeParser(DataTypes); this.refreshTypeParser(DataTypes);
} }
static _typecast(field, next) {
if (parserStore.get(field.type)) {
return parserStore.get(field.type)(field, this.sequelize.options, next);
}
return next();
}
_refreshTypeParser(dataType) {
parserStore.refresh(dataType);
}
_clearTypeParser() {
parserStore.clear();
}
/** /**
* Connect with MariaDB database based on config, Handle any errors in connection * Connect with MariaDB database based on config, Handle any errors in connection
* Set the pool handlers on connection.error * Set the pool handlers on connection.error
...@@ -66,7 +50,12 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -66,7 +50,12 @@ class ConnectionManager extends AbstractConnectionManager {
password: config.password, password: config.password,
database: config.database, database: config.database,
timezone: tzOffset, timezone: tzOffset,
typeCast: ConnectionManager._typecast.bind(this), typeCast: (field, next) => {
if (this.parserStore.get(field.type)) {
return this.parserStore.get(field.type)(field, this.sequelize.options, next);
}
return next();
},
bigNumberStrings: false, bigNumberStrings: false,
supportBigNumbers: true, supportBigNumbers: true,
foundRows: false foundRows: false
......
...@@ -6,7 +6,6 @@ const Promise = require('../../promise'); ...@@ -6,7 +6,6 @@ const Promise = require('../../promise');
const { logger } = require('../../utils/logger'); const { logger } = require('../../utils/logger');
const sequelizeErrors = require('../../errors'); const sequelizeErrors = require('../../errors');
const DataTypes = require('../../data-types').mssql; const DataTypes = require('../../data-types').mssql;
const parserStore = require('../parserStore')('mssql');
const debug = logger.debugContext('connection:mssql'); const debug = logger.debugContext('connection:mssql');
const debugTedious = logger.debugContext('connection:mssql:tedious'); const debugTedious = logger.debugContext('connection:mssql:tedious');
...@@ -18,14 +17,6 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -18,14 +17,6 @@ class ConnectionManager extends AbstractConnectionManager {
this.refreshTypeParser(DataTypes); this.refreshTypeParser(DataTypes);
} }
_refreshTypeParser(dataType) {
parserStore.refresh(dataType);
}
_clearTypeParser() {
parserStore.clear();
}
connect(config) { connect(config) {
const connectionConfig = { const connectionConfig = {
server: config.host, server: config.host,
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
const Promise = require('../../promise'); const Promise = require('../../promise');
const AbstractQuery = require('../abstract/query'); const AbstractQuery = require('../abstract/query');
const sequelizeErrors = require('../../errors'); const sequelizeErrors = require('../../errors');
const parserStore = require('../parserStore')('mssql');
const _ = require('lodash'); const _ = require('lodash');
const { logger } = require('../../utils/logger'); const { logger } = require('../../utils/logger');
...@@ -83,7 +82,7 @@ class Query extends AbstractQuery { ...@@ -83,7 +82,7 @@ class Query extends AbstractQuery {
const row = {}; const row = {};
for (const column of columns) { for (const column of columns) {
const typeid = column.metadata.type.id; const typeid = column.metadata.type.id;
const parse = parserStore.get(typeid); const parse = this.sequelize.connectionManager.parserStore.get(typeid);
let value = column.value; let value = column.value;
if (value !== null & !!parse) { if (value !== null & !!parse) {
......
...@@ -7,7 +7,6 @@ const { logger } = require('../../utils/logger'); ...@@ -7,7 +7,6 @@ const { logger } = require('../../utils/logger');
const DataTypes = require('../../data-types').mysql; const DataTypes = require('../../data-types').mysql;
const momentTz = require('moment-timezone'); const momentTz = require('moment-timezone');
const debug = logger.debugContext('connection:mysql'); const debug = logger.debugContext('connection:mysql');
const parserStore = require('../parserStore')('mysql');
/** /**
* MySQL Connection Manager * MySQL Connection Manager
...@@ -29,21 +28,6 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -29,21 +28,6 @@ class ConnectionManager extends AbstractConnectionManager {
this.refreshTypeParser(DataTypes); this.refreshTypeParser(DataTypes);
} }
_refreshTypeParser(dataType) {
parserStore.refresh(dataType);
}
_clearTypeParser() {
parserStore.clear();
}
static _typecast(field, next) {
if (parserStore.get(field.type)) {
return parserStore.get(field.type)(field, this.sequelize.options, next);
}
return next();
}
/** /**
* Connect with MySQL database based on config, Handle any errors in connection * Connect with MySQL database based on config, Handle any errors in connection
* Set the pool handlers on connection.error * Set the pool handlers on connection.error
...@@ -62,7 +46,12 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -62,7 +46,12 @@ class ConnectionManager extends AbstractConnectionManager {
password: config.password, password: config.password,
database: config.database, database: config.database,
timezone: this.sequelize.options.timezone, timezone: this.sequelize.options.timezone,
typeCast: ConnectionManager._typecast.bind(this), typeCast: (field, next) => {
if (this.parserStore.get(field.type)) {
return this.parserStore.get(field.type)(field, this.sequelize.options, next);
}
return next();
},
bigNumberStrings: false, bigNumberStrings: false,
supportBigNumbers: true supportBigNumbers: true
}, config.dialectOptions); }, config.dialectOptions);
......
'use strict';
const stores = new Map();
module.exports = dialect => {
if (!stores.has(dialect)) {
stores.set(dialect, new Map());
}
return {
clear() {
stores.get(dialect).clear();
},
refresh(dataType) {
for (const type of dataType.types[dialect]) {
stores.get(dialect).set(type, dataType.parse);
}
},
get(type) {
return stores.get(dialect).get(type);
}
};
};
...@@ -6,7 +6,6 @@ const { logger } = require('../../utils/logger'); ...@@ -6,7 +6,6 @@ const { logger } = require('../../utils/logger');
const debug = logger.debugContext('connection:sqlite'); const debug = logger.debugContext('connection:sqlite');
const dataTypes = require('../../data-types').sqlite; const dataTypes = require('../../data-types').sqlite;
const sequelizeErrors = require('../../errors'); const sequelizeErrors = require('../../errors');
const parserStore = require('../parserStore')('sqlite');
class ConnectionManager extends AbstractConnectionManager { class ConnectionManager extends AbstractConnectionManager {
constructor(dialect, sequelize) { constructor(dialect, sequelize) {
...@@ -32,15 +31,6 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -32,15 +31,6 @@ class ConnectionManager extends AbstractConnectionManager {
.then(() => super._onProcessExit.call(this)); .then(() => super._onProcessExit.call(this));
} }
// Expose this as a method so that the parsing may be updated when the user has added additional, custom types
_refreshTypeParser(dataType) {
parserStore.refresh(dataType);
}
_clearTypeParser() {
parserStore.clear();
}
getConnection(options = {}) { getConnection(options = {}) {
options.uuid = options.uuid || 'default'; options.uuid = options.uuid || 'default';
options.inMemory = (this.sequelize.options.storage || this.sequelize.options.host || ':memory:') === ':memory:' ? 1 : 0; options.inMemory = (this.sequelize.options.storage || this.sequelize.options.host || ':memory:') === ':memory:' ? 1 : 0;
......
...@@ -6,7 +6,6 @@ const Promise = require('../../promise'); ...@@ -6,7 +6,6 @@ const Promise = require('../../promise');
const AbstractQuery = require('../abstract/query'); const AbstractQuery = require('../abstract/query');
const QueryTypes = require('../../query-types'); const QueryTypes = require('../../query-types');
const sequelizeErrors = require('../../errors'); const sequelizeErrors = require('../../errors');
const parserStore = require('../parserStore')('sqlite');
const { logger } = require('../../utils/logger'); const { logger } = require('../../utils/logger');
const debug = logger.debugContext('sql:sqlite'); const debug = logger.debugContext('sql:sqlite');
...@@ -354,7 +353,7 @@ class Query extends AbstractQuery { ...@@ -354,7 +353,7 @@ class Query extends AbstractQuery {
} }
type = type.replace('UNSIGNED', '').replace('ZEROFILL', ''); type = type.replace('UNSIGNED', '').replace('ZEROFILL', '');
type = type.trim().toUpperCase(); type = type.trim().toUpperCase();
const parse = parserStore.get(type); const parse = this.sequelize.connectionManager.parserStore.get(type);
if (value !== null && parse) { if (value !== null && parse) {
return parse(value, { timezone: this.sequelize.options.timezone }); return parse(value, { timezone: this.sequelize.options.timezone });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!