tribedb
Version:
Unlimited expansion MySQL cluster storage system
257 lines (213 loc) • 5.44 kB
JavaScript
/**
*
* 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)
{
}