[Store] Rewrite queries
This commit is contained in:
parent
83d747f5f5
commit
930404d149
|
@ -163,7 +163,7 @@ class Store {
|
||||||
Future<void> storeRoomUpdate(RoomUpdate roomUpdate) {
|
Future<void> storeRoomUpdate(RoomUpdate roomUpdate) {
|
||||||
// Insert the chat into the database if not exists
|
// Insert the chat into the database if not exists
|
||||||
txn.rawInsert(
|
txn.rawInsert(
|
||||||
"INSERT OR IGNORE INTO Rooms " + "VALUES(?, ?, 0, 0, '', 0, 0) ",
|
"INSERT OR IGNORE INTO Rooms " + "VALUES(?, ?, 0, 0, '', 0, 0, '') ",
|
||||||
[roomUpdate.id, roomUpdate.membership.toString().split('.').last]);
|
[roomUpdate.id, roomUpdate.membership.toString().split('.').last]);
|
||||||
|
|
||||||
// Update the notification counts and the limited timeline boolean and the summary
|
// Update the notification counts and the limited timeline boolean and the summary
|
||||||
|
@ -294,7 +294,7 @@ class Store {
|
||||||
/// Returns a User object by a given Matrix ID and a Room.
|
/// Returns a User object by a given Matrix ID and a Room.
|
||||||
Future<User> getUser({String matrixID, Room room}) async {
|
Future<User> getUser({String matrixID, Room room}) async {
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
List<Map<String, dynamic>> res = await db.rawQuery(
|
||||||
"SELECT * FROM Users WHERE matrix_id=? AND chat_id=?",
|
"SELECT * FROM States WHERE state_key=? AND room_id=?",
|
||||||
[matrixID, room.id]);
|
[matrixID, room.id]);
|
||||||
if (res.length != 1) return null;
|
if (res.length != 1) return null;
|
||||||
return User.fromJson(res[0], room);
|
return User.fromJson(res[0], room);
|
||||||
|
@ -304,7 +304,7 @@ class Store {
|
||||||
/// except users who are in the Room with the ID [exceptRoomID].
|
/// except users who are in the Room with the ID [exceptRoomID].
|
||||||
Future<List<User>> loadContacts({String exceptRoomID = ""}) async {
|
Future<List<User>> loadContacts({String exceptRoomID = ""}) async {
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
List<Map<String, dynamic>> res = await db.rawQuery(
|
||||||
"SELECT * FROM Users WHERE matrix_id!=? AND chat_id!=? GROUP BY matrix_id ORDER BY displayname",
|
"SELECT * FROM States WHERE state_key!=? AND room_id!=? GROUP BY state_key ORDER BY state_key",
|
||||||
[client.userID, exceptRoomID]);
|
[client.userID, exceptRoomID]);
|
||||||
List<User> userList = [];
|
List<User> userList = [];
|
||||||
for (int i = 0; i < res.length; i++)
|
for (int i = 0; i < res.length; i++)
|
||||||
|
@ -316,9 +316,9 @@ class Store {
|
||||||
Future<List<User>> loadParticipants(Room room) async {
|
Future<List<User>> loadParticipants(Room room) async {
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
List<Map<String, dynamic>> res = await db.rawQuery(
|
||||||
"SELECT * " +
|
"SELECT * " +
|
||||||
" FROM Users " +
|
" FROM States " +
|
||||||
" WHERE chat_id=? " +
|
" WHERE room_id=? " +
|
||||||
" AND membership='join'",
|
" AND type='m.room.member'",
|
||||||
[room.id]);
|
[room.id]);
|
||||||
|
|
||||||
List<User> participants = [];
|
List<User> participants = [];
|
||||||
|
@ -332,26 +332,18 @@ class Store {
|
||||||
|
|
||||||
/// Returns a list of events for the given room and sets all participants.
|
/// Returns a list of events for the given room and sets all participants.
|
||||||
Future<List<Event>> getEventList(Room room) async {
|
Future<List<Event>> getEventList(Room room) async {
|
||||||
List<Map<String, dynamic>> memberRes = await db.rawQuery(
|
|
||||||
"SELECT * " + " FROM Users " + " WHERE Users.chat_id=?", [room.id]);
|
|
||||||
Map<String, User> userMap = {};
|
|
||||||
for (num i = 0; i < memberRes.length; i++)
|
|
||||||
userMap[memberRes[i]["matrix_id"]] = User.fromJson(memberRes[i], room);
|
|
||||||
|
|
||||||
List<Map<String, dynamic>> eventRes = await db.rawQuery(
|
List<Map<String, dynamic>> eventRes = await db.rawQuery(
|
||||||
"SELECT * " +
|
"SELECT * " +
|
||||||
" FROM Events events " +
|
" FROM Events " +
|
||||||
" WHERE events.chat_id=?" +
|
" WHERE room_id=?" +
|
||||||
" GROUP BY events.id " +
|
" GROUP BY id " +
|
||||||
" ORDER BY origin_server_ts DESC",
|
" ORDER BY origin_server_ts DESC",
|
||||||
[room.id]);
|
[room.id]);
|
||||||
|
|
||||||
List<Event> eventList = [];
|
List<Event> eventList = [];
|
||||||
|
|
||||||
for (num i = 0; i < eventRes.length; i++)
|
for (num i = 0; i < eventRes.length; i++)
|
||||||
eventList.add(Event.fromJson(eventRes[i], room,
|
eventList.add(Event.fromJson(eventRes[i], room));
|
||||||
senderUser: userMap[eventRes[i]["sender"]],
|
|
||||||
stateKeyUser: userMap[eventRes[i]["state_key"]]));
|
|
||||||
|
|
||||||
return eventList;
|
return eventList;
|
||||||
}
|
}
|
||||||
|
@ -362,25 +354,18 @@ class Store {
|
||||||
bool onlyDirect = false,
|
bool onlyDirect = false,
|
||||||
bool onlyGroups = false}) async {
|
bool onlyGroups = false}) async {
|
||||||
if (onlyDirect && onlyGroups) return [];
|
if (onlyDirect && onlyGroups) return [];
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
List<Map<String, dynamic>> res = await db.rawQuery("SELECT * " +
|
||||||
"SELECT rooms.*, events.origin_server_ts, events.content_json, events.type, events.sender, events.status, events.state_key " +
|
" FROM Rooms" +
|
||||||
" FROM Rooms rooms LEFT JOIN Events events " +
|
|
||||||
" ON rooms.id=events.chat_id " +
|
|
||||||
" WHERE rooms.membership" +
|
" WHERE rooms.membership" +
|
||||||
(onlyLeft ? "=" : "!=") +
|
(onlyLeft ? "=" : "!=") +
|
||||||
"'leave' " +
|
"'leave' " +
|
||||||
(onlyDirect ? " AND rooms.direct_chat_matrix_id!= '' " : "") +
|
|
||||||
(onlyGroups ? " AND rooms.direct_chat_matrix_id= '' " : "") +
|
|
||||||
" GROUP BY rooms.id " +
|
" GROUP BY rooms.id " +
|
||||||
" ORDER BY origin_server_ts DESC ");
|
" ORDER BY origin_server_ts DESC ");
|
||||||
List<Room> roomList = [];
|
List<Room> roomList = [];
|
||||||
for (num i = 0; i < res.length; i++) {
|
for (num i = 0; i < res.length; i++) {
|
||||||
try {
|
Room room = await Room.getRoomFromTableRow(
|
||||||
Room room = await Room.getRoomFromTableRow(res[i], client);
|
res[i], client); // TODO: Also query the states for a room
|
||||||
roomList.add(room);
|
roomList.add(room);
|
||||||
} catch (e) {
|
|
||||||
print(e.toString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return roomList;
|
return roomList;
|
||||||
}
|
}
|
||||||
|
@ -393,97 +378,6 @@ class Store {
|
||||||
return Room.getRoomFromTableRow(res[0], client);
|
return Room.getRoomFromTableRow(res[0], client);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a room without events and participants.
|
|
||||||
Future<Room> getRoomByAlias(String alias) async {
|
|
||||||
List<Map<String, dynamic>> res = await db
|
|
||||||
.rawQuery("SELECT * FROM Rooms WHERE canonical_alias=?", [alias]);
|
|
||||||
if (res.length != 1) return null;
|
|
||||||
return Room.getRoomFromTableRow(res[0], client);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calculates and returns an avatar for a direct chat by a given [roomID].
|
|
||||||
Future<String> getAvatarFromSingleChat(String roomID) async {
|
|
||||||
String avatarStr = "";
|
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
|
||||||
"SELECT avatar_url FROM Users " +
|
|
||||||
" WHERE Users.chat_id=? " +
|
|
||||||
" AND (Users.membership='join' OR Users.membership='invite') " +
|
|
||||||
" AND Users.matrix_id!=? ",
|
|
||||||
[roomID, client.userID]);
|
|
||||||
if (res.length == 1) avatarStr = res[0]["avatar_url"];
|
|
||||||
return avatarStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calculates a chat name for a groupchat without a name. The chat name will
|
|
||||||
/// be the name of all users (excluding the user of this client) divided by
|
|
||||||
/// ','.
|
|
||||||
Future<String> getChatNameFromMemberNames(String roomID) async {
|
|
||||||
String displayname = 'Empty chat';
|
|
||||||
List<Map<String, dynamic>> rs = await db.rawQuery(
|
|
||||||
"SELECT Users.displayname, Users.matrix_id, Users.membership FROM Users " +
|
|
||||||
" WHERE Users.chat_id=? " +
|
|
||||||
" AND (Users.membership='join' OR Users.membership='invite') " +
|
|
||||||
" AND Users.matrix_id!=? ",
|
|
||||||
[roomID, client.userID]);
|
|
||||||
if (rs.length > 0) {
|
|
||||||
displayname = "";
|
|
||||||
for (var i = 0; i < rs.length; i++) {
|
|
||||||
String username = rs[i]["displayname"];
|
|
||||||
if (username == "" || username == null) username = rs[i]["matrix_id"];
|
|
||||||
if (rs[i]["state_key"] != client.userID) displayname += username + ", ";
|
|
||||||
}
|
|
||||||
if (displayname == "" || displayname == null)
|
|
||||||
displayname = 'Empty chat';
|
|
||||||
else
|
|
||||||
displayname = displayname.substring(0, displayname.length - 2);
|
|
||||||
}
|
|
||||||
return displayname;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the (first) room ID from the store which is a private chat with
|
|
||||||
/// the user [userID]. Returns null if there is none.
|
|
||||||
Future<String> getDirectChatRoomID(String userID) async {
|
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
|
||||||
"SELECT id FROM Rooms WHERE direct_chat_matrix_id=? AND membership!='leave' LIMIT 1",
|
|
||||||
[userID]);
|
|
||||||
if (res.length != 1) return null;
|
|
||||||
return res[0]["id"];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the power level of the user for the given [roomID]. Returns null if
|
|
||||||
/// the room or the own user wasn't found.
|
|
||||||
Future<int> getPowerLevel(String roomID) async {
|
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
|
||||||
"SELECT power_level FROM Users WHERE matrix_id=? AND chat_id=?",
|
|
||||||
[roomID, client.userID]);
|
|
||||||
if (res.length != 1) return null;
|
|
||||||
return res[0]["power_level"];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the power levels from all users for the given [roomID].
|
|
||||||
Future<Map<String, int>> getPowerLevels(String roomID) async {
|
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
|
||||||
"SELECT matrix_id, power_level FROM Users WHERE chat_id=?",
|
|
||||||
[roomID, client.userID]);
|
|
||||||
Map<String, int> powerMap = {};
|
|
||||||
for (int i = 0; i < res.length; i++)
|
|
||||||
powerMap[res[i]["matrix_id"]] = res[i]["power_level"];
|
|
||||||
return powerMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Map<String, List<String>>> getAccountDataDirectChats() async {
|
|
||||||
Map<String, List<String>> directChats = {};
|
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
|
||||||
"SELECT id, direct_chat_matrix_id FROM Rooms WHERE direct_chat_matrix_id!=''");
|
|
||||||
for (int i = 0; i < res.length; i++) {
|
|
||||||
if (directChats.containsKey(res[i]["direct_chat_matrix_id"]))
|
|
||||||
directChats[res[i]["direct_chat_matrix_id"]].add(res[i]["id"]);
|
|
||||||
else
|
|
||||||
directChats[res[i]["direct_chat_matrix_id"]] = [res[i]["id"]];
|
|
||||||
}
|
|
||||||
return directChats;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> forgetRoom(String roomID) async {
|
Future<void> forgetRoom(String roomID) async {
|
||||||
await db.rawDelete("DELETE FROM Rooms WHERE id=?", [roomID]);
|
await db.rawDelete("DELETE FROM Rooms WHERE id=?", [roomID]);
|
||||||
return;
|
return;
|
||||||
|
@ -492,10 +386,9 @@ class Store {
|
||||||
/// Searches for the event in the store.
|
/// Searches for the event in the store.
|
||||||
Future<Event> getEventById(String eventID, Room room) async {
|
Future<Event> getEventById(String eventID, Room room) async {
|
||||||
List<Map<String, dynamic>> res = await db.rawQuery(
|
List<Map<String, dynamic>> res = await db.rawQuery(
|
||||||
"SELECT * FROM Events WHERE id=? AND chat_id=?", [eventID, room.id]);
|
"SELECT * FROM Events WHERE id=? AND room_id=?", [eventID, room.id]);
|
||||||
if (res.length == 0) return null;
|
if (res.length == 0) return null;
|
||||||
return Event.fromJson(res[0], room,
|
return Event.fromJson(res[0], room);
|
||||||
senderUser: (await room.getUserByMXID(res[0]["sender"])));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future forgetNotification(String roomID) async {
|
Future forgetNotification(String roomID) async {
|
||||||
|
@ -541,14 +434,9 @@ class Store {
|
||||||
'prev_batch TEXT, ' +
|
'prev_batch TEXT, ' +
|
||||||
'joined_member_count INTEGER, ' +
|
'joined_member_count INTEGER, ' +
|
||||||
'invited_member_count INTEGER, ' +
|
'invited_member_count INTEGER, ' +
|
||||||
|
'heroes TEXT, ' +
|
||||||
'UNIQUE(id))',
|
'UNIQUE(id))',
|
||||||
|
|
||||||
/// The users which can be used to generate a room name if the room does not have one.
|
|
||||||
'Heroes': 'CREATE TABLE IF NOT EXISTS Heroes(' +
|
|
||||||
'room_id TEXT PRIMARY KEY, ' +
|
|
||||||
'matrix_id TEXT, ' +
|
|
||||||
'UNIQUE(room_id,matrix_id))',
|
|
||||||
|
|
||||||
/// The database scheme for the TimelineEvent class.
|
/// The database scheme for the TimelineEvent class.
|
||||||
'Events': 'CREATE TABLE IF NOT EXISTS Events(' +
|
'Events': 'CREATE TABLE IF NOT EXISTS Events(' +
|
||||||
'event_id TEXT PRIMARY KEY, ' +
|
'event_id TEXT PRIMARY KEY, ' +
|
||||||
|
|
Loading…
Reference in a new issue