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

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');
const errors = require('../../errors');
const { logger } = require('../../utils/logger');
const debug = logger.debugContext('pool');
const { ParserStore } = require('./parser-store');
/**
* Abstract Connection Manager
......@@ -40,6 +41,8 @@ class ConnectionManager {
...config.pool
};
this.parserStore = new ParserStore(this.dialectName);
this.initPools();
}
......@@ -103,6 +106,14 @@ class ConnectionManager {
});
}
_refreshTypeParser(dataType) {
this.parserStore.refresh(dataType);
}
_clearTypeParser() {
this.parserStore.clear();
}
/**
* 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');
const DataTypes = require('../../data-types').mariadb;
const momentTz = require('moment-timezone');
const debug = logger.debugContext('connection:mariadb');
const parserStore = require('../parserStore')('mariadb');
/**
* MariaDB Connection Manager
......@@ -29,21 +28,6 @@ class ConnectionManager extends AbstractConnectionManager {
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
* Set the pool handlers on connection.error
......@@ -66,7 +50,12 @@ class ConnectionManager extends AbstractConnectionManager {
password: config.password,
database: config.database,
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,
supportBigNumbers: true,
foundRows: false
......
......@@ -6,7 +6,6 @@ const Promise = require('../../promise');
const { logger } = require('../../utils/logger');
const sequelizeErrors = require('../../errors');
const DataTypes = require('../../data-types').mssql;
const parserStore = require('../parserStore')('mssql');
const debug = logger.debugContext('connection:mssql');
const debugTedious = logger.debugContext('connection:mssql:tedious');
......@@ -18,14 +17,6 @@ class ConnectionManager extends AbstractConnectionManager {
this.refreshTypeParser(DataTypes);
}
_refreshTypeParser(dataType) {
parserStore.refresh(dataType);
}
_clearTypeParser() {
parserStore.clear();
}
connect(config) {
const connectionConfig = {
server: config.host,
......
......@@ -3,7 +3,6 @@
const Promise = require('../../promise');
const AbstractQuery = require('../abstract/query');
const sequelizeErrors = require('../../errors');
const parserStore = require('../parserStore')('mssql');
const _ = require('lodash');
const { logger } = require('../../utils/logger');
......@@ -83,7 +82,7 @@ class Query extends AbstractQuery {
const row = {};
for (const column of columns) {
const typeid = column.metadata.type.id;
const parse = parserStore.get(typeid);
const parse = this.sequelize.connectionManager.parserStore.get(typeid);
let value = column.value;
if (value !== null & !!parse) {
......
......@@ -7,7 +7,6 @@ const { logger } = require('../../utils/logger');
const DataTypes = require('../../data-types').mysql;
const momentTz = require('moment-timezone');
const debug = logger.debugContext('connection:mysql');
const parserStore = require('../parserStore')('mysql');
/**
* MySQL Connection Manager
......@@ -29,21 +28,6 @@ class ConnectionManager extends AbstractConnectionManager {
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
* Set the pool handlers on connection.error
......@@ -62,7 +46,12 @@ class ConnectionManager extends AbstractConnectionManager {
password: config.password,
database: config.database,
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,
supportBigNumbers: true
}, 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');
const debug = logger.debugContext('connection:sqlite');
const dataTypes = require('../../data-types').sqlite;
const sequelizeErrors = require('../../errors');
const parserStore = require('../parserStore')('sqlite');
class ConnectionManager extends AbstractConnectionManager {
constructor(dialect, sequelize) {
......@@ -32,15 +31,6 @@ class ConnectionManager extends AbstractConnectionManager {
.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 = {}) {
options.uuid = options.uuid || 'default';
options.inMemory = (this.sequelize.options.storage || this.sequelize.options.host || ':memory:') === ':memory:' ? 1 : 0;
......
......@@ -6,7 +6,6 @@ const Promise = require('../../promise');
const AbstractQuery = require('../abstract/query');
const QueryTypes = require('../../query-types');
const sequelizeErrors = require('../../errors');
const parserStore = require('../parserStore')('sqlite');
const { logger } = require('../../utils/logger');
const debug = logger.debugContext('sql:sqlite');
......@@ -354,7 +353,7 @@ class Query extends AbstractQuery {
}
type = type.replace('UNSIGNED', '').replace('ZEROFILL', '');
type = type.trim().toUpperCase();
const parse = parserStore.get(type);
const parse = this.sequelize.connectionManager.parserStore.get(type);
if (value !== null && parse) {
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!