Skip to content

Commit 9d13635

Browse files
authored
Switch from Isar to Drift for Caching (#253)
1 parent 77d3a8e commit 9d13635

13 files changed

+811
-1116
lines changed

ios/Podfile.lock

Lines changed: 60 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
11
PODS:
22
- device_info_plus (0.0.1):
33
- Flutter
4-
- Firebase/CoreOnly (10.25.0):
5-
- FirebaseCore (= 10.25.0)
6-
- Firebase/Crashlytics (10.25.0):
4+
- Firebase/CoreOnly (10.27.0):
5+
- FirebaseCore (= 10.27.0)
6+
- Firebase/Crashlytics (10.27.0):
77
- Firebase/CoreOnly
8-
- FirebaseCrashlytics (~> 10.25.0)
9-
- Firebase/RemoteConfig (10.25.0):
8+
- FirebaseCrashlytics (~> 10.27.0)
9+
- Firebase/RemoteConfig (10.27.0):
1010
- Firebase/CoreOnly
11-
- FirebaseRemoteConfig (~> 10.25.0)
12-
- firebase_core (2.31.1):
13-
- Firebase/CoreOnly (= 10.25.0)
11+
- FirebaseRemoteConfig (~> 10.27.0)
12+
- firebase_core (3.1.0):
13+
- Firebase/CoreOnly (= 10.27.0)
1414
- Flutter
15-
- firebase_crashlytics (3.5.6):
16-
- Firebase/Crashlytics (= 10.25.0)
15+
- firebase_crashlytics (4.0.1):
16+
- Firebase/Crashlytics (= 10.27.0)
1717
- firebase_core
1818
- Flutter
19-
- firebase_remote_config (4.4.6):
20-
- Firebase/RemoteConfig (= 10.25.0)
19+
- firebase_remote_config (5.0.1):
20+
- Firebase/RemoteConfig (= 10.27.0)
2121
- firebase_core
2222
- Flutter
23-
- FirebaseABTesting (10.25.0):
23+
- FirebaseABTesting (10.28.0):
2424
- FirebaseCore (~> 10.0)
25-
- FirebaseCore (10.25.0):
25+
- FirebaseCore (10.27.0):
2626
- FirebaseCoreInternal (~> 10.0)
2727
- GoogleUtilities/Environment (~> 7.12)
2828
- GoogleUtilities/Logger (~> 7.12)
29-
- FirebaseCoreExtension (10.25.0):
29+
- FirebaseCoreExtension (10.28.0):
3030
- FirebaseCore (~> 10.0)
31-
- FirebaseCoreInternal (10.25.0):
31+
- FirebaseCoreInternal (10.28.0):
3232
- "GoogleUtilities/NSData+zlib (~> 7.8)"
33-
- FirebaseCrashlytics (10.25.0):
33+
- FirebaseCrashlytics (10.27.0):
3434
- FirebaseCore (~> 10.5)
3535
- FirebaseInstallations (~> 10.0)
3636
- FirebaseRemoteConfigInterop (~> 10.23)
@@ -39,21 +39,21 @@ PODS:
3939
- GoogleUtilities/Environment (~> 7.8)
4040
- nanopb (< 2.30911.0, >= 2.30908.0)
4141
- PromisesObjC (~> 2.1)
42-
- FirebaseInstallations (10.25.0):
42+
- FirebaseInstallations (10.28.0):
4343
- FirebaseCore (~> 10.0)
4444
- GoogleUtilities/Environment (~> 7.8)
4545
- GoogleUtilities/UserDefaults (~> 7.8)
4646
- PromisesObjC (~> 2.1)
47-
- FirebaseRemoteConfig (10.25.0):
47+
- FirebaseRemoteConfig (10.27.0):
4848
- FirebaseABTesting (~> 10.0)
4949
- FirebaseCore (~> 10.0)
5050
- FirebaseInstallations (~> 10.0)
5151
- FirebaseRemoteConfigInterop (~> 10.23)
5252
- FirebaseSharedSwift (~> 10.0)
5353
- GoogleUtilities/Environment (~> 7.8)
5454
- "GoogleUtilities/NSData+zlib (~> 7.8)"
55-
- FirebaseRemoteConfigInterop (10.25.0)
56-
- FirebaseSessions (10.25.0):
55+
- FirebaseRemoteConfigInterop (10.28.0)
56+
- FirebaseSessions (10.28.0):
5757
- FirebaseCore (~> 10.5)
5858
- FirebaseCoreExtension (~> 10.0)
5959
- FirebaseInstallations (~> 10.0)
@@ -62,7 +62,7 @@ PODS:
6262
- GoogleUtilities/UserDefaults (~> 7.13)
6363
- nanopb (< 2.30911.0, >= 2.30908.0)
6464
- PromisesSwift (~> 2.1)
65-
- FirebaseSharedSwift (10.25.0)
65+
- FirebaseSharedSwift (10.28.0)
6666
- Flutter (1.0.0)
6767
- flutter_native_splash (0.0.1):
6868
- Flutter
@@ -96,8 +96,6 @@ PODS:
9696
- GoogleUtilities/Privacy
9797
- home_widget (0.0.1):
9898
- Flutter
99-
- isar_flutter_libs (1.0.0):
100-
- Flutter
10199
- map_launcher (0.0.1):
102100
- Flutter
103101
- nanopb (2.30910.0):
@@ -123,6 +121,24 @@ PODS:
123121
- sqflite (0.0.3):
124122
- Flutter
125123
- FlutterMacOS
124+
- "sqlite3 (3.46.0+1)":
125+
- "sqlite3/common (= 3.46.0+1)"
126+
- "sqlite3/common (3.46.0+1)"
127+
- "sqlite3/dbstatvtab (3.46.0+1)":
128+
- sqlite3/common
129+
- "sqlite3/fts5 (3.46.0+1)":
130+
- sqlite3/common
131+
- "sqlite3/perf-threadsafe (3.46.0+1)":
132+
- sqlite3/common
133+
- "sqlite3/rtree (3.46.0+1)":
134+
- sqlite3/common
135+
- sqlite3_flutter_libs (0.0.1):
136+
- Flutter
137+
- "sqlite3 (~> 3.46.0+1)"
138+
- sqlite3/dbstatvtab
139+
- sqlite3/fts5
140+
- sqlite3/perf-threadsafe
141+
- sqlite3/rtree
126142
- url_launcher_ios (0.0.1):
127143
- Flutter
128144
- video_player_avfoundation (0.0.1):
@@ -140,14 +156,14 @@ DEPENDENCIES:
140156
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`)
141157
- google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`)
142158
- home_widget (from `.symlinks/plugins/home_widget/ios`)
143-
- isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`)
144159
- map_launcher (from `.symlinks/plugins/map_launcher/ios`)
145160
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
146161
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
147162
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
148163
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
149164
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
150165
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
166+
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`)
151167
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
152168
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
153169

@@ -170,6 +186,7 @@ SPEC REPOS:
170186
- nanopb
171187
- PromisesObjC
172188
- PromisesSwift
189+
- sqlite3
173190

174191
EXTERNAL SOURCES:
175192
device_info_plus:
@@ -192,8 +209,6 @@ EXTERNAL SOURCES:
192209
:path: ".symlinks/plugins/google_maps_flutter_ios/ios"
193210
home_widget:
194211
:path: ".symlinks/plugins/home_widget/ios"
195-
isar_flutter_libs:
196-
:path: ".symlinks/plugins/isar_flutter_libs/ios"
197212
map_launcher:
198213
:path: ".symlinks/plugins/map_launcher/ios"
199214
package_info_plus:
@@ -208,27 +223,29 @@ EXTERNAL SOURCES:
208223
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
209224
sqflite:
210225
:path: ".symlinks/plugins/sqflite/darwin"
226+
sqlite3_flutter_libs:
227+
:path: ".symlinks/plugins/sqlite3_flutter_libs/ios"
211228
url_launcher_ios:
212229
:path: ".symlinks/plugins/url_launcher_ios/ios"
213230
video_player_avfoundation:
214231
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
215232

216233
SPEC CHECKSUMS:
217234
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
218-
Firebase: 0312a2352584f782ea56f66d91606891d4607f06
219-
firebase_core: 22e117a2e0dec3cb318c8f53f2dd01c140375617
220-
firebase_crashlytics: bd50e4bbd2ac62cb6d5efd73449f414a2619e55b
221-
firebase_remote_config: 347436da419c4b6d64995edc037e9ed56158354b
222-
FirebaseABTesting: e6e3c3e0e35813874f571d1b7bdae2aab319dd38
223-
FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483
224-
FirebaseCoreExtension: 8a47811d0b155501559ef05d089518152a0a1677
225-
FirebaseCoreInternal: 910a81992c33715fec9263ca7381d59ab3a750b7
226-
FirebaseCrashlytics: 4b96efb0ce73b38b2a85e8b8bd1bd8f63f09d015
227-
FirebaseInstallations: 91950fe859846fff0fbd296180909dd273103b09
228-
FirebaseRemoteConfig: 9f3935cefecd85d5b312192117f444957de24a75
229-
FirebaseRemoteConfigInterop: b25018791b204c0d78a90e394d6c62d9b1f22da8
230-
FirebaseSessions: c0939656253a1fa0e94ecc266ccf770cc8b33732
231-
FirebaseSharedSwift: 0274086954b1b2d5fd7e829eccc587044d72a4ba
235+
Firebase: 26b040b20866a55f55eb3611b9fcf3ae64816b86
236+
firebase_core: 483cfad66d24d8f3c233f31db4263830c625c909
237+
firebase_crashlytics: 8f04c663c8734f97c4ccbe81b8511ce7060e3b28
238+
firebase_remote_config: 3c103e81a3fba5f50c0a522d65a49e5695d57fbc
239+
FirebaseABTesting: 589bc28c0ab3e5554336895a34aa262e24276665
240+
FirebaseCore: a2b95ae4ce7c83ceecfbbbe3b6f1cddc7415a808
241+
FirebaseCoreExtension: f63147b723e2a700fe0f34ec6fb7f358d6fe83e0
242+
FirebaseCoreInternal: 58d07f1362fddeb0feb6a857d1d1d1c5e558e698
243+
FirebaseCrashlytics: 81ea6ec96519388687f6061beb838a8eec482293
244+
FirebaseInstallations: 60c1d3bc1beef809fd1ad1189a8057a040c59f2e
245+
FirebaseRemoteConfig: 37a2ba3c8c454be8553a41ba1a2f4a4f0b845670
246+
FirebaseRemoteConfigInterop: 70d200c6956ef3b5c3592a95e824c1210682d785
247+
FirebaseSessions: 20da8500ad66bb12622743e170459bf62a0768e8
248+
FirebaseSharedSwift: 48de4aec81a6b79bb30404e5e6db43ea74848fed
232249
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
233250
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
234251
flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
@@ -238,7 +255,6 @@ SPEC CHECKSUMS:
238255
GoogleMaps: 8939898920281c649150e0af74aa291c60f2e77d
239256
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
240257
home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
241-
isar_flutter_libs: fdf730ca925d05687f36d7f1d355e482529ed097
242258
map_launcher: 5fde49ac9a52672bf99da746599f507b4490d7b5
243259
nanopb: 438bc412db1928dac798aa6fd75726007be04262
244260
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
@@ -249,6 +265,8 @@ SPEC CHECKSUMS:
249265
quick_actions_ios: 56f3cbaa71e94f212838d1f9fe354bd0734779bf
250266
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
251267
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
268+
sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630
269+
sqlite3_flutter_libs: c00457ebd31e59fa6bb830380ddba24d44fbcd3b
252270
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
253271
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
254272

ios/build/.last_build_id

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
e728d5ba4e52068eb059d8c80cc8e750
1+
39f4bf50ad275767c79aa66def67de4c

lib/base/networking/base/grpc_client.dart

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
import 'dart:async';
22
import 'dart:io';
33

4-
import 'package:campus_flutter/base/networking/cache/grpc_cache_interceptor.dart';
4+
import 'package:campus_flutter/base/networking/cache/cache_entry.dart';
55
import 'package:campus_flutter/base/networking/apis/tumdev/campus_backend.pbgrpc.dart';
6+
import 'package:campus_flutter/base/networking/cache/grpc_cache_interceptor.dart';
67
import 'package:device_info_plus/device_info_plus.dart';
78
import 'package:grpc/grpc_or_grpcweb.dart';
8-
import 'package:isar/isar.dart';
99
import 'package:package_info_plus/package_info_plus.dart';
1010

1111
class GrpcClient extends CampusClient {
12-
static Future<GrpcClient> createGrpcClient(Isar isar) async {
13-
return GrpcClient(isar, await _callOptions());
12+
static Future<GrpcClient> createGrpcClient(
13+
CacheDatabase cacheDatabase,
14+
) async {
15+
return GrpcClient(cacheDatabase, await _callOptions());
1416
}
1517

16-
GrpcClient(Isar isar, CallOptions callOptions)
18+
GrpcClient(CacheDatabase cacheDatabase, CallOptions callOptions)
1719
: super(
1820
_channel(),
1921
options: callOptions,
20-
interceptors: [GrpcCacheInterceptor(isar)],
22+
interceptors: [GrpcCacheInterceptor(cacheDatabase)],
2123
);
2224

2325
static Future<CallOptions> _callOptions() async {
@@ -33,10 +35,6 @@ class GrpcClient extends CampusClient {
3335
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
3436
osVersion = androidInfo.version.toString();
3537
deviceId = androidInfo.serialNumber;
36-
} else if (Platform.isMacOS) {
37-
MacOsDeviceInfo macInfo = await deviceInfo.macOsInfo;
38-
osVersion = macInfo.osRelease;
39-
deviceId = macInfo.model;
4038
}
4139
return CallOptions(
4240
metadata: {

lib/base/networking/base/rest_client.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ import 'dart:convert';
22
import 'dart:developer';
33

44
import 'package:campus_flutter/base/networking/cache/cache.dart';
5+
import 'package:campus_flutter/base/networking/cache/cache_entry.dart';
56
import 'package:campus_flutter/base/networking/cache/rest_cache_interceptor.dart';
67
import 'package:campus_flutter/base/networking/protocols/api.dart';
78
import 'package:campus_flutter/base/networking/protocols/api_exception.dart';
89
import 'package:campus_flutter/base/networking/base/api_response.dart';
910
import 'package:dio/dio.dart';
10-
import 'package:isar/isar.dart';
1111
import 'package:xml2json/xml2json.dart';
1212

1313
class RestClient {
1414
late Dio dio;
1515
late Cache cache;
1616

17-
RestClient(Isar isar) {
18-
final cache = Cache(isar: isar);
17+
RestClient(CacheDatabase cacheDatabase) {
18+
final cache = Cache(cacheDatabase: cacheDatabase);
1919
this.cache = cache;
2020

2121
/// add custom cache interceptor to dio

lib/base/networking/cache/cache.dart

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,71 @@
1-
import 'package:isar/isar.dart';
21
import 'package:campus_flutter/base/networking/cache/cache_entry.dart';
2+
import 'package:campus_flutter/base/services/connection_service.dart';
33
import 'package:campus_flutter/base/util/fast_hash.dart';
4+
import 'package:campus_flutter/main.dart';
5+
import 'package:drift/drift.dart';
46

57
class Cache {
6-
final Isar isar;
8+
final CacheDatabase cacheDatabase;
79

8-
final Duration ttl = const Duration(days: 30);
10+
final Duration onlineTtl = const Duration(minutes: 10);
911

10-
Cache({required this.isar});
12+
final Duration offlineTtl = const Duration(days: 30);
1113

12-
void add(String body, String uri) {
14+
Cache({required this.cacheDatabase});
15+
16+
void add(String body, String key) {
1317
final today = DateTime.now();
14-
final cacheEntry = CacheEntry(
15-
id: fastHash(uri),
16-
url: uri,
17-
validUntil: today.add(ttl),
18-
saved: today,
19-
data: body,
20-
);
21-
isar.writeTxn(
22-
() => isar.cacheEntrys.put(cacheEntry),
18+
final id = fastHash(key);
19+
20+
cacheDatabase.managers.cacheEntry.create(
21+
(o) => CacheEntryCompanion.insert(
22+
id: id,
23+
url: key,
24+
validUntil: today.add(offlineTtl),
25+
saved: today,
26+
body: body,
27+
),
28+
mode: InsertMode.replace,
2329
);
2430
}
2531

26-
CacheEntry? get(String uri) {
27-
final hash = fastHash(uri);
28-
final entry = isar.txnSync(() => isar.cacheEntrys.getSync(hash));
29-
if (entry != null) {
30-
final today = DateTime.now();
31-
if (entry.validUntil.isAfter(today)) {
32-
return entry;
33-
} else {
34-
isar.writeTxn(() => isar.cacheEntrys.delete(hash));
35-
return null;
36-
}
37-
} else {
38-
return null;
39-
}
40-
}
32+
Future<CacheEntryData?> get(String key) async {
33+
final id = fastHash(key);
34+
35+
final entry = await cacheDatabase.managers.cacheEntry
36+
.filter((f) => f.id.equals(id))
37+
.limit(1)
38+
.getSingleOrNull();
4139

42-
Future<CacheEntry?> getAsync(String uri) async {
43-
final hash = fastHash(uri);
44-
final entry = await isar.txn(() => isar.cacheEntrys.get(hash));
4540
if (entry != null) {
4641
final today = DateTime.now();
47-
if (entry.validUntil.isAfter(today)) {
48-
return entry;
42+
if (getIt<ConnectionService>().hasInternet() &&
43+
!key.contains("tumCard")) {
44+
if (entry.saved.isAfter(today.subtract(onlineTtl))) {
45+
return entry;
46+
} else {
47+
delete(key);
48+
return null;
49+
}
4950
} else {
50-
isar.writeTxn(() => isar.cacheEntrys.delete(hash));
51-
return null;
51+
if (entry.validUntil.isAfter(today)) {
52+
return entry;
53+
} else {
54+
delete(key);
55+
return null;
56+
}
5257
}
5358
} else {
5459
return null;
5560
}
5661
}
5762

5863
void delete(String key) {
59-
final hash = fastHash(key);
60-
isar.writeTxn(() => isar.cacheEntrys.delete(hash));
64+
final id = fastHash(key);
65+
cacheDatabase.managers.cacheEntry.filter((f) => f.id.equals(id)).delete();
6166
}
6267

6368
Future<void> resetCache() async {
64-
return await isar.writeTxn(() => isar.clear());
69+
await cacheDatabase.managers.cacheEntry.delete();
6570
}
6671
}

0 commit comments

Comments
 (0)