import { RDSDataService, } from "aws-sdk"; import { QueryBuilderBaseParamEnum } from "../enums"; import { LeQuerybuilderAuroraMysqlDataApiError, LeQuerybuilderAuroraMysqlDataApiErrorEnum } from "../error"; import { QueryBuilderConfField } from "../interfaces"; import { FieldTypeToParamEnumFunc } from "../types"; import { classLikeFormation } from "../utils"; import { getParameterField } from "./aurora-data-api-query-builder-common"; import { formatJoinableTables, JoinableTable } from "./join-query"; import { formatWhere, WhereQuery } from "./where-query"; export interface QBUpdateBuilder { tables: JoinableTable[]; wheres: WhereQuery[]; fields: QueryBuilderConfField[]; } export function ubNew(): QBUpdateBuilder { return { fields: [], tables: [], wheres: [], }; } export function ubFormation any; }>(obj: T, classConf: QBUpdateBuilder) { return classLikeFormation(obj, classConf); } export function ubFormat(confobj: QBUpdateBuilder): { parameters: RDSDataService.SqlParameter[]; sql: string; } { if (confobj.tables.length === 0) { throw new LeQuerybuilderAuroraMysqlDataApiError(LeQuerybuilderAuroraMysqlDataApiErrorEnum.FormatError); } if (confobj.fields.length === 0) { throw new LeQuerybuilderAuroraMysqlDataApiError(LeQuerybuilderAuroraMysqlDataApiErrorEnum.FormatError); } // dont update all inside app, unless you do 1=1 if (confobj.wheres.length === 0) { throw new LeQuerybuilderAuroraMysqlDataApiError(LeQuerybuilderAuroraMysqlDataApiErrorEnum.FormatError); } const setArr = []; const parameters: RDSDataService.SqlParameter[] = []; let paramCounter = 0; const tableFormatPart = formatJoinableTables(confobj); let tableStr = tableFormatPart.str; for (const param of tableFormatPart.params) { const paramName = `p${paramCounter++}`; const val = getParameterField(param.type, param.val); tableStr = tableStr.replace(":?", ":" + paramName); parameters.push({ name: paramName, value: val, }); } for (const field of confobj.fields) { if (typeof field.raw !== "undefined") { setArr.push(`${field.name} = ${field.val}`); continue; } const paramType = field.type; const val = getParameterField(paramType, field.val); const paramName = `p${paramCounter++}`; setArr.push(`${field.name} = :${paramName}`); parameters.push({ name: paramName, value: val, }); } const whereFormatPart = formatWhere(confobj); let whereStr = whereFormatPart.str; for (const param of whereFormatPart.params) { const paramName = `p${paramCounter++}`; const val = getParameterField(param.type, param.val); whereStr = whereStr.replace(":?", ":" + paramName); parameters.push({ name: paramName, value: val, }); } return { parameters, sql: `UPDATE ${tableStr} SET ${setArr.join(", ")} WHERE ${whereStr};`, }; }