drainToDb method

Future<int> drainToDb(
  1. SqliteEventStorage db
)

Drain all entries to the SQLite database. Returns number of events drained.

Implementation

Future<int> drainToDb(SqliteEventStorage db) async {
  if (_queue.isEmpty || !db.isOpen) return 0;
  int drained = 0;
  final toRemove = <int>{};
  // Snapshot to avoid ConcurrentModificationError if _queue is mutated
  // during await points below.
  final snapshot = List<_MemoryEntry>.from(_queue);
  for (final entry in snapshot) {
    final ok = await db.insertEvent(entry.tsMillis, entry.eventName, entry.payloadJson);
    if (ok) {
      toRemove.add(entry.seq);
      drained++;
    } else {
      break; // DB became unavailable again
    }
  }
  _queue.removeWhere((e) => toRemove.contains(e.seq));
  if (drained > 0) {
    dbLogger.info('MemoryEventQueue: drained $drained events to SQLite');
  }
  return drained;
}