sqlInsertNewsUnqiueValuesRaw method

MapEntry<int, List<List>> sqlInsertNewsUnqiueValuesRaw(
  1. List<List> data,
  2. List<DatabaseColumn> selectors, {
  3. bool returnAdded = false,
  4. bool returnFulls = false,
})

insert raw values, which not founded in table, return in MapEntry.key - count of added rows

  • selectors - columns where need to search haved data
  • returnAdded - if this true returns all copies of data added to table after insert, else return only added rows of data
  • returnFulls - if this true returns all copies of data contained in table after insert, else return only added rows of data

Implementation

MapEntry<int, List<List>> sqlInsertNewsUnqiueValuesRaw(
  List<List> data,
  List<DatabaseColumn> selectors, {
  bool returnAdded = false,
  bool returnFulls = false,
}) {
  final sb = StringBuffer('WHERE ');
  final l = data.length;
  final e = selectors.first;
  final binds = 'IN (${sqlQueryRowBindings(l)})';
  sb.write('${e.name} $binds');
  for (final e in selectors.skip(1)) {
    sb.write(' AND ${e.name} $binds');
  }
  final str = sb.toString();
  final bindsVals = [];
  final datas = data.map(rowEncodeRaw).toList();
  for (final i in selectors) {
    final c = columns.indexOf(i);
    bindsVals.addAll(datas.map((e) => e[c]));
  }
  final contains = sqlSelectRaw(str, bindsVals);
  final added = data.toList()
    ..removeWhere(
      (d) => selectors.every(
        (i) {
          final k = columns.indexOf(i);
          return contains.any(
            (c) => d[k] == c[k],
          );
        },
      ),
    );
  sqlInsertRaw(added);
  if (returnFulls) {
    return MapEntry(
      added.length,
      sqlSelectRaw(str, bindsVals).toList(),
    );
  }
  if (returnAdded) {
    final sb = StringBuffer('WHERE ');
    final l = added.length;
    final e = selectors.first;
    final binds = 'IN (${sqlQueryRowBindings(l)})';
    sb.write('${e.name} $binds');
    for (final e in selectors.skip(1)) {
      sb.write(' AND ${e.name} $binds');
    }
    final str = sb.toString();
    final bindsVals = [];
    final datas = added.map(rowEncodeRaw).toList();
    for (final i in selectors) {
      final c = columns.indexOf(i);
      bindsVals.addAll(datas.map((e) => e[c]));
    }
    final contains = sqlSelectRaw(str, bindsVals);
    return MapEntry(l, contains.toList());
  }
  return MapEntry(added.length, []);
}