generateUpdateSQL method
Implementation
FutureOr<SQL> generateUpdateSQL(Transaction transaction, String entityName,
String table, Object id, Map<String, Object?> fields) {
if (fields.isEmpty) return SQL.dummy;
var retTableScheme = getTableScheme(table);
return retTableScheme.resolveMapped((tableScheme) {
if (tableScheme == null) {
var errorMsg = "Can't find `TableScheme` for table: $table";
_log.severe(errorMsg);
throw StateError(errorMsg);
}
var context = EncodingContext(entityName,
namedParameters: fields, transaction: transaction);
var idFieldName = tableScheme.idFieldName!;
var idPlaceholder =
_conditionSQLGenerator.parameterPlaceholder(idFieldName);
var fieldsValues =
tableScheme.getFieldsValues(fields, fields: fields.keys.toSet());
// No value to update:
if (fieldsValues.isEmpty) {
return SQL.dummy;
}
var fieldsKeys = fieldsValues.keys.toList();
var fieldsValuesInSQL = <String, Object?>{idFieldName: id};
return fieldsKeys
.map((f) => fieldValueToSQL(
context, tableScheme, f, fieldsValues[f], fieldsValuesInSQL))
.toList(growable: false)
.resolveAll()
.resolveMapped((values) {
var q = dialect.elementQuote;
var sql = StringBuffer();
sql.write('UPDATE $q');
sql.write(table);
sql.write('$q SET ');
for (var i = 0; i < values.length; ++i) {
var f = fieldsKeys[i];
var v = values[i];
if (i > 0) sql.write(' , ');
sql.write(q);
sql.write(f);
sql.write(q);
sql.write(' = ');
sql.write(v);
}
if (dialect.acceptsOutputSyntax) {
sql.write(' OUTPUT INSERTED.');
sql.write(q);
sql.write(idFieldName);
sql.write(q);
}
sql.write(' WHERE ');
var conditionSQL = '$idFieldName = $idPlaceholder';
sql.write(conditionSQL);
if (dialect.acceptsReturningSyntax) {
sql.write(' RETURNING $q$table$q.$q$idFieldName$q');
}
return SQL(sql.toString(), null, fields, fieldsValuesInSQL,
sqlCondition: conditionSQL,
entityName: table,
idFieldName: idFieldName,
mainTable: table);
});
});
}