diff --git a/lib/client.js b/lib/client.js index 44ab89cf..8c281725 100644 --- a/lib/client.js +++ b/lib/client.js @@ -2,7 +2,7 @@ var crypto = require('crypto'); var EventEmitter = require('events').EventEmitter; var util = require('util'); var pgPass = require('pgpass'); -var types = require('pg-types'); +var TypeOverrides = require('./type-overrides'); var ConnectionParameters = require(__dirname + '/connection-parameters'); var Query = require(__dirname + '/query'); @@ -21,6 +21,8 @@ var Client = function(config) { var c = config || {}; + this._types = new TypeOverrides(c.types); + this.connection = c.connection || new Connection({ stream: c.stream, ssl: this.connectionParameters.ssl @@ -31,12 +33,6 @@ var Client = function(config) { this.processID = null; this.secretKey = null; this.ssl = this.connectionParameters.ssl || false; - - this._types = c.types || types; - this._parserOverrides = { - text: {}, - binary: {} - }; }; util.inherits(Client, EventEmitter); @@ -235,17 +231,11 @@ Client.prototype.cancel = function(client, query) { }; Client.prototype.setTypeParser = function(oid, format, parseFn) { - if(typeof format == 'function') { - parseFn = format; - format = 'text'; - } - this._parserOverrides[format][oid] = parseFn; + return this._types.setTypeParser(oid, format, parseFn); }; Client.prototype.getTypeParser = function(oid, format) { - format = format || 'text'; - var formatParserOverrides = this._parserOverrides[format] || {}; - return formatParserOverrides[oid] || this._types.getTypeParser(oid, format); + return this._types.getTypeParser(oid, format); }; // Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c @@ -323,7 +313,7 @@ Client.prototype.query = function(config, values, callback) { if(this.binary && !query.binary) { query.binary = true; } - query._result._getTypeParser = this.getTypeParser.bind(this); + query._result._getTypeParser = this._types.getTypeParser.bind(this._types); this.queryQueue.push(query); this._pulseQueryQueue(); diff --git a/lib/native/index.js b/lib/native/index.js index 9d21dbcd..7569c4d4 100644 --- a/lib/native/index.js +++ b/lib/native/index.js @@ -1,5 +1,5 @@ var Native = require('pg-native'); -var types = require('pg-types'); +var TypeOverrides = require('../type-overrides'); var semver = require('semver'); var pkg = require('../../package.json'); var assert = require('assert'); @@ -16,8 +16,10 @@ var Client = module.exports = function(config) { EventEmitter.call(this); config = config || {}; + this._types = new TypeOverrides(config.types); + this.native = new Native({ - types: {getTypeParser: this.getTypeParser.bind(this)} + types: this._types }); this._queryQueue = []; @@ -34,12 +36,6 @@ var Client = module.exports = function(config) { //a hash to hold named queries this.namedQueries = {}; - - this._types = config.types || types; - this._parserOverrides = { - text: {}, - binary: {} - }; }; util.inherits(Client, EventEmitter); @@ -189,15 +185,9 @@ Client.prototype.cancel = function(query) { }; Client.prototype.setTypeParser = function(oid, format, parseFn) { - if(typeof format == 'function') { - parseFn = format; - format = 'text'; - } - this._parserOverrides[format][oid] = parseFn; + return this._types.setTypeParser(oid, format, parseFn); }; Client.prototype.getTypeParser = function(oid, format) { - format = format || 'text'; - var formatParserOverrides = this._parserOverrides[format] || {}; - return formatParserOverrides[oid] || this._types.getTypeParser(oid, format); + return this._types.getTypeParser(oid, format); }; diff --git a/lib/type-overrides.js b/lib/type-overrides.js new file mode 100644 index 00000000..f6ebdb97 --- /dev/null +++ b/lib/type-overrides.js @@ -0,0 +1,30 @@ +var types = require('pg-types'); + +function TypeOverrides(userTypes) { + this._types = userTypes || types; + this.text = {}; + this.binary = {}; +} + +TypeOverrides.prototype.getOverrides = function(format) { + switch(format) { + case 'text': return this.text; + case 'binary': return this.binary; + default: return {}; + } +}; + +TypeOverrides.prototype.setTypeParser = function(oid, format, parseFn) { + if(typeof format == 'function') { + parseFn = format; + format = 'text'; + } + this.getOverrides(format)[oid] = parseFn; +}; + +TypeOverrides.prototype.getTypeParser = function(oid, format) { + format = format || 'text'; + return this.getOverrides(format)[oid] || this._types.getTypeParser(oid, format); +}; + +module.exports = TypeOverrides;