Skip to content

Commit 025c913

Browse files
committed
Prevent folder order inconsistency
I noticed that running two concurrent instances of Vienna led to inconsistencies which led Vienna to reset its folders to alphabetical order. This change will make new versions of Vienna have a safer behavior. However, problems can still arise when an older version of Vienna (or any app manipulating messages.db) is launched while a corrected version is already running. Issues #1768, #1779 and #1824
1 parent 35bc17e commit 025c913

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

Vienna/Sources/Database/Database.m

+24
Original file line numberDiff line numberDiff line change
@@ -1272,6 +1272,14 @@ -(BOOL)setParent:(NSInteger)newParentID forFolder:(NSInteger)folderId
12721272
parentFolder = [self folderFromID:parentFolder.parentId];
12731273
}
12741274

1275+
__block BOOL success = NO;
1276+
[self.databaseQueue inDatabase:^(FMDatabase *db) {
1277+
success = [db executeStatements:@"PRAGMA locking_mode = EXCLUSIVE;"];
1278+
}];
1279+
if (!success) {
1280+
return NO;
1281+
}
1282+
12751283
// Adjust the child unread count for the old parent.
12761284
NSInteger adjustment = 0;
12771285
if (folder.type == VNAFolderTypeRSS || folder.type == VNAFolderTypeOpenReader) {
@@ -1305,6 +1313,7 @@ -(BOOL)setParent:(NSInteger)newParentID forFolder:(NSInteger)folderId
13051313
[queue inDatabase:^(FMDatabase *db) {
13061314
[db executeUpdate:@"UPDATE folders SET parent_id=? WHERE folder_id=?",
13071315
@(newParentID), @(folderId)];
1316+
[db executeStatements:@"PRAGMA locking_mode = NORMAL;"];
13081317
}];
13091318
return YES;
13101319
}
@@ -1323,7 +1332,9 @@ -(BOOL)setFirstChild:(NSInteger)childId forFolder:(NSInteger)folderId
13231332

13241333
if (folderId == VNAFolderTypeRoot) {
13251334
[queue inDatabase:^(FMDatabase *db) {
1335+
[db executeStatements:@"PRAGMA locking_mode = EXCLUSIVE"];
13261336
[db executeUpdate:@"UPDATE info SET first_folder=?", @(childId)];
1337+
[db executeStatements:@"PRAGMA locking_mode = NORMAL;"];
13271338
}];
13281339
} else {
13291340
Folder * folder = [self folderFromID:folderId];
@@ -1333,8 +1344,10 @@ -(BOOL)setFirstChild:(NSInteger)childId forFolder:(NSInteger)folderId
13331344

13341345
folder.firstChildId = childId;
13351346
[queue inDatabase:^(FMDatabase *db) {
1347+
[db executeStatements:@"PRAGMA locking_mode = EXCLUSIVE;"];
13361348
[db executeUpdate:@"UPDATE folders SET first_child=? WHERE folder_id=?",
13371349
@(childId), @(folderId)];
1350+
[db executeStatements:@"PRAGMA locking_mode = NORMAL;"];
13381351
}];
13391352
}
13401353

@@ -1356,12 +1369,21 @@ -(BOOL)setNextSibling:(NSUInteger)nextSiblingId forFolder:(NSInteger)folderId
13561369
return NO;
13571370
}
13581371

1372+
__block BOOL success = NO;
1373+
[self.databaseQueue inDatabase:^(FMDatabase *db) {
1374+
success = [db executeStatements:@"PRAGMA locking_mode = EXCLUSIVE;"];
1375+
}];
1376+
if (!success) {
1377+
return NO;
1378+
}
1379+
13591380
folder.nextSiblingId = nextSiblingId;
13601381

13611382
FMDatabaseQueue *queue = self.databaseQueue;
13621383
[queue inDatabase:^(FMDatabase *db) {
13631384
[db executeUpdate:@"UPDATE folders SET next_sibling=? WHERE folder_id=?",
13641385
@(nextSiblingId), @(folderId)];
1386+
[db executeStatements:@"PRAGMA locking_mode = NORMAL;"];
13651387
}];
13661388

13671389
return YES;
@@ -1867,6 +1889,7 @@ -(void)initFolderArray
18671889
FMDatabaseQueue *queue = self.databaseQueue;
18681890

18691891
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
1892+
[db executeStatements:@"PRAGMA locking_mode = EXCLUSIVE;"];
18701893
FMResultSet * results = [db executeQuery:@"SELECT folder_id, parent_id, foldername, unread_count, last_update,"
18711894
@" type, flags, next_sibling, first_child FROM folders ORDER BY folder_id"];
18721895
if (!results) {
@@ -1934,6 +1957,7 @@ -(void)initFolderArray
19341957
folder.remoteId = remoteId;
19351958
}
19361959
[results close];
1960+
[db executeStatements:@"PRAGMA locking_mode = NORMAL;"];
19371961
}];
19381962
// Fix the childUnreadCount for every parent
19391963
for (Folder * folder in [self.foldersDict objectEnumerator]) {

0 commit comments

Comments
 (0)