insert method
Insert a new row. Assigns id if row.id <= 0.
Implementation
Future<void> insert(Row row) async {
meta.schema.validate(row.values);
if (row.id <= 0) row.id = _nextRowId++;
if (row.id >= _nextRowId) _nextRowId = row.id + 1;
if (meta.rootPageId < 0) {
meta.rootPageId = await cache.pager.allocatePage();
await _initPage(meta.rootPageId);
}
int curPageId = meta.rootPageId;
while (true) {
final rows = await _readPageRows(curPageId);
final testRows = [...rows, row];
final testJson = jsonEncode(testRows.map((r) => r.toJson()).toList());
final testByt = utf8.encode(testJson);
if (testByt.length <= _maxData) {
await _writePageRows(curPageId, testRows);
break;
}
final next = await _getNextPage(curPageId);
if (next < 0) {
final newPage = await cache.pager.allocatePage();
await _initPage(newPage);
await _setNextPage(curPageId, newPage);
await _writePageRows(newPage, [row], nextPageId: -1);
break;
}
curPageId = next;
}
meta.rowCount++;
for (final entry in indexes.entries) {
final value = row[entry.key];
if (value != null) entry.value.insert(value, row.id);
}
}