UNPKG

access-db

Version:

[统一数据库的连接]Unified access to all kinds of databases

427 lines (426 loc) 19.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const process_1 = require("process"); const constants_1 = require("../constants/constants"); const error_1 = require("../constants/error"); const utils_1 = require("./utils"); function updateTrans(params, query, dbType) { let result; //Mongo 类平台 if (dbType === constants_1.PLATFORM_NAME.MONGODB) { let operate = {}; for (let pa in params) { let temp = {}; if (!(0, utils_1.isArray)(params[pa])) { //不是数组,则直接 set temp[pa] = params[pa]; operate = Object.assign(Object.assign({}, operate), { "$set": Object.assign(Object.assign({}, operate['$set']), temp) }); continue; } if (constants_1.MONGODB_UPDATE_METHORD.indexOf(params[pa][0]) > -1) { switch (params[pa][0]) { case 'set': temp[pa] = params[pa][1]; operate = Object.assign(Object.assign({}, operate), { "$set": Object.assign(Object.assign({}, operate['$set']), temp) }); break; case 'geo': let temp2 = params[pa], tempGeo = {}; temp2.shift(); if (temp2.length > 1) { tempGeo = (0, utils_1.cloneDeep)({ type: 'Polygon', coordinates: [temp2] }); } else { tempGeo = (0, utils_1.cloneDeep)({ type: 'Point', coordinates: temp2[0] }); } temp[pa] = tempGeo; operate = Object.assign(Object.assign({}, operate), { "$set": Object.assign(Object.assign({}, operate['$set']), temp) }); break; case 'unset': temp[pa] = ''; operate = Object.assign(Object.assign({}, operate), { "$unset": Object.assign(Object.assign({}, operate['$unset']), temp) }); break; case 'incr': temp[pa] = params[pa][1]; operate = Object.assign(Object.assign({}, operate), { "$inc": Object.assign(Object.assign({}, operate['$inc']), temp) }); break; case 'append': temp[pa] = { "$each": (0, utils_1.isArray)(params[pa][1]) ? params[pa][1] : [params[pa][1]] }; operate = Object.assign(Object.assign({}, operate), { "$push": Object.assign(Object.assign({}, operate['$push']), temp) }); break; case 'uAppend': temp[pa] = { "$each": (0, utils_1.isArray)(params[pa][1]) ? params[pa][1] : [params[pa][1]] }; operate = Object.assign(Object.assign({}, operate), { "$addToSet": Object.assign(Object.assign({}, operate['$addToSet']), temp) }); break; case 'remove': temp[pa] = { "$in": (0, utils_1.isArray)(params[pa][1]) ? params[pa][1] : [params[pa][1]] }; operate = Object.assign(Object.assign({}, operate), { "$pull": Object.assign(Object.assign({}, operate['$pull']), temp) }); break; default: throw new Error(error_1.UPDATE_ERROR); } } else { //直接 set temp[pa] = params[pa]; operate = Object.assign(Object.assign({}, operate), { "$set": Object.assign(Object.assign({}, operate['$set']), temp) }); } } result = operate; } //mysql类 if (dbType === constants_1.PLATFORM_NAME.MYSQL) { let operate = []; for (let pa in params) { if (!(0, utils_1.isArray)(params[pa])) { //不是数组,则直接 set operate.push(`${pa} = ${(0, utils_1.changeSqlParam)(params[pa])}`); } else { if (constants_1.MYSQL_UPDATE_METHORD.indexOf(params[pa][0]) > -1) { switch (params[pa][0]) { case 'set': operate.push(`${pa} = ${(0, utils_1.changeSqlParam)(params[pa][1])}`); break; case 'unset': operate.push(`${pa} = NULL`); break; case 'incr': if (params[pa][1] >= 0) { operate.push(`${pa} = ${pa} + ${params[pa][1]}`); } else { operate.push(`${pa} = ${pa} - ${Math.abs(params[pa][1])}`); } break; default: throw new Error(error_1.UPDATE_ERROR); } } else { //直接 set operate.push(`${pa} = ${(0, utils_1.changeSqlParam)(params[pa])}`); } } } result = operate; } //redis if (dbType === constants_1.PLATFORM_NAME.REDIS) { let [table, id] = query, keyData = []; keyData.push({ method: 'SETNX', key: table + ':id:key:' + id, value: `${new Date().getTime()}${process_1.hrtime.bigint()}` //更新更新时间 }); for (let pa in params) { if (pa === 'id') continue; if (!(0, utils_1.isArray)(params[pa])) { keyData.push({ method: 'HSET', key: table + ':' + id, value: [pa, `${params[pa]}`] }); } else { if (constants_1.REDIS_UPDATE_METHORD.indexOf(params[pa][0]) > -1) { switch (params[pa][0]) { case 'set': keyData.push({ method: 'HSET', key: table + ':' + id, value: [pa, `${params[pa][1]}`] }); break; case 'unset': keyData.push({ method: 'HDEL', key: table + ':' + id, value: pa }); break; case 'incr': if (params[pa][1].toString().indexOf('.') > -1) { keyData.push({ method: 'HINCRBYFLOAT', key: table + ':' + id, value: [pa, params[pa][1]] }); } else { keyData.push({ method: 'HINCRBY', key: table + ':' + id, value: [pa, params[pa][1]] }); } break; default: throw new Error(error_1.UPDATE_ERROR); } } else { //直接 set keyData.push({ method: 'HSET', key: table + ':' + id, value: [pa, `${params[pa]}`] }); } } } result = keyData; } //fastdb if (dbType === constants_1.PLATFORM_NAME.FASTDB) { function operVale(methodValue, oldValue) { if (!(0, utils_1.isArray)(methodValue)) { //不是数组,则直接 set return methodValue; } if (constants_1.FASTDB_UPDATE_METHORD.indexOf(methodValue[0]) > -1) { switch (methodValue[0]) { case 'set': return methodValue[1]; case 'geo': let temp2 = methodValue, tempGeo = {}; temp2.shift(); if (temp2.length > 1) { tempGeo = (0, utils_1.cloneDeep)({ type: 'Polygon', coordinates: [temp2] }); } else { tempGeo = (0, utils_1.cloneDeep)({ type: 'Point', coordinates: temp2[0] }); } return tempGeo; case 'unset': return null; case 'incr': return oldValue + methodValue[1]; case 'append': if ((0, utils_1.isArray)(methodValue[1])) { oldValue = oldValue.concat(methodValue[1]); } else { oldValue.push(methodValue[1]); } return oldValue; case 'uAppend': if ((0, utils_1.isArray)(methodValue[1])) { for (let c = 0; c < methodValue[1].length; c++) { if (oldValue.indexOf(methodValue[1][c]) === -1) { oldValue.push(methodValue[1][c]); } } } else { if (oldValue.indexOf(methodValue[1]) === -1) { oldValue.push(methodValue[1]); } } return oldValue; case 'remove': let tempv = []; if ((0, utils_1.isArray)(methodValue[1])) { for (let a = 0; a < oldValue.length; a++) { if (methodValue[1].indexOf(oldValue[a]) === -1) { tempv.push(oldValue[a]); } } } else { for (let a = 0; a < oldValue.length; a++) { if ([methodValue[1]].indexOf(oldValue[a]) === -1) { tempv.push(oldValue[a]); } } } return tempv; default: throw new Error(error_1.UPDATE_ERROR); } } else { //没有找到对应方法,说明就是数组,直接 set return methodValue; } } function changeJson(old, pa, methodValue) { let paList = pa.split('.'); // 对参数a.b.c进行数组化 let tempJ = Object.assign({}, old); switch (paList.length) { case 1: tempJ[paList[0]] = operVale(methodValue, old[paList[0]]); break; case 2: tempJ[paList[0]][paList[1]] = operVale(methodValue, old[paList[0]][paList[1]]); break; case 3: tempJ[paList[0]][paList[1]][paList[2]] = operVale(methodValue, old[paList[0]][paList[1]][paList[2]]); break; case 4: tempJ[paList[0]][paList[1]][paList[2]][paList[3]] = operVale(methodValue, old[paList[0]][paList[1]][paList[2]][paList[3]]); break; case 5: tempJ[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]] = operVale(methodValue, old[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]]); break; case 6: tempJ[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]][paList[5]] = operVale(methodValue, old[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]][paList[5]]); break; case 7: tempJ[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]][paList[5]][paList[6]] = operVale(methodValue, old[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]][paList[5]][paList[6]]); break; case 8: tempJ[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]][paList[5]][paList[6]][paList[7]] = operVale(methodValue, old[paList[0]][paList[1]][paList[2]][paList[3]][paList[4]][paList[5]][paList[6]][paList[7]]); break; default: throw new Error(error_1.FASTDB_UPDATE_JSON_ERROR); } return tempJ; } let oldJson = query; for (let pa in params) { oldJson = changeJson(oldJson, pa, params[pa]); } result = oldJson; } // elasticsearch if (dbType === constants_1.PLATFORM_NAME.ELASTICSEARCH) { let operate = { source: '', params: {} }; for (let pa in params) { let temp = {}, tempSource = ''; if (!(0, utils_1.isArray)(params[pa])) { //不是数组,则直接 set tempSource = `ctx._source.${pa} = params.${pa};`; temp[pa] = params[pa]; operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); continue; } if (constants_1.ELASTICSEARCH_UPDATE_METHORD.indexOf(params[pa][0]) > -1) { switch (params[pa][0]) { case 'set': tempSource = `ctx._source.${pa} = params.${pa};`; temp[pa] = params[pa][1]; operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); break; case 'geo': let temp2 = params[pa], tempGeo = {}; temp2.shift(); if (temp2.length > 1) { tempGeo = (0, utils_1.cloneDeep)({ type: 'Polygon', coordinates: [temp2] }); } else { tempGeo = (0, utils_1.cloneDeep)({ type: 'Point', coordinates: temp2[0] }); } tempSource = `ctx._source.${pa} = params.${pa};`; temp[pa] = tempGeo; operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); break; case 'unset': tempSource = `ctx._source.${pa} = params.${pa};`; temp[pa] = null; operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); break; case 'incr': tempSource = `ctx._source.${pa} += params.${pa};`; temp[pa] = params[pa][1]; operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); break; case 'append': temp[pa] = params[pa][1]; if ((0, utils_1.isArray)(temp[pa])) { tempSource = ` for(int i = 0; i < params.${pa}.length; i++){ ctx._source.${pa}.add(params.${pa}[i]); } `; } else { tempSource = `ctx._source.${pa}.add(params.${pa});`; } operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); break; case 'uAppend': temp[pa] = params[pa][1]; if ((0, utils_1.isArray)(temp[pa])) { tempSource = ` for(int i = 0; i < params.${pa}.length; i++){ if (!ctx._source.${pa}.contains(params.${pa}[i])) { ctx._source.${pa}.add(params.${pa}[i]);} } `; } else { tempSource = `if (!ctx._source.${pa}.contains(params.${pa})) { ctx._source.${pa}.add(params.${pa});}`; } operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); break; case 'remove': temp[pa] = params[pa][1]; if ((0, utils_1.isArray)(temp[pa])) { tempSource = ` for (int i = ctx._source.${pa}.length - 1; i >= 0; i--) { if (params.${pa}.contains(ctx._source.${pa}[i])) { ctx._source.${pa}.remove(i) } } `; } else { tempSource = ` for (int i = ctx._source.${pa}.length - 1; i >= 0; i--) { if (params.${pa} == ctx._source.${pa}[i]) { ctx._source.${pa}.remove(i) } } `; } operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); break; default: throw new Error(error_1.UPDATE_ERROR); } } else { //直接 set tempSource = `ctx._source.${pa} = params.${pa};`; temp[pa] = params[pa]; operate.source += tempSource; operate.params = Object.assign(Object.assign({}, operate.params), temp); } } result = operate; } return result; } exports.default = updateTrans;