From a77be8b43730a1a871024212dfcf3ffa86b6249c Mon Sep 17 00:00:00 2001 From: LDA Date: Sun, 25 Aug 2024 18:26:28 +0200 Subject: [PATCH] [MOD] Modify join/invite lists to be lazy --- src/User.c | 59 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/User.c b/src/User.c index d5c507e..1107eaf 100644 --- a/src/User.c +++ b/src/User.c @@ -130,15 +130,8 @@ UserLock(Db * db, char *name) user->name = StrDuplicate(name); user->deviceId = NULL; - if (!(user->inviteRef = DbLock(db, 3, "users", user->name, "invites"))) - { - user->inviteRef = DbCreate(db, 3, "users", user->name, "invites"); - } - if (!(user->joinRef = DbLock(db, 3, "users", user->name, "joins"))) - { - user->joinRef = DbCreate(db, 3, "users", user->name, "joins"); - } - + user->inviteRef = NULL; + user->joinRef = NULL; return user; } @@ -1040,6 +1033,7 @@ void UserAddInvite(User *user, char *roomId) { HashMap *data; + Db *db = user ? user->db : NULL; if (!user || !roomId) { return; @@ -1047,9 +1041,10 @@ UserAddInvite(User *user, char *roomId) if (!user->inviteRef) { - user->inviteRef = DbCreate(user->db, - 3, "users", user->name, "invites" - ); + if (!(user->inviteRef = DbLock(db, 3, "users", user->name, "invites"))) + { + user->inviteRef = DbCreate(db, 3, "users", user->name, "invites"); + } } data = DbJson(user->inviteRef); @@ -1061,11 +1056,19 @@ void UserRemoveInvite(User *user, char *roomId) { HashMap *data; + Db *db = user ? user->db : NULL; if (!user || !roomId) { return; } + if (!user->inviteRef) + { + if (!(user->inviteRef = DbLock(db, 3, "users", user->name, "invites"))) + { + user->inviteRef = DbCreate(db, 3, "users", user->name, "invites"); + } + } data = DbJson(user->inviteRef); JsonValueFree(HashMapDelete(data, roomId)); @@ -1075,6 +1078,7 @@ UserListInvites(User *user) { Array *arr; HashMap *data; + Db *db = user ? user->db : NULL; size_t i; if (!user) @@ -1082,6 +1086,13 @@ UserListInvites(User *user) return NULL; } + if (!user->inviteRef) + { + if (!(user->inviteRef = DbLock(db, 3, "users", user->name, "invites"))) + { + user->inviteRef = DbCreate(db, 3, "users", user->name, "invites"); + } + } data = DbJson(user->inviteRef); arr = HashMapKeys(data); for (i = 0; i < ArraySize(arr); i++) @@ -1096,6 +1107,7 @@ void UserAddJoin(User *user, char *roomId) { HashMap *data; + Db *db = user ? user->db : NULL; if (!user || !roomId) { return; @@ -1103,7 +1115,10 @@ UserAddJoin(User *user, char *roomId) if (!user->joinRef) { - user->joinRef = DbCreate(user->db, 3, "users", user->name, "joins"); + if (!(user->joinRef = DbLock(db, 3, "users", user->name, "joins"))) + { + user->joinRef = DbCreate(db, 3, "users", user->name, "joins"); + } } data = DbJson(user->joinRef); @@ -1116,11 +1131,20 @@ void UserRemoveJoin(User *user, char *roomId) { HashMap *data; + Db *db = user ? user->db : NULL; if (!user || !roomId || !user->joinRef) { return; } + if (!user->joinRef) + { + if (!(user->joinRef = DbLock(db, 3, "users", user->name, "joins"))) + { + user->joinRef = DbCreate(db, 3, "users", user->name, "joins"); + } + } + data = DbJson(user->joinRef); JsonValueFree(HashMapDelete(data, roomId)); @@ -1131,12 +1155,21 @@ UserListJoins(User *user) { Array *arr; HashMap *data; + Db *db = user ? user->db : NULL; size_t i; if (!user) { return NULL; } + if (!user->joinRef) + { + if (!(user->joinRef = DbLock(db, 3, "users", user->name, "joins"))) + { + user->joinRef = DbCreate(db, 3, "users", user->name, "joins"); + } + } + data = DbJson(user->joinRef); arr = HashMapKeys(data);