UNPKG

@sqb/connect

Version:

Multi-dialect database connection framework written with TypeScript

84 lines (83 loc) 3.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateCommand = void 0; const builder_1 = require("@sqb/builder"); const column_field_metadata_js_1 = require("../model/column-field-metadata.js"); const embedded_field_metadata_js_1 = require("../model/embedded-field-metadata.js"); const orm_helper_js_1 = require("../util/orm.helper.js"); const command_helper_js_1 = require("./command.helper.js"); class UpdateCommand { // istanbul ignore next constructor() { throw new Error('This class is abstract'); } static async execute(args) { const { entity } = args; const tableName = entity.tableName; if (!tableName) throw new Error(`${entity.ctor.name} is not decorated with @Entity decorator`); // Create a context const ctx = { entity, queryParams: {}, queryValues: {}, queryFilter: [], colCount: 0, }; // Prepare await this._prepareParams(ctx, entity, args.values); if (!ctx.colCount) return 0; if (args.filter) await this._prepareFilter(ctx, args.filter); const query = (0, builder_1.Update)(tableName + ' as T', ctx.queryValues).where(...ctx.queryFilter); const qr = await args.connection.execute(query, { params: args.params ? [...args.params, ctx.queryParams] : ctx.queryParams, objectRows: false, cursor: false, }); return qr.rowsAffected || 0; } static async _prepareFilter(ctx, filter) { if (filter) { const where = (0, builder_1.And)(); await (0, command_helper_js_1.prepareFilter)(ctx.entity, filter, where); ctx.queryFilter.push(...where._items); } } static async _prepareParams(ctx, entity, values, prefix, suffix) { let v; prefix = prefix || ''; suffix = suffix || ''; for (const col of Object.values(entity.fields)) { v = values[col.name]; if (v === undefined) continue; if ((0, orm_helper_js_1.isColumnField)(col)) { if (col.noUpdate) continue; if (typeof col.serialize === 'function') v = col.serialize(v, col.name); if (v === null && col.notNull) throw new Error(`${entity.name}.${col.name} is required and can't be null`); if (v === undefined) continue; column_field_metadata_js_1.ColumnFieldMetadata.checkEnumValue(col, v); const fieldName = prefix + col.fieldName + suffix; const k = ('I$_' + fieldName).substring(0, 30); ctx.queryValues[fieldName] = (0, builder_1.Param)({ name: k, dataType: col.dataType, isArray: col.isArray, }); ctx.queryParams[k] = v; ctx.colCount++; } else if (v != null && (0, orm_helper_js_1.isEmbeddedField)(col)) { const type = await embedded_field_metadata_js_1.EmbeddedFieldMetadata.resolveType(col); await this._prepareParams(ctx, type, v, col.fieldNamePrefix, col.fieldNameSuffix); } } } } exports.UpdateCommand = UpdateCommand;