UNPKG

tribedb

Version:

Unlimited expansion MySQL cluster storage system

257 lines (213 loc) 5.44 kB
/** * * select * */ const pool = require('./pool.js'); const config = require('./config.js'); /** * 数据适配处理 */ function dataHandle(table, data) { let is_single = ! Array.isArray(data); if(is_single){ dataHandleSingle(table, data); }else{ for(let i in data){ dataHandleSingle(table, data[i]); } } } function dataHandleSingle(table, data) { let handles = config.dataAdapter[table]; if( ! handles ){ return; } // 开始处理 for(let i in handles){ handles[i](data); } } /** * 查询数据 */ exports.select = function(table, field, where, single) { return new Promise(function (resolve, reject) { select(table, (field||'*'), where, single, function(err, rows){ err && reject(err); resolve(rows); }); }); }; /** * 异步查询数据 */ function select(table, field, where, single, callback) { pool.conn(table, {read:1}, function(err, conn){ if(err) callback(err); if(where) where = ' WHERE '+where; if(single) where += ' LIMIT 1'; let sql = "SELECT "+field+" FROM `"+table+"` "+where; // console.log(sql); conn.query(sql, function(err, rows){ conn.release(); // 必须释放回连接池! if(err) return callback(err); let resdata = single ? rows[0] : rows; dataHandle(table, resdata); // 数据适配处理 callback(null, resdata); // 返回 }); }); } /** * 查询 多个表 数据 并自动组装 */ exports.select_merge = function(conditions) { return new Promise(function (resolve, reject) { let step = 0 , length = 0 , mgkey = 'id' // 组装键 , single = false , datas = [] , single_res = {} // 返回 ; for(let table in conditions){ let one = conditions[table]; if(!length){ // 配置 single = one.single; mgkey = one.key || mgkey; } // 请求数据 query(one) length++; } // 到达 function query(one) { select(one.table, (one.field||'*'), one.where, single, function(err, rows){ step++; if(err) return reject(err); datas.push(rows); if(single) single_res = Object.assign(single_res, rows); if(step==length) merge(); // 合并 }); } // 合并 function merge() { if(single){ return resolve(single_res); } // 合并 let res = [] , leg = datas.length ; for(let i in datas[0]){ let one = datas[0][i]; for(let j=1; j<leg; j++){ one = Object.assign(one, array_select(datas[j], mgkey, one[mgkey]) ); } res.push(one); } return resolve(res); } }); } /** * 查询附带 */ exports.select_attach = function(data, table, field, opt) { return new Promise(async (resolve, reject)=>{ opt = opt || {}; field = Array.isArray(field) ? field : field.split(','); // 参数 let data_key = opt['key'] || table+'_id'; let auto_id = opt['id'] || 'id'; let shield = opt['shield'] || ''; let delkey = opt['delkey']; // 开关 let single = ! Array.isArray(data); if(single){ data = [data]; } let hasid = field.indexOf(auto_id) > -1; if(!hasid && field.indexOf('*')==-1){ field.unshift('`'+auto_id+'`'); } // 取出id列表 let ids = array_unique(array_listem(data, data_key)); if( ids.length ){ // 批量查询数据 let infos = await exports.select(table, field.join(','), auto_id+' IN('+ids.join(',')+')'); dataHandle(table, infos); // 数据适配处理 // 拼装数据 for(let i in data){ let info = array_select(infos, auto_id, data[i][data_key]); if( !info ) continue; if( !hasid ){ // delete info[auto_id]; } if(shield){ data[i][shield] = Object.assign({}, info); }else{ data[i] = Object.assign({}, data[i], info); } if(delkey){ // 删除 key delete data[i][ data_key ]; } } } // 输出 resolve(single ? data[0] : data); }); } /** * 解析 条件生成 SQL */ function array_select(arr, k, v) { for(let i in arr){ let one = arr[i]; if(one[k]==v){ return one; } } return null; } /** * 取得数组中元素的某个属性 单独返回数组元素 */ function array_listem (ary, key) { var reary = [] , leg = ary.length; for(var i=0; i<leg; i++){ var d = ary[i][key]; d?reary.push(d):0; } return reary; }; /** * 去重 */ function array_unique(ary){ var s=new Set(); ary.map((item,index)=>{ s.add(item) }) var temp=[]; for(var i of s){ temp.push(i) } return temp; } /** * 解析 条件生成 SQL */ function parseCondition(cond) { }