@@ -47,7 +47,8 @@ public class MessageStoreTest {
|
|||||||
store.UpsertMessage(input);
|
store.UpsertMessage(input);
|
||||||
|
|
||||||
// Read the message back.
|
// Read the message back.
|
||||||
var messages = store.GetMostRecentMessages().ToList();
|
using var messageEnumerator = store.GetMostRecentMessages();
|
||||||
|
var messages = messageEnumerator.ToList();
|
||||||
Assert.AreEqual(1, messages.Count);
|
Assert.AreEqual(1, messages.Count);
|
||||||
AssertMessagesEqual(input, messages.First());
|
AssertMessagesEqual(input, messages.First());
|
||||||
}
|
}
|
||||||
@@ -80,7 +81,8 @@ public class MessageStoreTest {
|
|||||||
// Query the most recent 5 messages. Should return the 4 newest messages
|
// Query the most recent 5 messages. Should return the 4 newest messages
|
||||||
// from the list, as well as the different receiver message because we
|
// from the list, as well as the different receiver message because we
|
||||||
// aren't filtering.
|
// aren't filtering.
|
||||||
var outputMessages = store.GetMostRecentMessages(count: 5).ToList();
|
using var unfilteredMessageEnumerator = store.GetMostRecentMessages(count: 5);
|
||||||
|
var outputMessages = unfilteredMessageEnumerator.ToList();
|
||||||
var gotIds = outputMessages.Select(m => m.Id).ToList();
|
var gotIds = outputMessages.Select(m => m.Id).ToList();
|
||||||
TestContext.WriteLine($"Query 1 got IDs: {string.Join(", ", gotIds)}");
|
TestContext.WriteLine($"Query 1 got IDs: {string.Join(", ", gotIds)}");
|
||||||
AssertGuidsEqual(new List<Guid> {
|
AssertGuidsEqual(new List<Guid> {
|
||||||
@@ -92,7 +94,8 @@ public class MessageStoreTest {
|
|||||||
}, gotIds);
|
}, gotIds);
|
||||||
|
|
||||||
// Query the most recent 5 messages but filter by receiver ID.
|
// Query the most recent 5 messages but filter by receiver ID.
|
||||||
outputMessages = store.GetMostRecentMessages(receiver: receiver, count: 5).ToList();
|
using var filteredByReceiverMessageEnumerator = store.GetMostRecentMessages(receiver: receiver, count: 5);
|
||||||
|
outputMessages = filteredByReceiverMessageEnumerator.ToList();
|
||||||
gotIds = outputMessages.Select(m => m.Id).ToList();
|
gotIds = outputMessages.Select(m => m.Id).ToList();
|
||||||
TestContext.WriteLine($"Query 2 got IDs: {string.Join(", ", gotIds)}");
|
TestContext.WriteLine($"Query 2 got IDs: {string.Join(", ", gotIds)}");
|
||||||
AssertGuidsEqual(new List<Guid> {
|
AssertGuidsEqual(new List<Guid> {
|
||||||
@@ -104,7 +107,8 @@ public class MessageStoreTest {
|
|||||||
}, gotIds);
|
}, gotIds);
|
||||||
|
|
||||||
// Query the most recent 5 messages but only since a specific date.
|
// Query the most recent 5 messages but only since a specific date.
|
||||||
outputMessages = store.GetMostRecentMessages(receiver, since: messages[1].Date, count: 5).ToList();
|
using var filteredByReceiverAndDateMessageEnumerator = store.GetMostRecentMessages(receiver, since: messages[1].Date, count: 5);
|
||||||
|
outputMessages = filteredByReceiverAndDateMessageEnumerator.ToList();
|
||||||
gotIds = outputMessages.Select(m => m.Id).ToList();
|
gotIds = outputMessages.Select(m => m.Id).ToList();
|
||||||
TestContext.WriteLine($"Query 3 got IDs: {string.Join(", ", gotIds)}");
|
TestContext.WriteLine($"Query 3 got IDs: {string.Join(", ", gotIds)}");
|
||||||
AssertGuidsEqual(new List<Guid> {
|
AssertGuidsEqual(new List<Guid> {
|
||||||
@@ -132,7 +136,8 @@ public class MessageStoreTest {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
using var store = new MessageStore(dbPath);
|
using var store = new MessageStore(dbPath);
|
||||||
var output = store.GetMostRecentMessages().ToList();
|
using var existingMessageEnumerator = store.GetMostRecentMessages();
|
||||||
|
var output = existingMessageEnumerator.ToList();
|
||||||
Assert.AreEqual(1, output.Count);
|
Assert.AreEqual(1, output.Count);
|
||||||
AssertMessagesEqual(input, output[0]);
|
AssertMessagesEqual(input, output[0]);
|
||||||
}
|
}
|
||||||
@@ -152,7 +157,8 @@ public class MessageStoreTest {
|
|||||||
store.UpsertMessage(message);
|
store.UpsertMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
var messages = store.GetMostRecentMessages(count: count).ToList();
|
using var messageEnumerator = store.GetMostRecentMessages(count: count);
|
||||||
|
var messages = messageEnumerator.ToList();
|
||||||
Assert.AreEqual(count, messages.Count);
|
Assert.AreEqual(count, messages.Count);
|
||||||
foreach (var message in messages) {
|
foreach (var message in messages) {
|
||||||
// Load the message because they are lazily parsed.
|
// Load the message because they are lazily parsed.
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ internal class MessageManager : IAsyncDisposable
|
|||||||
if (!Plugin.Config.FilterIncludePreviousSessions)
|
if (!Plugin.Config.FilterIncludePreviousSessions)
|
||||||
since = Plugin.GameStarted;
|
since = Plugin.GameStarted;
|
||||||
|
|
||||||
var messages = Store.GetMostRecentMessages(CurrentContentId, since);
|
using var messages = Store.GetMostRecentMessages(CurrentContentId, since);
|
||||||
|
|
||||||
// We store the pending messages to be added to the chat log in a
|
// We store the pending messages to be added to the chat log in a
|
||||||
// temporary list, and apply them all at once after filtering.
|
// temporary list, and apply them all at once after filtering.
|
||||||
|
|||||||
+16
-7
@@ -160,7 +160,7 @@ internal class MessageStore : IDisposable
|
|||||||
private void Migrate()
|
private void Migrate()
|
||||||
{
|
{
|
||||||
// Get current user_version.
|
// Get current user_version.
|
||||||
var cmd = Connection.CreateCommand();
|
using var cmd = Connection.CreateCommand();
|
||||||
cmd.CommandText = "PRAGMA user_version;";
|
cmd.CommandText = "PRAGMA user_version;";
|
||||||
var userVersion = Convert.ToInt32(cmd.ExecuteScalar());
|
var userVersion = Convert.ToInt32(cmd.ExecuteScalar());
|
||||||
|
|
||||||
@@ -229,7 +229,7 @@ internal class MessageStore : IDisposable
|
|||||||
|
|
||||||
private void SetMigrationVersion(int version)
|
private void SetMigrationVersion(int version)
|
||||||
{
|
{
|
||||||
var cmd = Connection.CreateCommand();
|
using var cmd = Connection.CreateCommand();
|
||||||
// Parameters aren't supported for PRAGMA queries, and you can't set the
|
// Parameters aren't supported for PRAGMA queries, and you can't set the
|
||||||
// version with a pragma_ function.
|
// version with a pragma_ function.
|
||||||
cmd.CommandText = $"PRAGMA user_version = {version};";
|
cmd.CommandText = $"PRAGMA user_version = {version};";
|
||||||
@@ -257,14 +257,14 @@ internal class MessageStore : IDisposable
|
|||||||
|
|
||||||
internal int MessageCount()
|
internal int MessageCount()
|
||||||
{
|
{
|
||||||
var cmd = Connection.CreateCommand();
|
using var cmd = Connection.CreateCommand();
|
||||||
cmd.CommandText = "SELECT COUNT(*) FROM messages;";
|
cmd.CommandText = "SELECT COUNT(*) FROM messages;";
|
||||||
return Convert.ToInt32(cmd.ExecuteScalar());
|
return Convert.ToInt32(cmd.ExecuteScalar());
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void UpsertMessage(Message message)
|
internal void UpsertMessage(Message message)
|
||||||
{
|
{
|
||||||
var cmd = Connection.CreateCommand();
|
using var cmd = Connection.CreateCommand();
|
||||||
cmd.CommandText = @"
|
cmd.CommandText = @"
|
||||||
INSERT INTO messages (
|
INSERT INTO messages (
|
||||||
Id,
|
Id,
|
||||||
@@ -381,7 +381,7 @@ internal class MessageStore : IDisposable
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal void DeleteMessage(Guid id)
|
internal void DeleteMessage(Guid id)
|
||||||
{
|
{
|
||||||
var cmd = Connection.CreateCommand();
|
using var cmd = Connection.CreateCommand();
|
||||||
cmd.CommandText = "UPDATE messages SET Deleted = true WHERE Id = $Id;";
|
cmd.CommandText = "UPDATE messages SET Deleted = true WHERE Id = $Id;";
|
||||||
cmd.Parameters.AddWithValue("$Id", id);
|
cmd.Parameters.AddWithValue("$Id", id);
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
@@ -398,7 +398,7 @@ internal class MessageStore : IDisposable
|
|||||||
|
|
||||||
var whereClause = "WHERE " + string.Join(" AND ", whereClauses);
|
var whereClause = "WHERE " + string.Join(" AND ", whereClauses);
|
||||||
|
|
||||||
var cmd = Connection.CreateCommand();
|
using var cmd = Connection.CreateCommand();
|
||||||
// Select last N messages by date DESC, but reverse the order to get
|
// Select last N messages by date DESC, but reverse the order to get
|
||||||
// them in ascending order.
|
// them in ascending order.
|
||||||
cmd.CommandText = @"
|
cmd.CommandText = @"
|
||||||
@@ -461,7 +461,7 @@ internal class MessageStore : IDisposable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MessageEnumerator(DbDataReader reader) : IEnumerable<Message>
|
internal class MessageEnumerator(DbDataReader reader) : IEnumerable<Message>, IDisposable, IAsyncDisposable
|
||||||
{
|
{
|
||||||
private const int MaxErrorLogs = 10;
|
private const int MaxErrorLogs = 10;
|
||||||
|
|
||||||
@@ -520,4 +520,13 @@ internal class MessageEnumerator(DbDataReader reader) : IEnumerable<Message>
|
|||||||
{
|
{
|
||||||
return FailedIds;
|
return FailedIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
reader.Dispose();
|
||||||
|
}
|
||||||
|
public async ValueTask DisposeAsync()
|
||||||
|
{
|
||||||
|
await reader.DisposeAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,7 +134,9 @@ public class DbViewer : Window
|
|||||||
// We only want to fetch count if this is the first page
|
// We only want to fetch count if this is the first page
|
||||||
if (CurrentPage == 1)
|
if (CurrentPage == 1)
|
||||||
Count = Plugin.MessageManager.Store.CountDateRange(AfterDate, BeforeDate, channels, character);
|
Count = Plugin.MessageManager.Store.CountDateRange(AfterDate, BeforeDate, channels, character);
|
||||||
Messages = Plugin.MessageManager.Store.GetDateRange(AfterDate, BeforeDate, channels, character, CurrentPage - 1).ToArray();
|
|
||||||
|
using var dateRangeMessageEnumerator = Plugin.MessageManager.Store.GetDateRange(AfterDate, BeforeDate, channels, character, CurrentPage - 1);
|
||||||
|
Messages = dateRangeMessageEnumerator.ToArray();
|
||||||
|
|
||||||
Filter();
|
Filter();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user