sqlInsertNewsUnqiueValuesRaw method
insert raw
values, which not founded in table,
return in MapEntry.key - count of added rows
selectors
- columns where need to search haved datareturnAdded
- if thistrue
returns all copies ofdata
added to table after insert, else return only added rows ofdata
returnFulls
- if thistrue
returns all copies ofdata
contained in table after insert, else return only added rows ofdata
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, []);
}