From 28b47e985c7cc1e2e8b9af40cfc16eea5fba24db Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Fri, 9 Oct 2020 22:08:19 +0000 Subject: [PATCH] MTXStorage: Add support for storing joined rooms FossilOrigin-Name: 027eb0e2f8e814fdc47db7a5edc266c4988eff89bb9875e3ff99b2b8f59e3908 --- src/MTXSQLite3Storage.m | 83 ++++++++++++++++++++++++++++++++++++++--- src/MTXStorage.h | 28 ++++++++++++++ 2 files changed, 106 insertions(+), 5 deletions(-) diff --git a/src/MTXSQLite3Storage.m b/src/MTXSQLite3Storage.m index 031085d..81b97c9 100644 --- a/src/MTXSQLite3Storage.m +++ b/src/MTXSQLite3Storage.m @@ -28,6 +28,9 @@ { SL3Connection *_conn; SL3PreparedStatement *_nextBatchSetStatement, *_nextBatchGetStatement; + SL3PreparedStatement *_joinedRoomsAddStatement; + SL3PreparedStatement *_joinedRoomsRemoveStatement; + SL3PreparedStatement *_joinedRoomsGetStatement; } + (instancetype)storageWithPath: (OFString *)path @@ -55,6 +58,18 @@ _nextBatchGetStatement = [[_conn prepareStatement: @"SELECT next_batch FROM next_batch\n" @"WHERE device_id=$device_id"] retain]; + _joinedRoomsAddStatement = [[_conn prepareStatement: + @"INSERT INTO joined_rooms (\n" + @" user_id, room_id\n" + @") VALUES (\n" + @" $user_id, $room_id\n" + @")"] retain]; + _joinedRoomsRemoveStatement = [[_conn prepareStatement: + @"DELETE FROM joined_rooms\n" + @"WHERE user_id=$user_id AND room_id=$room_id"] retain]; + _joinedRoomsGetStatement = [[_conn prepareStatement: + @"SELECT room_id FROM joined_rooms\n" + @"WHERE user_id=$user_id"] retain]; objc_autoreleasePoolPop(pool); } @catch (id e) { @@ -69,6 +84,9 @@ { [_nextBatchSetStatement release]; [_nextBatchGetStatement release]; + [_joinedRoomsAddStatement release]; + [_joinedRoomsRemoveStatement release]; + [_joinedRoomsGetStatement release]; [_conn release]; [super dealloc]; @@ -76,10 +94,16 @@ - (void)createTables { - [_conn executeStatement: @"CREATE TABLE IF NOT EXISTS next_batch (\n" - @" device_id TEXT PRIMARY KEY,\n" - @" next_batch TEXT\n" - @")"]; + [_conn executeStatement: + @"CREATE TABLE IF NOT EXISTS next_batch (\n" + @" device_id TEXT PRIMARY KEY,\n" + @" next_batch TEXT\n" + @");\n" + @"CREATE TABLE IF NOT EXISTS joined_rooms (\n" + @" user_id TEXT,\n" + @" room_id TEXT,\n" + @" PRIMARY KEY (user_id, room_id)\n" + @");"]; } - (void)transactionWithBlock: (mtx_storage_transaction_block_t)block @@ -115,10 +139,59 @@ return nil; OFString *nextBatch = - [[_nextBatchGetStatement rowDictionary][@"next_batch"] retain]; + [_nextBatchGetStatement.rowDictionary[@"next_batch"] retain]; objc_autoreleasePoolPop(pool); return [nextBatch autorelease]; } + +- (void)addJoinedRoom: (OFString *)roomID + forUser: (OFString *)userID +{ + void *pool = objc_autoreleasePoolPush(); + + [_joinedRoomsAddStatement reset]; + [_joinedRoomsAddStatement bindWithDictionary: @{ + @"$room_id": roomID, + @"$user_id": userID + }]; + [_joinedRoomsAddStatement step]; + + objc_autoreleasePoolPop(pool); +} + +- (void)removeJoinedRoom: (OFString *)roomID + forUser: (OFString *)userID +{ + void *pool = objc_autoreleasePoolPush(); + + [_joinedRoomsRemoveStatement reset]; + [_joinedRoomsRemoveStatement bindWithDictionary: @{ + @"$room_id": roomID, + @"$user_id": userID + }]; + [_joinedRoomsRemoveStatement step]; + + objc_autoreleasePoolPop(pool); +} + +- (OFArray *)joinedRoomsForUser: (OFString *)userID +{ + OFMutableArray *joinedRooms = [OFMutableArray array]; + void *pool = objc_autoreleasePoolPush(); + + [_joinedRoomsGetStatement reset]; + [_joinedRoomsGetStatement bindWithDictionary: @{ + @"$user_id": userID + }]; + + while ([_joinedRoomsGetStatement step]) + [joinedRooms addObject: + _joinedRoomsGetStatement.rowDictionary[@"room_id"]]; + + objc_autoreleasePoolPop(pool); + + return [joinedRooms autorelease]; +} @end diff --git a/src/MTXStorage.h b/src/MTXStorage.h index c3a8ad9..765eb1f 100644 --- a/src/MTXStorage.h +++ b/src/MTXStorage.h @@ -58,6 +58,34 @@ typedef bool (^mtx_storage_transaction_block_t)(void); * available. */ - (nullable OFString *)nextBatchForDeviceID: (OFString *)deviceID; + +/** + * @brief Adds the specified room ID to the list of joined rooms for the + * specified user ID. + * + * @param roomID The room ID to add to the list of joined rooms + * @param userID The user ID for which to add the room + */ +- (void)addJoinedRoom: (OFString *)roomID + forUser: (OFString *)userID; + +/** + * @brief Removes the specified room ID to the list of joined rooms for the + * specified user ID. + * + * @param roomID The room ID to add to the list of joined rooms + * @param userID The user ID for which to add the room + */ +- (void)removeJoinedRoom: (OFString *)roomID + forUser: (OFString *)userID; + +/** + * @brief Returns the joined room IDs for the specified user ID. + * + * @param userID The user ID for which to return the joined rooms + * @return The joined room IDs for the specified user ID + */ +- (OFArray *)joinedRoomsForUser: (OFString *)userID; @end OF_ASSUME_NONNULL_END