applyRecUpdate method

void applyRecUpdate(
  1. TCustomSQLQuery query,
  2. TUpdateKind updateKind
)

Implementation

void applyRecUpdate(TCustomSQLQuery query, TUpdateKind updateKind) {
  TCustomSQLQuery? qry;
  var hasReturningClause = TBoolRef(
      connOptions.contains(TConnOption.sqSupportReturning) &&
          !query.options.contains(TSQLQueryOption.sqoRefreshUsingSelect) &&
          query.refreshSQL.text.trim() == '');
  var s = '';
  switch (updateKind) {
    case TUpdateKind.ukInsert:
      s = query._insertSQL.text.trim();
      if (s == '') {
        s = constructInsertSQL(query, hasReturningClause);
      } else {
        hasReturningClause.value = false;
      }
      qry = initialiseUpdateStatement(query, query._insertQry);
      break;
    case TUpdateKind.ukModify:
      s = query._updateSQL.text.trim();
      if (s == '') {
        //if not assigned(Query.FUpdateQry) or
        //(Query.UpdateMode<>upWhereKeyOnly) then // first time or
        //dynamic where part (original comment kept as-is)
        s = constructUpdateSQL(query, hasReturningClause);
      } else {
        hasReturningClause.value = false;
      }
      qry = initialiseUpdateStatement(query, query._updateQry);
      break;
    case TUpdateKind.ukDelete:
      s = query._deleteSQL.text.trim();
      if (s == '' &&
          (query._deleteQry.value == null ||
              query.updateMode != TUpdateMode.upWhereKeyOnly)) {
        s = constructDeleteSQL(query);
      }
      hasReturningClause.value = false;
      qry = initialiseUpdateStatement(query, query._deleteQry);
      break;
  }
  if (s != '' && qry.sql.text != '$s\n') {
    qry.sql.text = s; // assign only when changed, to avoid
    // UnPrepare/Prepare (original comment kept as-is)
  }
  assert(qry.sql.text != '');
  for (var x = 0; x < qry.params.count; x++) {
    final p = qry.params[x];
    var s2 = p.name;
    final useOldValue = s2.length >= 4 &&
        s2.substring(0, 4).toUpperCase() == 'OLD_';
    TField? fld;
    if (useOldValue) {
      s2 = s2.substring(4);
      fld = query.fieldByName(s2);
    } else {
      fld = query.findField(s2);
    }
    if (fld != null) {
      applyFieldUpdate(query.cursor, p as TSQLDBParam, fld, useOldValue);
    } else {
      // if does not exists field with given name, try look for param
      // (original comment kept as-is)
      final par = query.params.findParam(s2);
      if (par != null) {
        p.assign(par);
      } else {
        databaseErrorFmt(SFieldNotFound, [s2], query); // same error as
        // raised by FieldByName() (original comment kept as-is)
      }
    }
  }
  if (hasReturningClause.value) {
    qry.close();
    qry.open();
  } else {
    qry.execSQL();
  }
  if (options
          .contains(TSQLConnectionOption.scoApplyUpdatesChecksRowsAffected) &&
      qry.rowsAffected() != 1) {
    final n = qry.rowsAffected();
    qry.close();
    databaseErrorFmt(SErrFailedToUpdateRecord, [n], query);
  }
  if (hasReturningClause.value) {
    query.applyReturningResult(qry, updateKind);
  }
}