Comparing version 2.0.8 to 2.0.9
@@ -436,3 +436,7 @@ var schemaUtil = require(__dirname+'/schema.js'); | ||
var result, key, keys, nextSchema, copyFlag; | ||
if (type.isDate(schema) && (typeof doc === 'string')) { | ||
if (type.isDate(schema) && (typeof doc === 'string' || typeof doc === 'number')) { | ||
var numericDate = parseInt(doc, 10); | ||
if(!isNaN(numericDate)) { | ||
doc = numericDate; | ||
} | ||
return new Date(doc); // Use r.ISO8601 and not `new Date()` to keep timezone | ||
@@ -459,2 +463,10 @@ } | ||
} | ||
else if (type.isNumber(schema) && (typeof doc === 'string')) { | ||
var numericString = parseFloat(doc); | ||
if(!isNaN(numericString)){ | ||
return numericString; | ||
}else{ | ||
return doc; | ||
} | ||
} | ||
@@ -585,13 +597,8 @@ if (util.isPlainObject(doc) && (doc instanceof Buffer === false)) { | ||
Document.prototype._batchSaveSelf = function(executeInsert) { | ||
var model = this._getModel(); | ||
var self = this; | ||
return new Promise(function(resolve, reject) { | ||
if (model._tableReady === true) { | ||
self.getModel().ready().then(function() { | ||
executeInsert(resolve, reject) | ||
} | ||
else { | ||
model._onTableReady.push(function() { | ||
executeInsert(resolve, reject) | ||
}); | ||
} | ||
}); | ||
}) | ||
@@ -658,14 +665,7 @@ } | ||
//TODO Remove once | ||
if (model._tableReady === true) { | ||
self.getModel().ready().then(function() { | ||
Promise.all(promises).then(function() { | ||
self._onSavedBelongsTo(copy, docToSave, belongsToKeysSaved, saveAll, savedModel, resolve, reject); | ||
}).error(reject); | ||
} | ||
else { | ||
model._onTableReady.push(function() { | ||
Promise.all(promises).then(function() { | ||
self._onSavedBelongsTo(copy, docToSave, belongsToKeysSaved, saveAll, savedModel, resolve, reject); | ||
}).error(reject); | ||
}); | ||
} | ||
}); | ||
}); | ||
@@ -777,3 +777,3 @@ return p.nodeify(callback); | ||
var saveSelfHelper = function() { | ||
self.getModel().ready().then(function() { | ||
util.tryCatch(function() { | ||
@@ -797,12 +797,3 @@ // Validate the document before saving it | ||
}, reject); | ||
} | ||
if (self.__proto__._model._tableReady === true) { | ||
saveSelfHelper(); | ||
} | ||
else { | ||
model.once('ready', function() { | ||
saveSelfHelper(); | ||
}) | ||
} | ||
}); | ||
} | ||
@@ -809,0 +800,0 @@ |
601
lib/model.js
@@ -49,10 +49,4 @@ var util = require(__dirname+'/util.js'); | ||
this._tableCreated = false; | ||
this._tableReady = false; | ||
this._onTableCreated = []; | ||
this._onTableReady = []; | ||
this._indexesFetched = false; // Whether the indexes were fetched or not | ||
this._indexesToCreate = 0; | ||
this._foreignIndexesToCreate = 0; // many to many indexes left to create | ||
this._indexes = {}; // indexName -> true | ||
this._pendingPromises = []; | ||
@@ -97,2 +91,3 @@ this._error = null; // If an error occured, we won't let people save things | ||
var proto = new Model(name, schema, options, thinky); | ||
proto._initModel = options.init !== undefined ? !!options.init : true; | ||
@@ -166,2 +161,13 @@ var model = function model(doc, options) { | ||
if (options.init !== false) { | ||
// Setup the model's table. | ||
model.tableReady().then(); | ||
} | ||
else { | ||
// We do not initialize the table and suppose that it already exists and | ||
// is ready. | ||
model.emit('created'); | ||
model.emit('ready'); | ||
} | ||
// So people can directly call the EventEmitter from the constructor | ||
@@ -182,58 +188,92 @@ // TOIMPROVE: We should emit everything from the constructor instead of emitting things from | ||
Model.prototype.isReady = function() { | ||
return this._getModel()._tableReady; | ||
} | ||
/** | ||
* Create the model's table. | ||
* @return {Promise=} Returns a promise which will resolve when the table is ready. | ||
*/ | ||
Model.prototype.tableReady = function() { | ||
var self = this; | ||
var model = this._getModel(); | ||
if (!this._initModel) return Promise.resolve(); | ||
if (this._tableReadyPromise) return this._tableReadyPromise; | ||
Model.prototype._setError = function(error) { | ||
this._getModel()._error = error; | ||
this.emit('error', error); | ||
} | ||
// Create the table, or push the table name in the queue. | ||
var r = model._thinky.r; | ||
this._tableReadyPromise = model._thinky.dbReady() | ||
.then(function() { | ||
return r.tableCreate(model._name, {primaryKey: model._pk}).run(); | ||
}) | ||
.error(function(error) { | ||
if (error.message.match(/Table `.*` already exists/)) { | ||
return; | ||
} | ||
model._error = error; | ||
// Should we throw here? | ||
}); | ||
Model.prototype._setReady = function() { | ||
this._getModel()._tableReady = true; | ||
this.emit('ready', this); | ||
while (this._getModel()._onTableReady.length > 0) { | ||
this._getModel()._onTableReady.shift()(); | ||
} | ||
} | ||
return this._tableReadyPromise.then(function() { | ||
self.emit('created'); | ||
if (!self._pendingPromises.length) { | ||
self.emit('ready'); | ||
} | ||
}); | ||
}; | ||
Model.prototype._indexWasCreated = function(type) { | ||
if (type === 'local') { | ||
this._getModel()._indexesToCreate--; | ||
} | ||
else if (type === 'foreign') { | ||
this._getModel()._foreignIndexesToCreate--; | ||
} | ||
// We need to check tableCreated because _indexWasCreated can be called when a foreign index is built. | ||
if ((this._getModel()._tableCreated === true) | ||
&& (this._getModel()._indexesToCreate === 0) | ||
&& (this._getModel()._foreignIndexesToCreate === 0) | ||
&& (this._getModel()._indexesFetched === true)) { | ||
/** | ||
* Get a promise which resolves when the Model's table and | ||
* all indices have been created. | ||
*/ | ||
Model.prototype.ready = function() { | ||
var requirements = []; | ||
this._setReady(); | ||
} | ||
} | ||
// Ensure the Model's table is ready | ||
requirements.push(this.tableReady()); | ||
// Ensure all other pending promises have been resolved | ||
requirements.push(this._promisesReady()); | ||
Model.prototype._tableWasCreated = function() { | ||
return Promise.all(requirements); | ||
}; | ||
Model.prototype._promisesReady = function() { | ||
var self = this; | ||
if (this._promisesReadyPromise) return this._promisesReadyPromise; | ||
self._getModel()._tableCreated = true; | ||
while (this._getModel()._onTableCreated.length > 0) { | ||
this._getModel()._onTableCreated.shift()(); | ||
} | ||
var verifyAll = function() { | ||
return Promise.all(self._pendingPromises) | ||
.then(function() { | ||
var i, allFullfilled = true; | ||
for (i=0; i<self._pendingPromises.length; i++) { | ||
if (!self._pendingPromises[i].isFulfilled()) { | ||
allFullfilled = false; | ||
break; | ||
} | ||
} | ||
return allFullfilled ? Promise.resolve() : verifyAll(); | ||
}); | ||
}; | ||
self.emit('created'); | ||
this._promisesReadyPromise = verifyAll(); | ||
return this._promisesReadyPromise; | ||
}; | ||
self.fetchIndexes().then(function() { | ||
if ((self._getModel()._indexesToCreate === 0) | ||
&& (self._getModel()._foreignIndexesToCreate === 0)) { | ||
// Will trigger the queries waiting | ||
this._setReady(); | ||
} | ||
}).error(function(error) { | ||
self._error = error; | ||
}) | ||
Model.prototype._waitFor = function(promise) { | ||
var self = this; | ||
this._pendingPromises.push(promise); | ||
// Emit 'ready' when all pending promises have resolved | ||
if (!this._pendingReady) { | ||
this._pendingReady = this._promisesReady().then(function() { | ||
delete self._pendingReady; | ||
self.emit('ready', self); | ||
}); | ||
} | ||
}; | ||
Model.prototype._setError = function(error) { | ||
this._getModel()._error = error; | ||
this.emit('error', error); | ||
} | ||
/* | ||
@@ -262,45 +302,23 @@ * Return the options of the model -- call from an instance of Model | ||
Model.prototype.fetchIndexes = function() { | ||
Model.prototype.ensureIndex = function(name, fn, opts) { | ||
var self = this; | ||
return new Promise(function(resolve, reject) { | ||
var fetch = function() { | ||
var r = self._thinky.r; | ||
var query = new Query(self); | ||
r.table(self.getTableName()).indexList().do(function(indexes) { | ||
return r.table(self.getTableName()).indexWait(r.args(indexes)) | ||
}).run().then(function(indexes) { | ||
for(var i=0; i<indexes.length; i++) { | ||
self._getModel()._indexes[indexes[i].index] = true; | ||
} | ||
self._getModel()._indexesFetched = true; | ||
if ((opts === undefined) && (util.isPlainObject(fn))) { | ||
opts = fn; | ||
fn = undefined; | ||
} | ||
if ((self._getModel()._tableCreated === true) | ||
&& (self._getModel()._indexesToCreate === 0) | ||
&& (self._getModel()._foreignIndexesToCreate === 0)) { | ||
self._setReady(); | ||
} | ||
}).error(function(error) { | ||
self._getModel()._setError(error); | ||
}); | ||
} | ||
if (self._getModel()._tableCreated === true) { | ||
fetch(); | ||
} | ||
else { | ||
self._getModel()._onTableCreated.push(fetch); | ||
} | ||
return self._createIndex(name, fn, opts) | ||
.catch(function(error) { | ||
self._getModel()._setError(error); | ||
throw error; | ||
}); | ||
} | ||
Model.prototype.ensureIndex = function(name, fn, opts) { | ||
var self = this; | ||
var r = self._getModel()._thinky.r; | ||
Model.prototype._createIndex = function(name, fn, opts) { | ||
var model = this._getModel(); | ||
var tableName = this.getTableName(); | ||
var r = model._thinky.r; | ||
if ((opts === undefined) && (util.isPlainObject(fn))) { | ||
if (opts === undefined && util.isPlainObject(fn)) { | ||
opts = fn; | ||
@@ -310,11 +328,4 @@ fn = undefined; | ||
self._getModel()._indexesToCreate++; | ||
self._getModel()._tableReady = false; | ||
return new Promise(function(resolve, reject) { | ||
var ensureIndex = function() { | ||
if (fn === undefined) { | ||
fn = function(doc) { return doc(name) }; | ||
} | ||
var tableName = self.getTableName(); | ||
var promise = this.tableReady().then(function() { | ||
return new Promise(function(resolve, reject) { | ||
return r.branch( | ||
@@ -324,35 +335,30 @@ r.table(tableName).indexList().contains(name), | ||
r.branch( | ||
r.table(tableName).info()("primary_key").eq(name), | ||
r.table(tableName).info()('primary_key').eq(name), | ||
r.table(tableName).indexWait(name), | ||
r.table(tableName).indexCreate(name, fn, opts || {}).do(function() { | ||
return r.table(tableName).indexWait(name) | ||
r.table(tableName).indexCreate(name, fn, opts).do(function() { | ||
return r.table(tableName).indexWait(name); | ||
}) | ||
) | ||
).run().then(function(result) { | ||
self._getModel()._indexes[name] = true; | ||
self._indexWasCreated('local'); | ||
resolve(); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
self._indexWasCreated('local'); | ||
) | ||
.run() | ||
.then(resolve) | ||
.error(function(error) { | ||
if (error.message.match(/^Index/)) { | ||
// TODO: This regex seems a bit too generous since messages such | ||
// as "Index `id` was not found on table..." will be accepted. | ||
// Figure out if this is OK or not. | ||
return resolve(); | ||
} | ||
else { | ||
self._getModel()._setError(error); | ||
} | ||
reject(error); | ||
}); | ||
}); | ||
}) | ||
.then(function() { | ||
model._indexes[name] = true; | ||
}); | ||
reject(error) | ||
}) | ||
this._waitFor(promise); | ||
return promise; | ||
}; | ||
} | ||
if (self._getModel()._tableCreated === true) { | ||
ensureIndex(); | ||
} | ||
else { | ||
self._getModel()._onTableCreated.push(ensureIndex); | ||
} | ||
}) | ||
} | ||
/* | ||
@@ -399,65 +405,8 @@ * joinedModel: the joined model | ||
if (options.init !== false) { | ||
var tableName = joinedModel.getTableName(); | ||
var r = joinedModel._getModel()._thinky.r; | ||
joinedModel._getModel()._indexesToCreate++; | ||
self._getModel()._foreignIndexesToCreate++; | ||
self._getModel()._tableReady = false; | ||
joinedModel._getModel()._tableReady = false; | ||
if (joinedModel._getModel()._tableCreated === true) { | ||
return r.branch( | ||
r.table(tableName).indexList().contains(rightKey), | ||
r.table(tableName).indexWait(rightKey), | ||
r.branch( | ||
r.table(tableName).info()("primary_key").eq(rightKey), | ||
r.table(tableName).indexWait(rightKey), | ||
r.table(tableName).indexCreate(rightKey).do(function() { | ||
return r.table(tableName).indexWait(rightKey) | ||
}) | ||
) | ||
).run().then(function(result) { | ||
joinedModel._indexWasCreated('local'); | ||
joinedModel._getModel()._indexes[rightKey] = true; | ||
self._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
} | ||
else { | ||
joinedModel._getModel()._setError(error); | ||
self._getModel()._setError(error); | ||
} | ||
}) | ||
} | ||
else { | ||
joinedModel._getModel()._onTableCreated.push(function() { | ||
r.branch( | ||
r.table(tableName).indexList().contains(rightKey), | ||
r.table(tableName).indexWait(rightKey), | ||
r.branch( | ||
r.table(tableName).info()("primary_key").eq(rightKey), | ||
r.table(tableName).indexWait(rightKey), | ||
r.table(tableName).indexCreate(rightKey).do(function() { | ||
return r.table(tableName).indexWait(rightKey) | ||
}) | ||
) | ||
).run().then(function() { | ||
joinedModel._indexWasCreated('local'); | ||
joinedModel._getModel()._indexes[rightKey] = true; | ||
self._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
} | ||
else { | ||
joinedModel._getModel()._setError(error); | ||
self._getModel()._setError(error); | ||
} | ||
}) | ||
}) | ||
} | ||
var newIndex = joinedModel._createIndex(rightKey) | ||
.catch(function(error) { | ||
joinedModel._getModel()._setError(error); | ||
self._getModel()._setError(error); | ||
}); | ||
self._waitFor(newIndex); | ||
} | ||
@@ -507,57 +456,8 @@ } | ||
if (options.init !== false) { | ||
var tableName = self.getTableName(); | ||
var r = self._getModel()._thinky.r; | ||
self._getModel()._indexesToCreate++; | ||
joinedModel._getModel()._foreignIndexesToCreate++; | ||
self._getModel()._tableReady = false; | ||
joinedModel._getModel()._tableReady = false; | ||
var query = r.branch( | ||
r.table(tableName).indexList().contains(leftKey), | ||
r.table(tableName).indexWait(leftKey), | ||
r.branch( | ||
r.table(tableName).info()("primary_key").eq(leftKey), | ||
{index: leftKey, ready: true}, | ||
r.table(tableName).indexCreate(leftKey).do(function() { | ||
return r.table(tableName).indexWait(leftKey) | ||
}) | ||
) | ||
) | ||
if (self._getModel()._tableCreated === true) { | ||
query.run().then(function(result) { | ||
self._indexWasCreated('local'); | ||
joinedModel._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
self._indexWasCreated('local'); | ||
self._getModel()._indexes[leftKey] = true; | ||
joinedModel._indexWasCreated('foreign'); | ||
} | ||
else { | ||
joinedModel._getModel()._setError(error); | ||
self._getModel()._setError(error); | ||
} | ||
}) | ||
} | ||
else { | ||
self._getModel()._onTableCreated.push(function() { | ||
query.run().then(function() { | ||
self._indexWasCreated('local'); | ||
self._getModel()._indexes[leftKey] = true; | ||
joinedModel._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
self._indexWasCreated('local'); | ||
joinedModel._indexWasCreated('foreign'); | ||
} | ||
else { | ||
joinedModel._getModel()._setError(error); | ||
self._getModel()._setError(error); | ||
} | ||
}); | ||
}) | ||
} | ||
var newIndex = self._createIndex(leftKey) | ||
.catch(function(error) { | ||
joinedModel._getModel()._setError(error); | ||
self._getModel()._setError(error); | ||
}); | ||
joinedModel._waitFor(newIndex); | ||
} | ||
@@ -600,57 +500,8 @@ } | ||
if (options.init !== false) { | ||
var tableName = joinedModel.getTableName(); | ||
var r = self._getModel()._thinky.r; | ||
var query = r.branch( | ||
r.table(tableName).indexList().contains(rightKey), | ||
r.table(tableName).indexWait(rightKey), | ||
r.branch( | ||
r.table(tableName).info()("primary_key").eq(rightKey), | ||
{index: rightKey, ready: true}, | ||
r.table(tableName).indexCreate(rightKey).do(function() { | ||
return r.table(tableName).indexWait(rightKey) | ||
}) | ||
) | ||
) | ||
joinedModel._getModel()._indexesToCreate++; | ||
self._getModel()._foreignIndexesToCreate++; | ||
self._getModel()._tableReady = false; | ||
joinedModel._getModel()._tableReady = false; | ||
if (joinedModel._getModel()._tableCreated === true) { | ||
query.run().then(function(result) { | ||
joinedModel._indexWasCreated('local'); | ||
joinedModel._getModel()._indexes[rightKey] = true; | ||
self._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `.*` already exists/)) { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
} | ||
else { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
} | ||
}) | ||
} | ||
else { | ||
joinedModel._getModel()._onTableCreated.push(function() { | ||
query.run().then(function() { | ||
joinedModel._indexWasCreated('local'); | ||
joinedModel._getModel()._indexes[rightKey] = true; | ||
self._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `.*` already exists/)) { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
} | ||
else { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
} | ||
}) | ||
}) | ||
} | ||
var newIndex = joinedModel._createIndex(rightKey) | ||
.catch(function(error) { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
}); | ||
self._waitFor(newIndex); | ||
} | ||
@@ -725,99 +576,2 @@ } | ||
// Create the two indexes on two models | ||
var queryIndex1 = r.branch( | ||
r.table(self.getTableName()).indexList().contains(leftKey), | ||
r.table(self.getTableName()).indexWait(leftKey), | ||
r.branch( | ||
r.table(self.getTableName()).info()('primary_key').eq(leftKey), | ||
{index: leftKey, ready: true}, | ||
r.table(self.getTableName()).indexCreate(leftKey).do(function() { | ||
return r.table(self.getTableName()).indexWait(leftKey) | ||
}) | ||
) | ||
); | ||
// This could try to create the same index, but that's ok | ||
var queryIndex2 = r.branch( | ||
r.table(joinedModel.getTableName()).indexList().contains(rightKey), | ||
r.table(joinedModel.getTableName()).indexWait(rightKey), | ||
r.branch( | ||
r.table(joinedModel.getTableName()).info()('primary_key').eq(rightKey), | ||
{index: rightKey, ready: true}, | ||
r.table(joinedModel.getTableName()).indexCreate(rightKey).do(function() { | ||
return r.table(joinedModel.getTableName()).indexWait(rightKey) | ||
}) | ||
) | ||
); | ||
self._getModel()._tableReady = false; | ||
joinedModel._getModel()._tableReady = false; | ||
self._getModel()._indexesToCreate++; | ||
joinedModel._getModel()._foreignIndexesToCreate++; | ||
if (self._getModel()._tableCreated === true) { | ||
queryIndex1.run().then(function(result) { | ||
self._indexWasCreated('local'); | ||
joinedModel._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
self._indexWasCreated('local'); | ||
joinedModel._indexWasCreated('foreign'); | ||
} | ||
else { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
} | ||
}) | ||
} | ||
else { | ||
self._getModel()._onTableCreated.push(function() { | ||
queryIndex1.run().then(function() { | ||
self._indexWasCreated('local'); | ||
joinedModel._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
self._indexWasCreated('local'); | ||
joinedModel._indexWasCreated('foreign'); | ||
} | ||
else { | ||
self._getModel()._setError(error); | ||
} | ||
}); | ||
}); | ||
} | ||
joinedModel._getModel()._indexesToCreate++; | ||
self._getModel()._foreignIndexesToCreate++; | ||
if (joinedModel._getModel()._tableCreated === true) { | ||
queryIndex2.run().then(function(result) { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
} | ||
else { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
} | ||
}) | ||
} | ||
else { | ||
joinedModel._getModel()._onTableCreated.push(function() { | ||
queryIndex2.run().then(function() { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
}).error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
joinedModel._indexWasCreated('local'); | ||
self._indexWasCreated('foreign'); | ||
} | ||
else { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
} | ||
}); | ||
}); | ||
} | ||
var query; | ||
@@ -857,41 +611,38 @@ if ((this.getTableName() === joinedModel.getTableName()) | ||
return new Promise(function(resolve, reject) { | ||
var successCb = function() { | ||
self._indexWasCreated('foreign'); | ||
joinedModel._indexWasCreated('foreign'); | ||
var linkPromise = linkModel.ready().then(function() { | ||
return query.run() | ||
.then(function() { | ||
self._getModel()._indexes[leftKey] = true; | ||
joinedModel._getModel()._indexes[rightKey] = true; | ||
resolve(); | ||
} | ||
var errorCb = function(error) { | ||
}) | ||
.error(function(error) { | ||
if (error.message.match(/^Index `/)) { | ||
self._indexWasCreated('foreign'); | ||
joinedModel._indexWasCreated('foreign'); | ||
resolve(); | ||
return; | ||
} | ||
else if (error.message.match(/^Table `.*` already exists/)) { | ||
self._indexWasCreated('foreign'); | ||
joinedModel._indexWasCreated('foreign'); | ||
resolve(); | ||
if (error.message.match(/^Table `.*` already exists/)) { | ||
return; | ||
} | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
throw error; | ||
}); | ||
}) | ||
.then(function() { | ||
self._createIndex(leftKey) | ||
.catch(function(error) { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
}); | ||
else { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
reject(error); | ||
} | ||
} | ||
joinedModel._createIndex(rightKey) | ||
.catch(function(error) { | ||
self._getModel()._setError(error); | ||
joinedModel._getModel()._setError(error); | ||
}); | ||
}); | ||
self._getModel()._foreignIndexesToCreate++; | ||
joinedModel._getModel()._foreignIndexesToCreate++; | ||
if (linkModel._getModel()._tableReady === true) { | ||
query.run().then(successCb).error(errorCb) | ||
} | ||
else { | ||
linkModel._getModel()._onTableCreated.push(function() { | ||
query.run().then(successCb).error(errorCb) | ||
}); | ||
} | ||
}) | ||
joinedModel._waitFor(linkPromise); | ||
self._waitFor(linkPromise); | ||
return Promise.all([self.ready(), joinedModel.ready()]); | ||
} | ||
@@ -898,0 +649,0 @@ }; |
@@ -106,17 +106,4 @@ var Promise = require('bluebird'); | ||
} | ||
if (self._model._getModel()._tableReady === true) { | ||
return self._model.tableReady().then(function() { | ||
return self._executeCallback(fullOptions, parse, options.groupFormat); | ||
} | ||
return new Promise(function(resolve, reject) { | ||
self._model._onTableReady.push(function() { | ||
self._executeCallback(fullOptions, parse, options.groupFormat) | ||
.then(function(result) { | ||
resolve(result); | ||
}) | ||
.catch(function(error) { | ||
reject(error); | ||
}); | ||
}); | ||
}); | ||
@@ -123,0 +110,0 @@ } |
var rethinkdbdash = require('rethinkdbdash'); | ||
var Promise = require('bluebird'); | ||
var Model = require(__dirname+'/model.js'); | ||
@@ -26,2 +27,3 @@ var util = require(__dirname+'/util.js'); | ||
config.db = config.db || 'test'; // We need the default db to create it. | ||
self._config = config; | ||
@@ -50,39 +52,36 @@ self._options = {}; | ||
// Whether the database is available or not. | ||
self._dbReady = false; | ||
// Functions to execute once the database is ready. | ||
// We do not use listeners as this used to crash node when too many listeners | ||
// were added. | ||
self._onDbReady = []; | ||
// Export errors | ||
self.Errors = Errors; | ||
// Initialize the database. | ||
self.dbReady().then().error(function(error) { | ||
throw error; | ||
}); | ||
} | ||
/** | ||
* Initialize our database. | ||
* @return {Promise=} Returns a promise which will resolve when the database is ready. | ||
*/ | ||
Thinky.prototype.dbReady = function() { | ||
var self = this; | ||
if (this._dbReadyPromise) return this._dbReadyPromise; | ||
var r = self.r; | ||
// Callback when the database has been created or is available. | ||
var onDatabaseReady = function() { | ||
self._dbReady = true; | ||
for(var i=0; i<self._onDbReady.length; i++) { | ||
self._onDbReady[i](); | ||
} | ||
} | ||
r.dbList().contains(config.db).do(function(result) { | ||
return r.branch( | ||
result, | ||
{created: 0}, | ||
r.dbCreate(config.db) | ||
) | ||
}).run().then(onDatabaseReady).error(function(error) { | ||
this._dbReadyPromise = r.dbCreate(self._config.db) | ||
.run() | ||
.error(function(error) { | ||
// The `do` is not atomic, we a concurrent query could create the database | ||
// between the time `dbList` is ran and `dbCreate` is. | ||
if (error.message.match(/^Database `.*` already exists in/)) { | ||
onDatabaseReady(); | ||
return; | ||
} | ||
else { | ||
// In case something went wrong here, we do not recover and throw. | ||
throw error; | ||
} | ||
// In case something went wrong here, we do not recover and throw. | ||
throw error; | ||
}); | ||
} | ||
return self._dbReadyPromise; | ||
}; | ||
/** | ||
@@ -132,34 +131,2 @@ * Return the current option used. | ||
self.models[name] = model; | ||
if (fullOptions.init !== false) { | ||
// Create the table, or push the table name in the queue. | ||
var r = self.r; | ||
var onDatabaseReady = function() { | ||
r.tableList().contains(name).do(function(result) { | ||
return r.branch( | ||
result, | ||
{created: 0}, | ||
r.tableCreate(name, {primaryKey: model._pk}) | ||
) | ||
}).run().then(function(result) { | ||
model._tableWasCreated(); | ||
}).error(function(error) { | ||
model._error = error; | ||
}) | ||
}; | ||
if (self._dbReady === true) { | ||
onDatabaseReady(); | ||
} | ||
else { | ||
self._onDbReady.push(onDatabaseReady); | ||
} | ||
} | ||
else { | ||
// We do not initialize the table and suppose that it already exists and | ||
// is ready. | ||
model._getModel()._tableCreated = true; | ||
model.emit('created'); | ||
model._getModel()._tableReady = true; | ||
model.emit('ready'); | ||
} | ||
return model; | ||
@@ -166,0 +133,0 @@ } |
@@ -113,3 +113,7 @@ var util = require(__dirname+'/../util.js'); | ||
} | ||
else if (typeof date === 'string') { | ||
else if (typeof date === 'string' || typeof date === 'number') { | ||
var numericDate = parseInt(date, 10); | ||
if(!isNaN(numericDate)){ | ||
date = numericDate; | ||
} | ||
jsDate = new Date(date); | ||
@@ -116,0 +120,0 @@ if (jsDate.getTime() !== jsDate.getTime()) { |
@@ -112,2 +112,9 @@ var util = require(__dirname+'/../util.js'); | ||
if(typeof number === 'string'){ | ||
var numericString = parseFloat(number); | ||
if(!isNaN(numericString)){ | ||
number = numericString; | ||
} | ||
} | ||
if ((typeof number === 'function') && (number._query !== undefined)) { | ||
@@ -114,0 +121,0 @@ // We do not check ReQL terms |
{ | ||
"name": "thinky", | ||
"version": "2.0.8", | ||
"version": "2.0.9", | ||
"description": "RethinkDB ORM for Node.js", | ||
@@ -5,0 +5,0 @@ "main": "lib/thinky.js", |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
0
204727
5551