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

Commit 301f6b80 by Jan Aagaard Meier

fix(postgres/conectionmanager): Don't leak postgres OIDs between instances

1 parent 6611b408
Showing with 21 additions and 4 deletions
...@@ -29,6 +29,9 @@ ConnectionManager = function(dialect, sequelize) { ...@@ -29,6 +29,9 @@ ConnectionManager = function(dialect, sequelize) {
throw err; throw err;
} }
this.oidMap = {};
this.arrayOidMap = {};
this._oidsFetched = false; this._oidsFetched = false;
this.refreshTypeParser(dataTypes.postgres); this.refreshTypeParser(dataTypes.postgres);
}; };
...@@ -41,23 +44,33 @@ ConnectionManager.prototype.$refreshTypeParser = function (dataType) { ...@@ -41,23 +44,33 @@ ConnectionManager.prototype.$refreshTypeParser = function (dataType) {
if (dataType.types.postgres.oids) { if (dataType.types.postgres.oids) {
dataType.types.postgres.oids.forEach(function (oid) { dataType.types.postgres.oids.forEach(function (oid) {
self.lib.types.setTypeParser(oid, function (value) { self.oidMap[oid] = function (value) {
return dataType.parse(value, oid, self.lib.types.getTypeParser); return dataType.parse(value, oid, self.lib.types.getTypeParser);
}); };
}); });
} }
if (dataType.types.postgres.array_oids) { if (dataType.types.postgres.array_oids) {
dataType.types.postgres.array_oids.forEach(function (oid) { dataType.types.postgres.array_oids.forEach(function (oid) {
self.lib.types.setTypeParser(oid, function (value) { self.arrayOidMap[oid] = function (value) {
return self.lib.types.arrayParser.create(value, function (value) { return self.lib.types.arrayParser.create(value, function (value) {
return dataType.parse(value, oid, self.lib.types.getTypeParser); return dataType.parse(value, oid, self.lib.types.getTypeParser);
}).parse(); }).parse();
}); };
}); });
} }
}; };
ConnectionManager.prototype.getTypeParser = function (oid, format) {
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);
};
ConnectionManager.prototype.connect = function(config) { ConnectionManager.prototype.connect = function(config) {
var self = this var self = this
, connectionConfig = {}; , connectionConfig = {};
...@@ -67,6 +80,10 @@ ConnectionManager.prototype.connect = function(config) { ...@@ -67,6 +80,10 @@ ConnectionManager.prototype.connect = function(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) {
Utils._.merge(connectionConfig, Utils._.merge(connectionConfig,
Utils._.pick(config.dialectOptions, [ Utils._.pick(config.dialectOptions, [
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!