Bladeren bron

Switch to plain fs based caching mechanism

Matthias Rupp 2 jaren geleden
bovenliggende
commit
6796462b13

+ 0 - 8
mobile/lib/constants/hive_box.dart

@@ -25,11 +25,3 @@ const String backgroundBackupInfoBox = "immichBackgroundBackupInfoBox"; // Box
 const String backupFailedSince = "immichBackupFailedSince"; // Key 1
 const String backupRequireWifi = "immichBackupRequireWifi"; // Key 2
 const String backupRequireCharging = "immichBackupRequireCharging"; // Key 3
-
-// Asset cache
-const String assetListCacheBox = "assetListCacheBoxl";
-const String assetListCachedAssets = "assetListCachedAssets";
-
-// Album cache
-const String albumListCacheBox = "albumListCacheBoxl";
-const String albumListCachedAssets = "albumListCachedAssets";

+ 0 - 8
mobile/lib/main.dart

@@ -38,14 +38,6 @@ void main() async {
   await Hive.openBox(hiveGithubReleaseInfoBox);
   await Hive.openBox(userSettingInfoBox);
 
-  final sw = Stopwatch();
-  sw.start();
-
-  await Hive.openLazyBox(assetListCacheBox);
-  await Hive.openLazyBox(albumListCacheBox);
-
-  debugPrint("Hive box open took ${sw.elapsedMilliseconds} ms");
-
   SystemChrome.setSystemUIOverlayStyle(
     const SystemUiOverlayStyle(
       statusBarIconBrightness: Brightness.light,

+ 1 - 1
mobile/lib/modules/album/providers/album.provider.dart

@@ -14,7 +14,7 @@ class AlbumNotifier extends StateNotifier<List<AlbumResponseDto>> {
 
   getAllAlbums() async {
 
-    if (_albumCacheService.isValid() && state.isEmpty) {
+    if (await _albumCacheService.isValid() && state.isEmpty) {
       state = await _albumCacheService.get();
     }
 

+ 1 - 2
mobile/lib/modules/album/services/album_cache.service.dart

@@ -2,12 +2,11 @@
 import 'package:collection/collection.dart';
 import 'package:flutter/foundation.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
-import 'package:immich_mobile/constants/hive_box.dart';
 import 'package:immich_mobile/modules/home/services/asset_cache.service.dart';
 import 'package:openapi/api.dart';
 
 class AlbumCacheService extends JsonCache<List<AlbumResponseDto>> {
-  AlbumCacheService() : super(albumListCacheBox, albumListCachedAssets);
+  AlbumCacheService() : super("album_cache");
 
   @override
   void put(List<AlbumResponseDto> data) {

+ 30 - 14
mobile/lib/modules/home/services/asset_cache.service.dart

@@ -1,35 +1,51 @@
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:collection/collection.dart';
 import 'package:flutter/foundation.dart';
-import 'package:hive_flutter/hive_flutter.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:http/http.dart';
-import 'package:immich_mobile/constants/hive_box.dart';
 import 'package:openapi/api.dart';
+import 'package:path_provider/path_provider.dart';
 
 abstract class JsonCache<T> {
-  final String boxName;
-  final String valueKey;
-  final LazyBox _cacheBox;
+  final String cacheFileName;
 
-  JsonCache(this.boxName, this.valueKey) : _cacheBox = Hive.lazyBox(boxName);
+  JsonCache(this.cacheFileName);
 
-  bool isValid() {
-    return _cacheBox.containsKey(valueKey) && _cacheBox.containsKey(valueKey);
+  Future<File> _getCacheFile() async {
+    final basePath = await getTemporaryDirectory();
+    final basePathName = basePath.path;
+
+    final file = File("$basePathName/$cacheFileName.bin");
+
+    return file;
+  }
+
+  Future<bool> isValid() async {
+    final file = await _getCacheFile();
+    return await file.exists();
   }
 
-  void invalidate() {
-    _cacheBox.clear();
+  Future<void> invalidate() async {
+    final file = await _getCacheFile();
+    await file.delete();
   }
 
-  void putRawData(dynamic data) {
+  Future<void> putRawData(dynamic data) async {
     final jsonString = json.encode(data);
-    _cacheBox.put(valueKey, jsonString);
+    final file = await _getCacheFile();
+
+    if (!await file.exists()) {
+      await file.create();
+    }
+
+    await file.writeAsString(jsonString);
   }
 
   dynamic readRawData() async {
-    final data = await _cacheBox.get(valueKey);
+    final file = await _getCacheFile();
+    final data = await file.readAsString();
     return json.decode(data);
   }
 
@@ -38,7 +54,7 @@ abstract class JsonCache<T> {
 }
 
 class AssetCacheService extends JsonCache<List<AssetResponseDto>> {
-  AssetCacheService() : super(assetListCacheBox, assetListCachedAssets);
+  AssetCacheService() : super("asset_cache");
 
   @override
   void put(List<AssetResponseDto> data) {

+ 1 - 1
mobile/lib/shared/providers/asset.provider.dart

@@ -24,7 +24,7 @@ class AssetNotifier extends StateNotifier<List<AssetResponseDto>> {
     final stopwatch = Stopwatch();
 
 
-    if (_assetCacheService.isValid() && state.isEmpty) {
+    if (await _assetCacheService.isValid() && state.isEmpty) {
       stopwatch.start();
       state = await _assetCacheService.get();
       debugPrint("Reading assets from cache: ${stopwatch.elapsedMilliseconds}ms");