Comparing version 2.3.0 to 2.4.0
106
index.js
@@ -34,17 +34,10 @@ var crypto = require("crypto"); | ||
var outputId; | ||
if (typeof obj._meta.id == 'string') { | ||
outputId = obj._meta.db.driver.outputId(obj._meta.id); | ||
} else { | ||
outputId = ''; | ||
} | ||
if (!fields.length) { | ||
if (obj._meta.db.driver.insertEmpty) { | ||
return obj._meta.db.driver.insertEmpty(obj._meta.table, obj._meta.id) + ' ' + outputId; | ||
return obj._meta.db.driver.insertEmpty(obj._meta.table, obj._meta.id); | ||
} else { | ||
return 'insert into ' + obj._meta.table + ' default values ' + outputId; | ||
return 'insert into ' + obj._meta.table + ' default values'; | ||
} | ||
} else { | ||
return 'insert into ' + obj._meta.table + ' (' + fields + ') values (' + values + ') ' + outputId; | ||
return 'insert into ' + obj._meta.table + ' (' + fields + ') values (' + values + ')'; | ||
} | ||
@@ -64,9 +57,10 @@ } | ||
return obj._meta.db.query(statementString, params, { | ||
statement: true | ||
}).then(function (r) { | ||
insert: !obj._meta.compoundKey, | ||
statement: obj._meta.compoundKey, | ||
id: obj._meta.id | ||
}).then(function (insertedId) { | ||
obj.setSaved(); | ||
if (!obj._meta.compoundKey) { | ||
var insertedId = obj._meta.db.driver.insertedId(r, obj._meta.id); | ||
obj[obj._meta.id] = insertedId; | ||
obj[obj._meta.id] = insertedId; | ||
} | ||
@@ -120,7 +114,7 @@ | ||
function saveManyToOne(obj, field) { | ||
function saveManyToOne(obj, field, options) { | ||
var value = foreignField(obj, field); | ||
if (value && !(value instanceof Array)) { | ||
return value.save().then(function () { | ||
return value.save(options).then(function () { | ||
var foreignId = | ||
@@ -140,9 +134,9 @@ obj._meta.foreignKeyFor ? | ||
function saveManyToOnes(obj) { | ||
function saveManyToOnes(obj, options) { | ||
return Promise.all(foreignFieldsForObject(obj).map(function (field) { | ||
return saveManyToOne(obj, field); | ||
return saveManyToOne(obj, field, options); | ||
})); | ||
} | ||
function saveOneToMany(obj, field) { | ||
function saveOneToMany(obj, field, options) { | ||
var items = foreignField(obj, field); | ||
@@ -152,3 +146,3 @@ | ||
return Promise.all(items.map(function (item) { | ||
return item.save(); | ||
return item.save(options); | ||
})); | ||
@@ -160,5 +154,5 @@ } else { | ||
function saveOneToManys(obj) { | ||
function saveOneToManys(obj, options) { | ||
return Promise.all(foreignFieldsForObject(obj).map(function (field) { | ||
return saveOneToMany(obj, field); | ||
return saveOneToMany(obj, field, options); | ||
})); | ||
@@ -183,6 +177,15 @@ } | ||
var waitForOneToManys; | ||
var oneToManyPromises; | ||
if (typeof options == 'object' && options.hasOwnProperty('oneToManyPromises')) { | ||
waitForOneToManys = false; | ||
oneToManyPromises = options.oneToManyPromises; | ||
} else { | ||
waitForOneToManys = true; | ||
oneToManyPromises = []; | ||
} | ||
if (!self._saving) { | ||
self.setSaving(true); | ||
return saveManyToOnes(this).then(function () { | ||
self.setSaving(saveManyToOnes(this, {oneToManyPromises: oneToManyPromises}).then(function () { | ||
if (self.changed() || force) { | ||
@@ -192,15 +195,30 @@ var writePromise = self.saved() ? update(self) : insert(self); | ||
return writePromise.then(function () { | ||
return saveOneToManys(self); | ||
return { | ||
oneToManys: saveOneToManys(self, {oneToManyPromises: oneToManyPromises}) | ||
}; | ||
}); | ||
} else { | ||
return saveOneToManys(self); | ||
return { | ||
oneToManys: saveOneToManys(self, {oneToManyPromises: oneToManyPromises}) | ||
}; | ||
} | ||
}).then(function () { | ||
}).then(function (value) { | ||
self.setSaving(false); | ||
return value; | ||
}, function (error) { | ||
self.setSaving(false); | ||
throw error; | ||
})); | ||
} | ||
oneToManyPromises.push(self._saving.then(function (r) { | ||
return r.oneToManys; | ||
})); | ||
if (waitForOneToManys) { | ||
return self._saving.then(function () { | ||
return Promise.all(oneToManyPromises); | ||
}); | ||
} else { | ||
return Promise.resolve(); | ||
return self._saving; | ||
} | ||
@@ -231,3 +249,3 @@ }, | ||
Object.defineProperty(this, "_saving", { | ||
value: true, | ||
value: saving, | ||
configurable: true | ||
@@ -316,3 +334,3 @@ }); | ||
}; | ||
return model; | ||
@@ -325,4 +343,8 @@ }, | ||
function runQuery() { | ||
return self.driver.query(query, params, options).then(function (results) { | ||
self.logResults(query, params, results, options && options.statement); | ||
var command = options && options.insert | ||
? self.driver.insert(query, params, options) | ||
: self.driver.query(query, params, options) | ||
return command.then(function (results) { | ||
self.logResults(query, params, results, options); | ||
return results; | ||
@@ -346,5 +368,5 @@ }, function (e) { | ||
logResults: function(query, params, results, statement) { | ||
logResults: function(query, params, results, options) { | ||
if (typeof this.log == 'function') { | ||
return this.log(query, params, results, statement); | ||
return this.log(query, params, results, options); | ||
} else { | ||
@@ -356,3 +378,6 @@ if (params) { | ||
} | ||
if (!statement && results) { | ||
if (options && options.insert) { | ||
return debugResults('id = ' + results); | ||
} else if (!(options && options.statement) && results) { | ||
return debugResults(results); | ||
@@ -394,9 +419,8 @@ } | ||
this.connection = this.driver.connect(_config).then(function () { | ||
function finishRunningBeginSession() { | ||
self.runningBeginSession = false; | ||
} | ||
if (_config.setupSession) { | ||
self.runningBeginSession = true; | ||
function finishRunningBeginSession() { | ||
self.runningBeginSession = false; | ||
} | ||
return _config.setupSession(self).then(finishRunningBeginSession, finishRunningBeginSession); | ||
@@ -403,0 +427,0 @@ } |
@@ -33,14 +33,14 @@ var promisify = require('./promisify'); | ||
close: function() { | ||
return this.connection.close(); | ||
}, | ||
insert: function(query, params, options) { | ||
var id = options.id; | ||
outputId: function(id) { | ||
return "; select scope_identity() as " + id; | ||
return this.query(query + "; select scope_identity() as " + id, params).then(function (rows) { | ||
return rows[0][id]; | ||
}); | ||
}, | ||
insertedId: function(rows, id) { | ||
return rows[0][id]; | ||
close: function() { | ||
return this.connection.close(); | ||
} | ||
}; | ||
}; |
@@ -30,2 +30,8 @@ var promisify = require('./promisify'); | ||
insert: function(query, params) { | ||
return this.query(query + "; select last_insert_id() as id", params).then(function (rows) { | ||
return rows[1][0].id; | ||
}); | ||
}, | ||
connect: function(config) { | ||
@@ -46,14 +52,6 @@ var self = this; | ||
outputId: function() { | ||
return "; select last_insert_id() as id"; | ||
}, | ||
insertEmpty: function(table) { | ||
return 'insert into ' + table + ' () values ()'; | ||
}, | ||
insertedId: function(rows) { | ||
return rows[1][0].id; | ||
} | ||
}; | ||
}; |
@@ -14,3 +14,3 @@ var optionalRequire = require('./optionalRequire'); | ||
if (options && options.statement) { | ||
if (options && (options.statement || options.insert)) { | ||
return results; | ||
@@ -34,2 +34,10 @@ } else { | ||
insert: function(query, params, options) { | ||
var id = options.id; | ||
return this.query(query + " returning " + id + " into :returning_into_id", params, options).then(function (rows) { | ||
return rows.outBinds.returning_into_id[0]; | ||
}); | ||
}, | ||
connect: function (config) { | ||
@@ -62,6 +70,2 @@ var self = this; | ||
outputId: function (id) { | ||
return " returning " + id + " into :returning_into_id"; | ||
}, | ||
insertEmpty: function(table, id) { | ||
@@ -75,6 +79,2 @@ return 'insert into ' + table + ' (' + id + ') values (default)'; | ||
}; | ||
}, | ||
insertedId: function (rows) { | ||
return rows.outBinds.returning_into_id[0]; | ||
} | ||
@@ -81,0 +81,0 @@ }; |
{ | ||
"name": "sworm", | ||
"version": "2.3.0", | ||
"version": "2.4.0", | ||
"description": "a lightweight write-only ORM for MSSQL, MySQL, PostgreSQL, Oracle, Sqlite 3", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -46,2 +46,10 @@ var promisify = require('./promisify'); | ||
insert: function(query, params, options) { | ||
var id = options.id; | ||
return this.query(query + ' returning ' + id, params).then(function (rows) { | ||
return rows[0][id]; | ||
}); | ||
}, | ||
connect: function(config) { | ||
@@ -61,2 +69,3 @@ var self = this; | ||
}, | ||
close: function() { | ||
@@ -66,12 +75,4 @@ if (this.done) { | ||
} | ||
}, | ||
outputId: function(id) { | ||
return "returning " + id; | ||
}, | ||
insertedId: function(rows, id) { | ||
return rows[0][id]; | ||
} | ||
}; | ||
}; |
@@ -19,3 +19,3 @@ var promisify = require('./promisify'); | ||
if (options && options.statement) { | ||
if (options && (options.statement || options.insert)) { | ||
return new Promise(function (fulfil, reject) { | ||
@@ -44,2 +44,8 @@ debug(query, sqliteParams); | ||
insert: function(query, params, options) { | ||
return this.query(query, params, options).then(function (rows) { | ||
return rows.lastId; | ||
}); | ||
}, | ||
connect: function(config) { | ||
@@ -62,12 +68,4 @@ var self = this; | ||
}); | ||
}, | ||
outputId: function() { | ||
return ''; | ||
}, | ||
insertedId: function(result) { | ||
return result.lastId; | ||
} | ||
}; | ||
}; |
@@ -1,2 +0,1 @@ | ||
var debug = require("debug")("sworm"); | ||
var chai = require("chai"); | ||
@@ -133,6 +132,11 @@ var expect = chai.expect; | ||
db.log = function(sql, params, results) { | ||
debug(sql, params, results); | ||
db.log = function(sql) { | ||
var originalLog = this.log; | ||
this.log = undefined; | ||
var match = /^(insert|update|delete|select)/.exec(sql); | ||
return statements.push(match[1]); | ||
statements.push(match[1]); | ||
this.logResults.apply(this, arguments); | ||
this.log = originalLog; | ||
}; | ||
@@ -610,2 +614,23 @@ | ||
it("can save a shared foreign object", function() { | ||
var essert = address({ | ||
address: "15, Rue d'Essert" | ||
}); | ||
var bob = person({ | ||
name: "bob", | ||
address: essert | ||
}); | ||
var jane = person({ | ||
name: "jane", | ||
address: essert | ||
}); | ||
return Promise.all([bob.save(), jane.save()]).then(function() { | ||
expect(bob.address_id).to.equal(essert.id); | ||
expect(jane.address_id).to.equal(essert.id); | ||
}); | ||
}); | ||
it("can save a many to one relationship with function", function() { | ||
@@ -789,2 +814,3 @@ var bobsAddress; | ||
var jane; | ||
var rueDEssert = address({ | ||
@@ -791,0 +817,0 @@ address: "15, Rue d'Essert", |
Sorry, the diff of this file is not supported yet
110171
1884