@@ -5,6 +5,7 @@ import 'package:sqlite3/common.dart';
5
5
6
6
import '../log.dart' ;
7
7
import 'schema_versions.g.dart' ;
8
+ import 'settings.dart' ;
8
9
9
10
part 'database.g.dart' ;
10
11
@@ -45,6 +46,17 @@ class Accounts extends Table {
45
46
];
46
47
}
47
48
49
+ /// The table of the user's chosen settings independent of account, on this
50
+ /// client.
51
+ ///
52
+ /// These apply across all the user's accounts on this client (i.e. on this
53
+ /// install of the app on this device).
54
+ @DataClassName ('GlobalSettingsData' )
55
+ class GlobalSettings extends Table {
56
+ Column <String > get themeSetting => textEnum <ThemeSetting >()
57
+ .nullable ()();
58
+ }
59
+
48
60
class UriConverter extends TypeConverter <Uri , String > {
49
61
const UriConverter ();
50
62
@override String toSql (Uri value) => value.toString ();
@@ -59,12 +71,14 @@ VersionedSchema _getSchema({
59
71
switch (schemaVersion) {
60
72
case 2 :
61
73
return Schema2 (database: database);
74
+ case 3 :
75
+ return Schema3 (database: database);
62
76
default :
63
77
throw Exception ('unknown schema version: $schemaVersion ' );
64
78
}
65
79
}
66
80
67
- @DriftDatabase (tables: [Accounts ])
81
+ @DriftDatabase (tables: [GlobalSettings , Accounts ])
68
82
class AppDatabase extends _$AppDatabase {
69
83
AppDatabase (super .e);
70
84
@@ -79,7 +93,7 @@ class AppDatabase extends _$AppDatabase {
79
93
// * Write a migration in `onUpgrade` below.
80
94
// * Write tests.
81
95
@override
82
- int get schemaVersion => 2 ; // See note.
96
+ int get schemaVersion => 3 ; // See note.
83
97
84
98
Future <void > _dropAndCreateAll (Migrator m, {
85
99
required int schemaVersion,
@@ -128,6 +142,9 @@ class AppDatabase extends _$AppDatabase {
128
142
from1To2: (m, schema) async {
129
143
await m.addColumn (schema.accounts, schema.accounts.ackedPushToken);
130
144
},
145
+ from2To3: (m, schema) async {
146
+ await m.createTable (schema.globalSettings);
147
+ },
131
148
));
132
149
});
133
150
}
@@ -147,6 +164,25 @@ class AppDatabase extends _$AppDatabase {
147
164
rethrow ;
148
165
}
149
166
}
167
+
168
+ Future <GlobalSettingsData > ensureGlobalSettings () async {
169
+ final settings = await select (globalSettings).get ();
170
+ // TODO(db): Enforce the singleton constraint more robustly.
171
+ if (settings.isNotEmpty) {
172
+ if (settings.length > 1 ) {
173
+ assert (debugLog ('Expected one globalSettings, got multiple: $settings ' ));
174
+ }
175
+ return settings.first;
176
+ }
177
+
178
+ final rowsAffected = await into (globalSettings).insert (GlobalSettingsCompanion .insert ());
179
+ assert (rowsAffected == 1 );
180
+ final result = await select (globalSettings).get ();
181
+ if (result.length > 1 ) {
182
+ assert (debugLog ('Expected one globalSettings, got multiple: $result ' ));
183
+ }
184
+ return result.first;
185
+ }
150
186
}
151
187
152
188
class AccountAlreadyExistsException implements Exception {}
0 commit comments