upsertValues method

Future<RowData?> upsertValues(
  1. Object table, {
  2. required Iterable<Object> columns,
  3. required Iterable<Object> constraints,
  4. required Iterable values,
  5. Returning? returning,
})

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();
}