Added SQLite storage backend.
This commit is contained in:
parent
999ce86a27
commit
3f6007922c
21 changed files with 665 additions and 245 deletions
126
SharpChat.SQLite/SQLiteMessageStorage.cs
Normal file
126
SharpChat.SQLite/SQLiteMessageStorage.cs
Normal file
|
@ -0,0 +1,126 @@
|
|||
using SharpChat.Messages;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Data.SQLite;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace SharpChat.SQLite;
|
||||
|
||||
public class SQLiteMessageStorage(SQLiteConnection conn) : MessageStorage {
|
||||
public async Task LogMessage(
|
||||
long id,
|
||||
string type,
|
||||
string channelName,
|
||||
string senderId,
|
||||
string senderName,
|
||||
ColourInheritable senderColour,
|
||||
int senderRank,
|
||||
string senderNick,
|
||||
UserPermissions senderPerms,
|
||||
object? data = null
|
||||
) {
|
||||
try {
|
||||
await conn.RunCommand(
|
||||
"INSERT INTO messages (msg_id, msg_type, msg_created, msg_channel, msg_sender, msg_sender_name, msg_sender_colour, msg_sender_rank, msg_sender_nick, msg_sender_perms, msg_data)"
|
||||
+ " VALUES (@id, @type, @created, @channel, @sender, @sender_name, @sender_colour, @sender_rank, @sender_nick, @sender_perms, @data)",
|
||||
new SQLiteParameter("id", id),
|
||||
new SQLiteParameter("type", type),
|
||||
new SQLiteParameter("created", $"{DateTimeOffset.UtcNow:s}Z"),
|
||||
new SQLiteParameter("channel", string.IsNullOrWhiteSpace(channelName) ? null : channelName),
|
||||
new SQLiteParameter("sender", long.TryParse(senderId, out long senderId64) && senderId64 > 0 ? senderId64 : null),
|
||||
new SQLiteParameter("sender_name", senderName),
|
||||
new SQLiteParameter("sender_colour", senderColour.Rgb.HasValue ? senderColour.Rgb.Value.Raw : null),
|
||||
new SQLiteParameter("sender_rank", senderRank),
|
||||
new SQLiteParameter("sender_nick", string.IsNullOrWhiteSpace(senderNick) ? null : senderNick),
|
||||
new SQLiteParameter("sender_perms", SQLiteUserPermissionsConverter.To(senderPerms)),
|
||||
new SQLiteParameter("data", data == null ? "{}" : JsonSerializer.SerializeToUtf8Bytes(data))
|
||||
);
|
||||
} catch(SQLiteException ex) {
|
||||
Logger.Write(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task DeleteMessage(Message msg) {
|
||||
try {
|
||||
await conn.RunCommand(
|
||||
"UPDATE IGNORE messages SET msg_deleted = NOW() WHERE msg_id = @id AND msg_deleted IS NULL",
|
||||
new SQLiteParameter("id", msg.Id)
|
||||
);
|
||||
} catch(SQLiteException ex) {
|
||||
Logger.Write(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static Message ReadMessage(DbDataReader reader) {
|
||||
return new Message(
|
||||
reader.GetInt64("msg_id"),
|
||||
reader.GetString("msg_type"),
|
||||
reader.IsDBNull(reader.GetOrdinal("msg_sender")) ? null : reader.GetString("msg_sender"),
|
||||
reader.IsDBNull(reader.GetOrdinal("msg_sender_name")) ? string.Empty : reader.GetString("msg_sender_name"),
|
||||
ColourInheritable.FromMisuzu(reader.GetInt32("msg_sender_colour")),
|
||||
reader.GetInt32("msg_sender_rank"),
|
||||
SQLiteUserPermissionsConverter.From((SQLiteUserPermissions)reader.GetInt32("msg_sender_perms")),
|
||||
reader.IsDBNull(reader.GetOrdinal("msg_sender_nick")) ? string.Empty : reader.GetString("msg_sender_nick"),
|
||||
DateTimeOffset.Parse(reader.GetString("msg_created")),
|
||||
reader.IsDBNull(reader.GetOrdinal("msg_deleted")) ? null : DateTimeOffset.Parse(reader.GetString("msg_deleted")),
|
||||
reader.IsDBNull(reader.GetOrdinal("msg_channel")) ? null : reader.GetString("msg_channel"),
|
||||
JsonDocument.Parse(reader.GetString("msg_data"))
|
||||
);
|
||||
}
|
||||
|
||||
public async Task<Message?> GetMessage(long id) {
|
||||
try {
|
||||
using DbDataReader? reader = await conn.RunQuery(
|
||||
"SELECT msg_id, msg_type, msg_created, msg_deleted, msg_channel, msg_sender, msg_sender_name, msg_sender_colour, msg_sender_rank, msg_sender_nick, msg_sender_perms, msg_data"
|
||||
+ " FROM messages WHERE msg_id = @id",
|
||||
new SQLiteParameter("id", id)
|
||||
);
|
||||
|
||||
if(reader is null)
|
||||
return null;
|
||||
|
||||
while(reader.Read()) {
|
||||
Message evt = ReadMessage(reader);
|
||||
if(evt != null)
|
||||
return evt;
|
||||
}
|
||||
} catch(SQLiteException ex) {
|
||||
Logger.Write(ex);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Message>> GetMessages(string channelName, int amount = 20, int offset = 0) {
|
||||
List<Message> msgs = [];
|
||||
|
||||
try {
|
||||
using DbDataReader? reader = await conn.RunQuery(
|
||||
"SELECT msg_id, msg_type, msg_created, msg_deleted, msg_channel, msg_sender, msg_sender_name, msg_sender_colour, msg_sender_rank, msg_sender_nick, msg_sender_perms, msg_data"
|
||||
+ " FROM messages"
|
||||
+ " WHERE msg_deleted IS NULL AND (msg_channel = @channel OR msg_channel IS NULL)"
|
||||
+ " AND msg_id > @offset"
|
||||
+ " ORDER BY msg_id DESC"
|
||||
+ " LIMIT @amount",
|
||||
new SQLiteParameter("channel", channelName),
|
||||
new SQLiteParameter("amount", amount),
|
||||
new SQLiteParameter("offset", offset)
|
||||
);
|
||||
if(reader is null)
|
||||
return msgs;
|
||||
|
||||
while(reader.Read()) {
|
||||
Message evt = ReadMessage(reader);
|
||||
if(evt != null)
|
||||
msgs.Add(evt);
|
||||
}
|
||||
} catch(SQLiteException ex) {
|
||||
Logger.Write(ex);
|
||||
}
|
||||
|
||||
msgs.Reverse();
|
||||
|
||||
return msgs;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue