From 7824baa53f52f535810745a3247add1f99d7a6fc Mon Sep 17 00:00:00 2001 From: Aaron Heesakkers Date: Wed, 14 Jan 2015 16:00:08 +0100 Subject: [PATCH 1/4] [Issue #50] Removes keys with undefined values. Removes keys with undefined values from data before creating SQL query. This prevents sending NULL values to Postgres for undefined values, which prevents the Postgres from handling default values. (Postgre)SQL does support undefined values. If you want to use NULL values you should define them as such. --- lib/postgresql.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/postgresql.js b/lib/postgresql.js index 5da604d4..43f1294f 100644 --- a/lib/postgresql.js +++ b/lib/postgresql.js @@ -382,6 +382,15 @@ PostgreSQL.prototype.update = */ PostgreSQL.prototype.toFields = function (model, data, forCreate) { var self = this; + + // There is no undefined in PostgreSQL and sending NULL for every + // undefined field prevents the database from handling default values. + // + // If you actually want to send NULL values, use NULL values. + Object.keys(data).forEach(function (k) { + if (data[k] === undefined) delete data[k]; + }); + var props = self._categorizeProperties(model, data); var dataIdNames = props.idsInData; var nonIdsInData = props.nonIdsInData; From e53080f7c2064ec780a9715da3b8f16fbca9607d Mon Sep 17 00:00:00 2001 From: Aaron Heesakkers Date: Wed, 14 Jan 2015 17:36:20 +0100 Subject: [PATCH 2/4] Filters undefined before categorizeProperties --- lib/postgresql.js | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/postgresql.js b/lib/postgresql.js index 43f1294f..af0a29fc 100644 --- a/lib/postgresql.js +++ b/lib/postgresql.js @@ -256,6 +256,7 @@ PostgreSQL.prototype._categorizeProperties = function(model, data) { */ PostgreSQL.prototype.create = function (model, data, callback) { var self = this; + data = self.filterUndefined(data); var props = self._categorizeProperties(model, data); var sql = []; @@ -294,6 +295,7 @@ PostgreSQL.prototype.create = function (model, data, callback) { /* PostgreSQL.prototype.updateOrCreate = function (model, data, callback) { var self = this; + data = self.filterUndefined(data); var props = self._categorizeProperties(model, data); var idColumns = props.ids.map(function(key) { return self.columnEscaped(model, key); } @@ -342,6 +344,7 @@ PostgreSQL.prototype.updateOrCreate = function (model, data, callback) { */ PostgreSQL.prototype.save = function (model, data, callback) { var self = this; + data = self.filterUndefined(data); var props = self._categorizeProperties(model, data); var sql = []; @@ -360,6 +363,7 @@ PostgreSQL.prototype.save = function (model, data, callback) { PostgreSQL.prototype.update = PostgreSQL.prototype.updateAll = function (model, where, data, callback) { var whereClause = this.buildWhere(model, where); + data = this.filterUndefined(data); var sql = ['UPDATE ', this.tableEscaped(model), ' SET ', this.toFields(model, data), ' ', whereClause].join(''); @@ -374,15 +378,12 @@ PostgreSQL.prototype.update = }; /*! - * Build a list of column name/value pairs + * Filters undefined values from model instance data * - * @param {String} The model name * @param {Object} The model instance data - * @param {Boolean} forCreate Indicate if it's for creation */ -PostgreSQL.prototype.toFields = function (model, data, forCreate) { - var self = this; +PostgreSQL.prototype.filterUndefined = function (data) { // There is no undefined in PostgreSQL and sending NULL for every // undefined field prevents the database from handling default values. // @@ -391,6 +392,19 @@ PostgreSQL.prototype.toFields = function (model, data, forCreate) { if (data[k] === undefined) delete data[k]; }); + return data; +} + +/*! + * Build a list of column name/value pairs + * + * @param {String} The model name + * @param {Object} The model instance data + * @param {Boolean} forCreate Indicate if it's for creation + */ +PostgreSQL.prototype.toFields = function (model, data, forCreate) { + var self = this; + var props = self._categorizeProperties(model, data); var dataIdNames = props.idsInData; var nonIdsInData = props.nonIdsInData; From 0cc4727bb7b25bb38b90f05a54fc12b662a2b824 Mon Sep 17 00:00:00 2001 From: Aaron Heesakkers Date: Wed, 14 Jan 2015 18:06:42 +0100 Subject: [PATCH 3/4] Added local vimrc (lvimrc) to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9f29e4c1..3f2d0c54 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ lib-cov *.out *.pid *.gz - +.lvimrc pids logs results From e3f44ca1904729c51b8d7ba0291493ea2e7ffb21 Mon Sep 17 00:00:00 2001 From: Aaron Heesakkers Date: Wed, 14 Jan 2015 18:07:24 +0100 Subject: [PATCH 4/4] replaces tabs with spaces --- lib/postgresql.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/postgresql.js b/lib/postgresql.js index af0a29fc..c4afb4fe 100644 --- a/lib/postgresql.js +++ b/lib/postgresql.js @@ -256,7 +256,7 @@ PostgreSQL.prototype._categorizeProperties = function(model, data) { */ PostgreSQL.prototype.create = function (model, data, callback) { var self = this; - data = self.filterUndefined(data); + data = self.filterUndefined(data); var props = self._categorizeProperties(model, data); var sql = []; @@ -295,7 +295,7 @@ PostgreSQL.prototype.create = function (model, data, callback) { /* PostgreSQL.prototype.updateOrCreate = function (model, data, callback) { var self = this; - data = self.filterUndefined(data); + data = self.filterUndefined(data); var props = self._categorizeProperties(model, data); var idColumns = props.ids.map(function(key) { return self.columnEscaped(model, key); } @@ -344,7 +344,7 @@ PostgreSQL.prototype.updateOrCreate = function (model, data, callback) { */ PostgreSQL.prototype.save = function (model, data, callback) { var self = this; - data = self.filterUndefined(data); + data = self.filterUndefined(data); var props = self._categorizeProperties(model, data); var sql = []; @@ -363,7 +363,7 @@ PostgreSQL.prototype.save = function (model, data, callback) { PostgreSQL.prototype.update = PostgreSQL.prototype.updateAll = function (model, where, data, callback) { var whereClause = this.buildWhere(model, where); - data = this.filterUndefined(data); + data = this.filterUndefined(data); var sql = ['UPDATE ', this.tableEscaped(model), ' SET ', this.toFields(model, data), ' ', whereClause].join(''); @@ -392,7 +392,7 @@ PostgreSQL.prototype.filterUndefined = function (data) { if (data[k] === undefined) delete data[k]; }); - return data; + return data; } /*!