不要怂,就是干,撸起袖子干!

sequelize.js 2.78 KB
var Utils        = require("./utils")
  , ModelFactory = require("./model-factory")
  , DataTypes    = require('./data-types')
  , ModelManager = require("./model-manager")

var Sequelize = module.exports = function(database, username, password, options) {
  options = options || {}

  Utils._.reject(options, function(_, key) {
    return ["host", "port", "disableTableNameModification"].indexOf(key) > -1
  })

  this.options = options
  this.options.connector = this.options.connector || 'mysql'
  this.config = {
    database: database,
    username: username,
    password: (( (["", null, false].indexOf(password) > -1) || (typeof password == 'undefined')) ? null : password),
    host    : options.host || 'localhost',
    port    : options.port || 3306
  }

  var ConnectorManager = require("./connectors/" + this.options.connector + "/connector-manager")

  this.modelManager = new ModelManager(this)
  this.connectorManager = new ConnectorManager(this, this.config)
}

Sequelize.Utils = Utils
Sequelize.Utils._.map(DataTypes, function(sql, accessor) { Sequelize[accessor] = sql})

Sequelize.prototype.define = function(modelName, attributes, options) {
  options = options || {}

  if(this.options.define)
    options = Sequelize.Utils.merge(options, this.options.define)

  var model = this.modelManager.addModel(new ModelFactory(modelName, attributes, options))

  return model
}

Sequelize.prototype.import = function(path) {
  var defineCall = require(path)
  return defineCall(this, DataTypes)
}

Sequelize.prototype.query = function(sql, callee, options) {
  options = options || {}

  if(this.options.query)
    options = Sequelize.Utils.merge(options, this.options.query)

  options.logging = this.options.hasOwnProperty('logging') ? this.options.logging : true

  return this.connectorManager.query(sql, callee, options)
}

Sequelize.prototype.sync = function(options) {
  options = options || {}

  if(this.options.sync)
    options = Sequelize.Utils.merge(options, this.options.sync)

  var self = this
  var eventEmitter = new Utils.CustomEventEmitter(function() {
    var chainer = new Utils.QueryChainer

    self.modelManager.models.forEach(function(model) { chainer.add(model.sync(options)) })

    chainer
      .run()
      .on('success', function() { eventEmitter.emit('success', null) })
      .on('failure', function(err) { eventEmitter.emit('failure', err) })
  })
  return eventEmitter.run()
}

Sequelize.prototype.drop = function() {
  var self = this

  return new Utils.CustomEventEmitter(function(emitter) {
    var chainer = new Utils.QueryChainer

    self.modelManager.models.forEach(function(model) { chainer.add(model.drop()) })

    chainer
      .run()
      .on('success', function() { emitter.emit('success', null) })
      .on('failure', function(err) { emitter.emit('failure', err) })
  }).run()
}