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;
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<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

View file

@ -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<OFString *> *)joinedRoomsForUser: (OFString *)userID;
@end
OF_ASSUME_NONNULL_END