migrateLegacyEventIfNeeded method

Future<LegacyMigrationInsertResult> migrateLegacyEventIfNeeded({
  1. required int sourcePosition,
  2. required int tsMillis,
  3. required String eventName,
  4. required String payloadJson,
})

Implementation

Future<LegacyMigrationInsertResult> migrateLegacyEventIfNeeded({
  required int sourcePosition,
  required int tsMillis,
  required String eventName,
  required String payloadJson,
}) async {
  if (_db == null || !_isOpen) {
    return LegacyMigrationInsertResult.failed;
  }

  try {
    final result = await _db!.transaction<LegacyMigrationInsertResult>((txn) async {
      final existing = await txn.rawQuery(
        '''
        SELECT 1 FROM $_legacyMigrationJournalTable
        WHERE source_position = ? AND source_line = ?
        LIMIT 1
      ''',
        [sourcePosition, payloadJson],
      );
      if (existing.isNotEmpty) {
        return LegacyMigrationInsertResult.alreadyMigrated;
      }

      await txn.insert(_tableName, {
        'ts_millis': tsMillis,
        'event_name': eventName,
        'payload_json': payloadJson,
      });
      await txn.insert(_legacyMigrationJournalTable, {
        'source_position': sourcePosition,
        'source_line': payloadJson,
      });
      return LegacyMigrationInsertResult.inserted;
    });

    if (result == LegacyMigrationInsertResult.inserted) {
      _insertCounter++;
      if (_insertCounter % _capCheckInterval == 0) {
        await enforceDbCaps();
      }
    }

    return result;
  } catch (e, st) {
    dbLogger.severe(
      'SqliteEventStorage: migrateLegacyEventIfNeeded failed',
      e,
      st,
    );
    await _handlePotentialCorruption(e);
    return LegacyMigrationInsertResult.failed;
  }
}