From ba372a3d17a3e27fc571d8fc1f87c0cd37fc7caf Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Sat, 14 Aug 2021 19:45:27 +0200 Subject: [PATCH] Update instead of replace user to avoid CASCADE deleting all cached feeds Previously, every time database entry for the user is updated (as it is on startup of the app), the tables depending on the user will get wiped. This includes notifications, public and home feeds, so that breaks quite a bit of things in a hard to debug way. --- .../java/org/pixeldroid/app/utils/db/DBUtils.kt | 2 +- .../org/pixeldroid/app/utils/db/dao/UserDao.kt | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/pixeldroid/app/utils/db/DBUtils.kt b/app/src/main/java/org/pixeldroid/app/utils/db/DBUtils.kt index fea14708..df33746e 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/db/DBUtils.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/db/DBUtils.kt @@ -14,7 +14,7 @@ import java.lang.IllegalArgumentException fun addUser(db: AppDatabase, account: Account, instance_uri: String, activeUser: Boolean = true, accessToken: String, refreshToken: String?, clientId: String, clientSecret: String) { - db.userDao().insertUser( + db.userDao().insertOrUpdate( UserDatabaseEntity( user_id = account.id!!, instance_uri = normalizeDomain(instance_uri), diff --git a/app/src/main/java/org/pixeldroid/app/utils/db/dao/UserDao.kt b/app/src/main/java/org/pixeldroid/app/utils/db/dao/UserDao.kt index 396f152e..b1a696e3 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/db/dao/UserDao.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/db/dao/UserDao.kt @@ -5,8 +5,21 @@ import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity @Dao interface UserDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertUser(user: UserDatabaseEntity) + /** + * Insert a user, if it already exists return -1 + */ + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insertUser(user: UserDatabaseEntity): Long + + @Transaction + fun insertOrUpdate(user: UserDatabaseEntity) { + if (insertUser(user) == -1L) { + updateUser(user) + } + } + + @Update + fun updateUser(user: UserDatabaseEntity) @Query("UPDATE users SET accessToken = :accessToken, refreshToken = :refreshToken WHERE user_id = :id and instance_uri = :instance_uri") fun updateAccessToken(accessToken: String, refreshToken: String, id: String, instance_uri: String)