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

Commit d92d0d5a by Jan Aagaard Meier Committed by Sushant

fix(postgres/connection-manager): Don't leak OIDs between instances (#9026)

1 parent 7cb7394e
...@@ -31,6 +31,7 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -31,6 +31,7 @@ class ConnectionManager extends AbstractConnectionManager {
throw err; throw err;
} }
this._clearTypeParser();
this.refreshTypeParser(dataTypes.postgres); this.refreshTypeParser(dataTypes.postgres);
} }
...@@ -38,27 +39,46 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -38,27 +39,46 @@ class ConnectionManager extends AbstractConnectionManager {
_refreshTypeParser(dataType) { _refreshTypeParser(dataType) {
if (dataType.types.postgres.oids) { if (dataType.types.postgres.oids) {
for (const oid of dataType.types.postgres.oids) { for (const oid of dataType.types.postgres.oids) {
this.lib.types.setTypeParser(oid, value => dataType.parse(value, oid, this.lib.types.getTypeParser)); this.oidMap[oid] = value => dataType.parse(value, oid, this.lib.types.getTypeParser);
} }
} }
if (dataType.types.postgres.array_oids) { if (dataType.types.postgres.array_oids) {
for (const oid of dataType.types.postgres.array_oids) { for (const oid of dataType.types.postgres.array_oids) {
this.lib.types.setTypeParser(oid, value => this.arrayOidMap[oid] = value => {
this.lib.types.arrayParser.create(value, v => return this.lib.types.arrayParser.create(value, v =>
dataType.parse(v, oid, this.lib.types.getTypeParser) dataType.parse(v, oid, this.lib.types.getTypeParser)
).parse() ).parse();
); };
} }
} }
} }
_clearTypeParser() {
this.oidMap = {};
this.arrayOidMap = {};
}
getTypeParser(oid) {
if (this.oidMap[oid]) {
return this.oidMap[oid];
} else if (this.arrayOidMap[oid]) {
return this.arrayOidMap[oid];
}
return this.lib.types.getTypeParser.apply(undefined, arguments);
}
connect(config) { connect(config) {
config.user = config.username; config.user = config.username;
const connectionConfig = _.pick(config, [ const connectionConfig = _.pick(config, [
'user', 'password', 'host', 'database', 'port' 'user', 'password', 'host', 'database', 'port'
]); ]);
connectionConfig.types = {
getTypeParser: ConnectionManager.prototype.getTypeParser.bind(this)
};
if (config.dialectOptions) { if (config.dialectOptions) {
_.merge(connectionConfig, _.merge(connectionConfig,
_.pick(config.dialectOptions, [ _.pick(config.dialectOptions, [
......
...@@ -16,29 +16,7 @@ const chai = require('chai'), ...@@ -16,29 +16,7 @@ const chai = require('chai'),
describe(Support.getTestDialectTeaser('DataTypes'), () => { describe(Support.getTestDialectTeaser('DataTypes'), () => {
afterEach(function() { afterEach(function() {
// Restore some sanity by resetting all parsers // Restore some sanity by resetting all parsers
switch (dialect) { this.sequelize.connectionManager._clearTypeParser();
case 'postgres':
const types = this.sequelize.connectionManager.lib.types;
_.each(DataTypes, dataType => {
if (dataType.types && dataType.types.postgres) {
dataType.types.postgres.oids.forEach(oid => {
types.setTypeParser(oid, _.identity);
});
}
});
require('pg-types/lib/binaryParsers').init((oid, converter) => {
types.setTypeParser(oid, 'binary', converter);
});
require('pg-types/lib/textParsers').init((oid, converter) => {
types.setTypeParser(oid, 'text', converter);
});
break;
default:
this.sequelize.connectionManager._clearTypeParser();
}
this.sequelize.connectionManager.refreshTypeParser(DataTypes[dialect]); // Reload custom parsers this.sequelize.connectionManager.refreshTypeParser(DataTypes[dialect]); // Reload custom parsers
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!