insert method

Future<void> insert(
  1. Row row
)

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