UNPKG

magic-models

Version:

A simple, free software magical ORM.

132 lines (123 loc) 3.47 kB
var _ = require('lodash'); var uvrun = require('uvrun-12'); var tools = require('./tools'); var where = require('./where'); function select(orm, model, options, callback) { var query = 'SELECT'; if (options.count) query += ' COUNT(*) AS count'; else { if (!options.fields) options.fields = _.keys(model.fields); else if (typeof(options.fields) == 'string') options.fields = [options.fields]; _.each(options.fields, function(where) { if (model.fields[where]) query += ' `' + orm.client.escape(model.fields[where].fieldName) + '` AS `' + orm.client.escape(where) + '`,'; }); query = query.substring(0, query.length - 1); } query += ' FROM `' + model.table + '`'; if (options.where) query += ' WHERE' + where(orm, options.where); if (options.group) { query += ' GROUP BY'; if (typeof(options.group) == 'string') options.group = [options.group]; _.each(options.group, function(group) { query += ' `' + orm.client.escape(group) + '`,'; }); query = query.substring(0, query.length - 1); } if (options.order) { query += ' ORDER BY'; _.each(options.order, function(order, field) { query += ' `' + orm.client.escape(field) + '` '; query += order.match(/^desc$/i) ? 'DESC,' : 'ASC,'; }); query = query.substring(0, query.length - 1); } if (options.limit) { query += ' LIMIT ' + parseInt(options.limit); if (options.offset) query += ' OFFSET ' + parseInt(options.offset); } orm.query(query, callback); } function typed(orm, model, options, callback, type) { if (options == undefined) options = {}; if (type) { if (type == 'find') options.limit = 1; else if (type == 'count') options.count = true; } model.beforeFind(options, function(options) { select(orm, model, options, function(e, r, i) { model.afterFind(e, r, i, callback); }); }); } module.exports.all = function(orm, model, options, callback) { if (typeof(options) == 'function') { callback = options; options = {}; } typed(orm, model, options, callback); } module.exports.find = function(orm, model, options, callback) { if (typeof(options) == 'function') { callback = options; options = {}; } function surcharged(errors, rows, infos) { if (rows && rows[0]) rows = rows[0]; callback(errors, rows, infos); } typed(orm, model, options, surcharged, 'find'); } module.exports.count = function(orm, model, options, callback) { if (typeof(options) == 'function') { callback = options; options = {}; } function surcharged(errors, rows, infos) { var count = rows; if (rows) { if (rows.length > 1) { count = []; _.each(rows, function(row) { count.push(parseInt(row.count)); }); } else count = parseInt(rows[0].count); } callback(errors, count, infos); } typed(orm, model, options, surcharged, 'count'); } function async(orm, model, values, method) { var datas; module.exports[method](orm, model, values, function(e, r, i) { datas = { errors: e, rows: r, infos: i }; }); while (!datas) uvrun.runOnce(); return datas; } module.exports.allAsync = function(orm, model, values) { return async(orm, model, values, 'all'); } module.exports.countAsync = function(orm, model, values) { return async(orm, model, values, 'count'); } module.exports.findAsync = function(orm, model, values) { return async(orm, model, values, 'find'); }