offshore
Version:
An ORM for Node.js
91 lines (73 loc) • 2.43 kB
JavaScript
/**
* Dependencies
*/
var _ = require('lodash');
var extend = require('../utils/extend');
var AdapterBase = require('../adapter');
var utils = require('../utils/helpers');
var AdapterMixin = require('./adapters');
var hop = utils.object.hasOwnProperty;
/**
* Query
*/
var Query = module.exports = function() {
// Create a reference to an internal Adapter Base
this.adapter = new AdapterBase({
connections: this.connections,
query: this,
collection: this.tableName || this.identity,
identity: this.identity
});
// Mixin Custom Adapter Functions.
AdapterMixin.call(this);
// Generate Dynamic Finders
this.buildDynamicFinders();
};
/**
* Automigrate
*
* @param {Function} cb
*/
Query.prototype.sync = function(cb) {
var self = this;
// If any adapters used in this collection have syncable turned off set migrate to safe.
//
// I don't think a collection would ever need two adapters where one needs migrations and
// the other doesn't but it may be a possibility. The way the auto-migrations work now doesn't
// allow for this either way so this should be good. We will probably need to revist this soonish
// however and take a pass at getting something working for better migration systems.
// - particlebanana
_.keys(this.connections).forEach(function(connectionName) {
var adapter = self.connections[connectionName]._adapter;
// If not syncable, don't sync
if (hop(adapter, 'syncable') && !adapter.syncable) {
self.migrate = 'safe';
}
});
// Assign synchronization behavior depending on migrate option in collection
if (this.migrate && ['drop', 'alter', 'create', 'safe'].indexOf(this.migrate) > -1) {
// Determine which sync strategy to use
var strategyMethodName = 'migrate' + utils.capitalize(this.migrate);
// Run automigration strategy
this.adapter[strategyMethodName](function(err) {
if (err) return cb(err);
cb();
});
}
// Throw Error
else cb(new Error('Invalid `migrate` strategy defined for collection. Must be one of the following: drop, alter, create, safe'));
};
_.extend(
Query.prototype,
require('./validate'),
require('./ddl'),
require('./dql'),
require('./aggregate'),
require('./composite'),
require('./finders/basic'),
require('./finders/helpers'),
require('./finders/dynamicFinders'),
require('./stream')
);
// Make Extendable
Query.extend = extend;