Skip to content

Commit 5f0630f

Browse files
authored
Merge pull request #646 from wger-project/feature/ingredient-cache
Use local sqlite database for ingredient cache
2 parents 15b6eb1 + 906fa72 commit 5f0630f

36 files changed

+1222
-503
lines changed

lib/core/locator.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ class ServiceLocator {
1818
Future<void> _initDB() async {
1919
ExerciseDatabase exerciseDB;
2020
IngredientDatabase ingredientDB;
21-
// final exerciseDB = ExerciseDatabase();
22-
// final ingredientDB = IngredientDatabase();
2321

2422
if (Platform.environment.containsKey('FLUTTER_TEST')) {
2523
exerciseDB = ExerciseDatabase.inMemory(NativeDatabase.memory());

lib/database/exercises/exercise_database.dart

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ part 'exercise_database.g.dart';
1515
@DataClassName('ExerciseTable')
1616
class Exercises extends Table {
1717
const Exercises();
18+
1819
IntColumn get id => integer()();
1920

2021
TextColumn get data => text()();
@@ -32,6 +33,7 @@ class Exercises extends Table {
3233
@DataClassName('MuscleTable')
3334
class Muscles extends Table {
3435
const Muscles();
36+
3537
IntColumn get id => integer()();
3638

3739
TextColumn get data => text().map(const MuscleConverter())();
@@ -40,6 +42,7 @@ class Muscles extends Table {
4042
@DataClassName('CategoryTable')
4143
class Categories extends Table {
4244
const Categories();
45+
4346
IntColumn get id => integer()();
4447

4548
TextColumn get data => text().map(const ExerciseCategoryConverter())();
@@ -48,6 +51,7 @@ class Categories extends Table {
4851
@DataClassName('LanguagesTable')
4952
class Languages extends Table {
5053
const Languages();
54+
5155
IntColumn get id => integer()();
5256

5357
TextColumn get data => text().map(const LanguageConverter())();
@@ -56,6 +60,7 @@ class Languages extends Table {
5660
@DataClassName('EquipmentTable')
5761
class Equipments extends Table {
5862
const Equipments();
63+
5964
IntColumn get id => integer()();
6065

6166
TextColumn get data => text().map(const EquipmentConverter())();
@@ -68,10 +73,30 @@ class ExerciseDatabase extends _$ExerciseDatabase {
6873
// Named constructor for creating in-memory database
6974
ExerciseDatabase.inMemory(super.e);
7075

76+
/// Note that this needs to be bumped if the JSON response from the server changes
7177
@override
72-
// TODO: implement schemaVersion
7378
int get schemaVersion => 1;
7479

80+
/// There is not really a migration strategy. If we bump the version
81+
/// number, delete everything and recreate the new tables. The provider
82+
/// will fetch everything as needed from the server
83+
@override
84+
MigrationStrategy get migration => MigrationStrategy(
85+
onUpgrade: (m, from, to) async {
86+
// no-op, but needs to be defined
87+
return;
88+
},
89+
beforeOpen: (openingDetails) async {
90+
if (openingDetails.hadUpgrade) {
91+
final m = createMigrator();
92+
for (final table in allTables) {
93+
await m.deleteTable(table.actualTableName);
94+
await m.createTable(table);
95+
}
96+
}
97+
},
98+
);
99+
75100
Future<void> deleteEverything() {
76101
return transaction(() async {
77102
for (final table in allTables) {

lib/database/ingredients/ingredients_database.dart

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ part 'ingredients_database.g.dart';
1010
@DataClassName('IngredientTable')
1111
class Ingredients extends Table {
1212
const Ingredients();
13+
1314
IntColumn get id => integer()();
1415

1516
TextColumn get data => text()();
1617

17-
DateTimeColumn get lastUpdate => dateTime()();
18+
/// The date when the ingredient was last fetched from the server
19+
DateTimeColumn get lastFetched => dateTime()();
1820
}
1921

2022
@DriftDatabase(tables: [Ingredients])
@@ -24,9 +26,37 @@ class IngredientDatabase extends _$IngredientDatabase {
2426
// Named constructor for creating in-memory database
2527
IngredientDatabase.inMemory(super.e);
2628

29+
/// Note that this needs to be bumped if the JSON response from the server changes
30+
@override
31+
int get schemaVersion => 2;
32+
33+
/// There is not really a migration strategy. If we bump the version
34+
/// number, delete everything and recreate the new tables. The nutrition provider
35+
/// will fetch everything as needed from the server
2736
@override
28-
// TODO: implement schemaVersion
29-
int get schemaVersion => 1;
37+
MigrationStrategy get migration => MigrationStrategy(
38+
onUpgrade: (m, from, to) async {
39+
// no-op, but needs to be defined
40+
return;
41+
},
42+
beforeOpen: (openingDetails) async {
43+
if (openingDetails.hadUpgrade) {
44+
final m = createMigrator();
45+
for (final table in allTables) {
46+
await m.deleteTable(table.actualTableName);
47+
await m.createTable(table);
48+
}
49+
}
50+
},
51+
);
52+
53+
Future<void> deleteEverything() {
54+
return transaction(() async {
55+
for (final table in allTables) {
56+
await delete(table).go();
57+
}
58+
});
59+
}
3060
}
3161

3262
LazyDatabase _openConnection() {

0 commit comments

Comments
 (0)