applyRecUpdate method
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);
}
}