upsertValues method
Implementation
Future<RowData?> upsertValues(
Object table, {
required Iterable<Object> columns,
required Iterable<Object> constraints,
required Iterable<dynamic> values,
Returning? returning,
}) async {
assert(columns.isNotEmpty && columns.length == values.length);
returning ??= Returning.ALL;
if (constraints.isEmpty) {
constraints = columns.filter((e) {
if (e is TableColumn) {
var p = e.proto;
return p.primaryKey || p.unique;
} else {
return false;
}
});
}
List<dynamic> valueList = (values is List<dynamic>) ? values : values.toList();
List<String> columnNames = columns.mapList((e) => _columnNameOf(e));
List<String> constraintNames = constraints.mapList((e) => _columnNameOf(e));
List<String> otherNames = columnNames.filter((e) => !constraintNames.contains(e));
SpaceBuffer buf = _upsertBuffer(table, columnNames, constraints: constraintNames, otherColumns: otherNames);
var argList = [...values, ...otherNames.mapList((e) => valueList[columnNames.indexOf(e)])];
buf << returning.clause;
QueryResult rs = await execute(buf.toString(), argList);
return rs.firstRow();
}