loadTableSnapshot method

  1. @override
Future<List<Map<String, dynamic>>?> loadTableSnapshot(
  1. String tableName
)
override

Implementation

@override
Future<List<Map<String, dynamic>>?> loadTableSnapshot(
  String tableName,
) async {
  return _locks.getTableLock(tableName).synchronized(() async {
    final file = _tableFile(tableName);
    final content = await _fileStore.readWithFallback(file);
    if (content == null) return null;

    try {
      final data = jsonDecode(content);
      if (data is! List) {
        throw FormatException('Expected JSON list, got ${data.runtimeType}');
      }
      await _fileStore.cleanupBackup(file);
      return data.cast<Map<String, dynamic>>();
    } catch (e) {
      SdkLogger.e('Failed to parse table snapshot for "$tableName": $e');
      final backupFile = File('${file.path}.bak');
      if (await backupFile.exists()) {
        try {
          final backupContent = await backupFile.readAsString();
          final data = jsonDecode(backupContent);
          if (data is! List) {
            throw FormatException(
              'Expected JSON list in backup, got ${data.runtimeType}',
            );
          }
          SdkLogger.i(
            'Recovered table snapshot for "$tableName" from backup',
          );
          return data.cast<Map<String, dynamic>>();
        } catch (backupError) {
          SdkLogger.e('Backup also corrupted for "$tableName": $backupError');
        }
      }
      return null;
    }
  });
}