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

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 {
throw err;
}
this._clearTypeParser();
this.refreshTypeParser(dataTypes.postgres);
}
......@@ -38,27 +39,46 @@ class ConnectionManager extends AbstractConnectionManager {
_refreshTypeParser(dataType) {
if (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) {
for (const oid of dataType.types.postgres.array_oids) {
this.lib.types.setTypeParser(oid, value =>
this.lib.types.arrayParser.create(value, v =>
this.arrayOidMap[oid] = value => {
return this.lib.types.arrayParser.create(value, v =>
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) {
config.user = config.username;
const connectionConfig = _.pick(config, [
'user', 'password', 'host', 'database', 'port'
]);
connectionConfig.types = {
getTypeParser: ConnectionManager.prototype.getTypeParser.bind(this)
};
if (config.dialectOptions) {
_.merge(connectionConfig,
_.pick(config.dialectOptions, [
......
......@@ -16,29 +16,7 @@ const chai = require('chai'),
describe(Support.getTestDialectTeaser('DataTypes'), () => {
afterEach(function() {
// Restore some sanity by resetting all parsers
switch (dialect) {
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._clearTypeParser();
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!