mesa
Version: 
simple elegant sql for nodejs
332 lines (315 loc) • 8.8 kB
JavaScript
// Generated by CoffeeScript 1.10.0
var _, mesa, mohair;
_ = require('underscore');
mesa = require('./mesa');
module.exports = Object.create(mesa);
mohair = module.exports._mohair.escape(function(string) {
  return string.split(".").map(function(str) {
    return "\"" + str + "\"";
  }).join('.');
});
module.exports._mohair = mohair;
module.exports._originalMohair = mohair;
module.exports.getConnection = function(cb) {
  var connection;
  connection = this._connection;
  if (connection == null) {
    throw new Error("the method you are calling requires a call to connection() before it");
  }
  if ('function' === typeof connection) {
    return connection(cb);
  }
  return process.nextTick(function() {
    return cb(null, connection);
  });
};
module.exports.replacePlaceholders = function(sql) {
  var index;
  index = 1;
  return sql.replace(/\?/g, function() {
    return '$' + index++;
  });
};
module.exports.returning = function(arg) {
  if ('string' !== typeof arg) {
    throw new Error('must be a string');
  }
  if (arg.length === 0) {
    throw new Error('must not be the empty string');
  }
  return this.set('_returning', arg);
};
module.exports.insert = function(data, cb) {
  var cleanData, query, returning, self, sql;
  self = this;
  self.assertConnection();
  self.assertTable();
  self.assertAttributes();
  cleanData = _.pick(data, self._attributes);
  if (Object.keys(cleanData).length === 0) {
    throw new Error('nothing to insert');
  }
  query = self._mohair.insert(cleanData);
  returning = self._returning ? self._returning : self._primaryKey;
  sql = self.replacePlaceholders(query.sql() + (" RETURNING " + returning));
  return self.getConnection(function(err, connection, done) {
    if (err != null) {
      if (typeof done === "function") {
        done();
      }
      cb(err);
      return;
    }
    return connection.query(sql, query.params(), function(err, results) {
      var row;
      if (err != null) {
        if (typeof done === "function") {
          done();
        }
        cb(err);
        return;
      }
      row = results.rows[0];
      if (typeof done === "function") {
        done();
      }
      return cb(null, self._returning != null ? row : row[self._primaryKey]);
    });
  });
};
module.exports.insertMany = function(array, cb) {
  var query, returning, self, sql;
  self = this;
  self.assertConnection();
  self.assertTable();
  self.assertAttributes();
  query = self._mohair.insertMany(array.map((function(_this) {
    return function(x) {
      return _.pick(x, self._attributes);
    };
  })(this)));
  returning = self._returning ? self._returning : self._primaryKey;
  sql = self.replacePlaceholders(query.sql() + (" RETURNING " + returning));
  return self.getConnection(function(err, connection, done) {
    if (err != null) {
      if (typeof done === "function") {
        done();
      }
      cb(err);
      return;
    }
    return connection.query(sql, query.params(), function(err, results) {
      if (err != null) {
        if (typeof done === "function") {
          done();
        }
        cb(err);
        return;
      }
      if (typeof done === "function") {
        done();
      }
      return cb(null, self._returning != null ? results.rows : _.pluck(results.rows, self._primaryKey));
    });
  });
};
module.exports["delete"] = function(cb) {
  var query, self, sql;
  self = this;
  self.assertConnection();
  self.assertTable();
  query = self._mohair["delete"]();
  sql = self.replacePlaceholders(query.sql());
  return self.getConnection(function(err, connection, done) {
    if (err != null) {
      if (typeof done === "function") {
        done();
      }
      cb(err);
      return;
    }
    return connection.query(sql, query.params(), function(err, results) {
      if (err != null) {
        if (typeof done === "function") {
          done();
        }
        cb(err);
        return;
      }
      if (typeof done === "function") {
        done();
      }
      return cb(null, results);
    });
  });
};
module.exports.update = function(updates, cb) {
  var cleanUpdates, query, self, sql;
  self = this;
  self.assertConnection();
  self.assertTable();
  self.assertAttributes();
  cleanUpdates = _.pick(updates, self._attributes);
  if (Object.keys(cleanUpdates).length === 0) {
    throw new Error('nothing to update');
  }
  query = self._mohair.update(cleanUpdates);
  sql = self.replacePlaceholders(query.sql());
  if (self._returning != null) {
    sql += " RETURNING " + self._returning;
  }
  return self.getConnection(function(err, connection, done) {
    if (err != null) {
      if (typeof done === "function") {
        done();
      }
      cb(err);
      return;
    }
    return connection.query(sql, query.params(), function(err, results) {
      if (err != null) {
        if (typeof done === "function") {
          done();
        }
        cb(err);
        return;
      }
      if (typeof done === "function") {
        done();
      }
      if (self._returning == null) {
        return cb(null, results);
      }
      return cb(null, results.rows);
    });
  });
};
module.exports.first = function(cb) {
  var params, self, sql;
  self = this;
  self.assertConnection();
  sql = self.replacePlaceholders(self.sql());
  params = self.params();
  return self.getConnection(function(err, connection, done) {
    if (err != null) {
      if (typeof done === "function") {
        done();
      }
      cb(err);
      return;
    }
    if (typeof self.hookBeforeFirst === "function") {
      self.hookBeforeFirst(self, connection, sql, params);
    }
    return connection.query(sql, params, function(err, results) {
      var record;
      if (typeof done === "function") {
        done();
      }
      if (typeof self.hookAfterFirst === "function") {
        self.hookAfterFirst(self, connection, sql, params, err, results);
      }
      if (err != null) {
        cb(err);
        return;
      }
      record = results.rows[0];
      if (record == null) {
        cb(null, null);
        return;
      }
      if (typeof self.hookBeforeGetIncludesForFirst === "function") {
        self.hookBeforeGetIncludesForFirst(self, connection, record);
      }
      return self.connection(connection)._getIncludes([record], function(err, withIncludes) {
        if (typeof self.hookAfterGetIncludesForFirst === "function") {
          self.hookAfterGetIncludesForFirst(self, connection, err, withIncludes);
        }
        if (err != null) {
          cb(err);
          return;
        }
        return cb(null, withIncludes[0]);
      });
    });
  });
};
module.exports.find = function(cb) {
  var params, self, sql;
  self = this;
  self.assertConnection();
  sql = self.replacePlaceholders(self.sql());
  params = self.params();
  return self.getConnection(function(err, connection, done) {
    if (err != null) {
      if (typeof done === "function") {
        done();
      }
      cb(err);
      return;
    }
    if (typeof self.hookBeforeFind === "function") {
      self.hookBeforeFind(self, connection, sql, params);
    }
    return connection.query(sql, params, function(err, results) {
      var records;
      if (typeof done === "function") {
        done();
      }
      if (typeof self.hookAfterFind === "function") {
        self.hookAfterFind(self, connection, sql, params, err, results);
      }
      if (err != null) {
        cb(err);
        return;
      }
      records = results.rows;
      if (records.length === 0) {
        cb(null, []);
        return;
      }
      if (typeof self.hookBeforeGetIncludesForFind === "function") {
        self.hookBeforeGetIncludesForFind(self, connection, records);
      }
      return self.connection(connection)._getIncludes(records, function(err, withIncludes) {
        if (typeof self.hookAfterGetIncludesForFind === "function") {
          self.hookAfterGetIncludesForFind(self, connection, err, withIncludes);
        }
        if (err != null) {
          cb(err);
          return;
        }
        return cb(null, withIncludes);
      });
    });
  });
};
module.exports.exists = function(cb) {
  var query, self, sql;
  self = this;
  self.assertConnection();
  query = self._mohair;
  sql = self.replacePlaceholders(query.sql());
  return self.getConnection(function(err, connection, done) {
    if (err != null) {
      if (typeof done === "function") {
        done();
      }
      cb(err);
      return;
    }
    return connection.query(sql, query.params(), function(err, results) {
      if (err != null) {
        if (typeof done === "function") {
          done();
        }
        cb(err);
        return;
      }
      if (typeof done === "function") {
        done();
      }
      return cb(null, results.rows.length !== 0);
    });
  });
};