Support bidirectional storage conversion.
This commit is contained in:
parent
0bc025e5f8
commit
a487a8dadf
5 changed files with 171 additions and 53 deletions
SharpChat.SQLite
|
@ -11,6 +11,29 @@ using ZLogger;
|
|||
namespace SharpChat.SQLite;
|
||||
|
||||
public class SQLiteMessageStorage(ILogger logger, SQLiteConnection conn) : MessageStorage {
|
||||
public async Task LogMessage(Message msg) {
|
||||
try {
|
||||
await conn.RunCommand(
|
||||
"INSERT OR IGNORE 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", msg.Id),
|
||||
new SQLiteParameter("type", msg.Type),
|
||||
new SQLiteParameter("channel", string.IsNullOrWhiteSpace(msg.ChannelName) ? null : msg.ChannelName),
|
||||
new SQLiteParameter("data", JsonSerializer.SerializeToUtf8Bytes(msg.Data)),
|
||||
new SQLiteParameter("sender", long.TryParse(msg.SenderId, out long senderId64) && senderId64 > 0 ? senderId64 : null),
|
||||
new SQLiteParameter("sender_name", msg.SenderName),
|
||||
new SQLiteParameter("sender_colour", msg.SenderColour.Rgb.HasValue ? msg.SenderColour.Rgb.Value.Raw : null),
|
||||
new SQLiteParameter("sender_rank", msg.SenderRank),
|
||||
new SQLiteParameter("sender_nick", string.IsNullOrWhiteSpace(msg.SenderNickName) ? null : msg.SenderNickName),
|
||||
new SQLiteParameter("sender_perms", SQLiteUserPermissionsConverter.To(msg.SenderPermissions)),
|
||||
new SQLiteParameter("created", $"{msg.Created:s}Z"),
|
||||
new SQLiteParameter("deleted", msg.Deleted is null ? null : $"{msg.Deleted:s}Z")
|
||||
);
|
||||
} catch(SQLiteException ex) {
|
||||
logger.ZLogError($"Error in LogMessage(Message): {ex}");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task LogMessage(
|
||||
long id,
|
||||
string type,
|
||||
|
@ -40,7 +63,7 @@ public class SQLiteMessageStorage(ILogger logger, SQLiteConnection conn) : Messa
|
|||
new SQLiteParameter("data", data == null ? "{}" : JsonSerializer.SerializeToUtf8Bytes(data))
|
||||
);
|
||||
} catch(SQLiteException ex) {
|
||||
logger.ZLogError($"Error in LogMessage(): {ex}");
|
||||
logger.ZLogError($"Error in LogMessage(long, ...): {ex}");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -61,7 +84,7 @@ public class SQLiteMessageStorage(ILogger logger, SQLiteConnection conn) : Messa
|
|||
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((int)reader.GetInt64("msg_sender_colour")),
|
||||
reader.IsDBNull(reader.GetOrdinal("msg_sender_colour")) ? ColourInheritable.None : ColourInheritable.FromRaw((int)reader.GetInt64("msg_sender_colour")),
|
||||
(int)reader.GetInt64("msg_sender_rank"),
|
||||
SQLiteUserPermissionsConverter.From((SQLiteUserPermissions)reader.GetInt64("msg_sender_perms")),
|
||||
reader.IsDBNull(reader.GetOrdinal("msg_sender_nick")) ? string.Empty : reader.GetString("msg_sender_nick"),
|
||||
|
@ -87,6 +110,33 @@ public class SQLiteMessageStorage(ILogger logger, SQLiteConnection conn) : Messa
|
|||
}
|
||||
}
|
||||
|
||||
public async Task<long> CountMessages(
|
||||
string? channelName = null,
|
||||
bool includeDeleted = false
|
||||
) {
|
||||
List<SQLiteParameter> parameters = [];
|
||||
bool firstParam = true;
|
||||
StringBuilder qb = new();
|
||||
qb.Append("SELECT COUNT(*) FROM messages");
|
||||
|
||||
if(!includeDeleted) {
|
||||
firstParam = false;
|
||||
qb.Append(" WHERE msg_deleted IS NULL");
|
||||
}
|
||||
|
||||
if(!string.IsNullOrEmpty(channelName)) {
|
||||
qb.AppendFormat(" {0} (msg_channel = @channel OR msg_channel IS NULL)", firstParam ? "WHERE" : "AND");
|
||||
parameters.Add(new SQLiteParameter("channel", channelName));
|
||||
}
|
||||
|
||||
try {
|
||||
return await conn.RunQueryValue<long>(qb.ToString(), [.. parameters]);
|
||||
} catch(SQLiteException ex) {
|
||||
logger.ZLogError($"Error in CountMessages({channelName}, {includeDeleted}): {ex}");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Message>> GetMessages(
|
||||
string? channelName = null,
|
||||
int? take = 20,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue