MTXStorage: Add support for storing joined rooms

FossilOrigin-Name: 027eb0e2f8e814fdc47db7a5edc266c4988eff89bb9875e3ff99b2b8f59e3908
This commit is contained in:
Jonathan Schleifer 2020-10-09 22:08:19 +00:00
parent 962fc15935
commit 28b47e985c
2 changed files with 106 additions and 5 deletions

View file

@ -28,6 +28,9 @@
{ {
SL3Connection *_conn; SL3Connection *_conn;
SL3PreparedStatement *_nextBatchSetStatement, *_nextBatchGetStatement; SL3PreparedStatement *_nextBatchSetStatement, *_nextBatchGetStatement;
SL3PreparedStatement *_joinedRoomsAddStatement;
SL3PreparedStatement *_joinedRoomsRemoveStatement;
SL3PreparedStatement *_joinedRoomsGetStatement;
} }
+ (instancetype)storageWithPath: (OFString *)path + (instancetype)storageWithPath: (OFString *)path
@ -55,6 +58,18 @@
_nextBatchGetStatement = [[_conn prepareStatement: _nextBatchGetStatement = [[_conn prepareStatement:
@"SELECT next_batch FROM next_batch\n" @"SELECT next_batch FROM next_batch\n"
@"WHERE device_id=$device_id"] retain]; @"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); objc_autoreleasePoolPop(pool);
} @catch (id e) { } @catch (id e) {
@ -69,6 +84,9 @@
{ {
[_nextBatchSetStatement release]; [_nextBatchSetStatement release];
[_nextBatchGetStatement release]; [_nextBatchGetStatement release];
[_joinedRoomsAddStatement release];
[_joinedRoomsRemoveStatement release];
[_joinedRoomsGetStatement release];
[_conn release]; [_conn release];
[super dealloc]; [super dealloc];
@ -76,10 +94,16 @@
- (void)createTables - (void)createTables
{ {
[_conn executeStatement: @"CREATE TABLE IF NOT EXISTS next_batch (\n" [_conn executeStatement:
@"CREATE TABLE IF NOT EXISTS next_batch (\n"
@" device_id TEXT PRIMARY KEY,\n" @" device_id TEXT PRIMARY KEY,\n"
@" next_batch TEXT\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 - (void)transactionWithBlock: (mtx_storage_transaction_block_t)block
@ -115,10 +139,59 @@
return nil; return nil;
OFString *nextBatch = OFString *nextBatch =
[[_nextBatchGetStatement rowDictionary][@"next_batch"] retain]; [_nextBatchGetStatement.rowDictionary[@"next_batch"] retain];
objc_autoreleasePoolPop(pool); objc_autoreleasePoolPop(pool);
return [nextBatch autorelease]; 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<OFString *> *)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 @end

View file

@ -58,6 +58,34 @@ typedef bool (^mtx_storage_transaction_block_t)(void);
* available. * available.
*/ */
- (nullable OFString *)nextBatchForDeviceID: (OFString *)deviceID; - (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<OFString *> *)joinedRoomsForUser: (OFString *)userID;
@end @end
OF_ASSUME_NONNULL_END OF_ASSUME_NONNULL_END