upsertAllValues method

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

Implementation

Future<List<RowData>> upsertAllValues(
  Object table, {
  required Iterable<Object> columns,
  required Iterable<Object> constraints,
  required List<List<dynamic>> rows,
  Returning? returning,
}) async {
  assert(columns.isNotEmpty && rows.isNotEmpty && columns.length == rows[0].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<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);
  buf << returning.clause;
  final argss = rows.map((row) => [...row, ...otherNames.mapList((e) => row[columnNames.indexOf(e)])]);
  List<QueryResult> ls = await multiQuery(buf.toString(), argss);
  return ls.mapList((e) => e.firstRow()!);
}