Sequelize

declaration

Utils

Utils
    var Utils         = require("../../utils")
      , AbstractQuery = require('../abstract/query')
    
    module.exports = (function() {
      var Query = function(client, sequelize, callee, options) {
        var self = this
    
        this.client = client
        this.sequelize = sequelize
        this.callee = callee
        this.options = Utils._.extend({
          logging: console.log,
          plain: false,
          raw: false
        }, options || {})
    
        if(this.options.logging === true) {
          console.log('DEPRECATION WARNING: The logging-option should be either a function or false. Default: console.log')
          this.options.logging = console.log
        }
    
        if(this.options.logging == console.log) {
          // using just console.log will break in node < 0.6
          this.options.logging = function(s) { console.log(s) }
        }
      }
      Utils.inherit(Query, AbstractQuery)
    
      Query.prototype.run = function(sql) {
        var self = this
    
        this.sql = sql
    
        if(this.options.logging !== false) {
          this.options.logging('Executing: ' + this.sql)
        }
    
        var results = [];
        var receivedError = false;
    
        var query = this.client.query(sql)
        query.on('row', function(row) {
          if (self.callee && (self.sql.indexOf('INSERT INTO') == 0 || self.sql.indexOf('UPDATE') == 0)) {
            Utils._.forEach(row, function(value, key) {
              self.callee[key] = value
            })
            results.push(self.callee)
          }
    
          if (self.sql.indexOf('SELECT table_name FROM information_schema.tables') == 0) {
            results.push(Utils._.values(row))
          } else if (self.sql.indexOf('SELECT relname FROM pg_class WHERE oid IN') == 0) {
            results.push(Utils._.values(row))
          } else if (self.sql.indexOf('SELECT') == 0) {
            // transform results into real model instances
            // return the first real model instance if options.plain is set (e.g. Model.find)
            if (self.options.raw) {
              results.push(row);
            } else {
              results.push(self.callee.build(row, { isNewRecord: false }))
            }
          } else if((self.sql.indexOf('SHOW') == 0) || (self.sql.indexOf('DESCRIBE') == 0)) {
            results.push(row)
          }
        });
    
        query.on('end', function() {
          self.emit('sql', self.sql)
          if (receivedError) return;
    
          if (self.sql.indexOf('SELECT') == 0) {
            if (self.options.plain) {
              self.emit('success', (results.length == 0) ? null : results[0])
            } else {
              self.emit('success', results)
            }
          } else if((self.sql.indexOf('SHOW') == 0) || (self.sql.indexOf('DESCRIBE') == 0)) {
            self.emit('success', results)
          } else if (self.sql.indexOf('INSERT INTO') == 0) {
            self.emit('success', results[0])
          } else if (self.sql.indexOf('UPDATE') == 0) {
            self.emit('success', self.callee)
          } else {
            self.emit('success', results)
          }
        });
    
        query.on('error', function(err) {
          receivedError = true
          self.emit('error', err, self.callee)
        });
    
        return this
      }
    
      return Query
    })()