79 lines
2.1 KiB
C#
79 lines
2.1 KiB
C#
using ChatRoom.Centralized.Shared.ObjectModels;
|
|
using NLog;
|
|
using System.Collections;
|
|
|
|
namespace ChatRoom.Centralized.Server;
|
|
|
|
public class MessageDatabase : IEnumerable<MessageInfo>
|
|
{
|
|
public string FilePath { get; set; }
|
|
public TimeSpan SaveEvery { get; set; }
|
|
public DateTime LastSave { get; private set; }
|
|
|
|
public List<MessageInfo> Messages { get; set; }
|
|
|
|
private readonly object LOCK = new();
|
|
private readonly Logger logger = ProgramServer.logFactory.GetCurrentClassLogger();
|
|
|
|
public MessageDatabase(string filePath, TimeSpan saveEvery)
|
|
{
|
|
logger.Debug("Starting message database");
|
|
|
|
FilePath = filePath;
|
|
SaveEvery = saveEvery;
|
|
LastSave = DateTime.Now;
|
|
Messages = new();
|
|
|
|
if (File.Exists(filePath))
|
|
{
|
|
// Load file.
|
|
logger.Debug($"Loading message data from {FilePath}");
|
|
FileStream fs = new(FilePath, FileMode.Open);
|
|
BinaryReader reader = new(fs);
|
|
|
|
while (fs.Position < fs.Length - 1)
|
|
Messages.Add(MessageInfo.ReadData(reader));
|
|
|
|
reader.Close();
|
|
}
|
|
|
|
logger.Debug("Done");
|
|
Task.Run(AutosaveLoop);
|
|
}
|
|
|
|
public IEnumerator<MessageInfo> GetEnumerator() => Messages.GetEnumerator();
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
|
|
|
private async Task AutosaveLoop()
|
|
{
|
|
logger.Debug($"Message database autosave is every {SaveEvery}");
|
|
while (true)
|
|
{
|
|
await Task.Delay(SaveEvery);
|
|
SaveData();
|
|
}
|
|
}
|
|
|
|
public void Save() => Task.Run(SaveData);
|
|
|
|
private void SaveData()
|
|
{
|
|
lock (LOCK)
|
|
{
|
|
logger.Debug($"Saving message database");
|
|
FileStream fs = new(FilePath, FileMode.Create);
|
|
BinaryWriter writer = new(fs);
|
|
|
|
for (int i = 0; i < Messages.Count; i++)
|
|
{
|
|
MessageInfo msg = Messages[i];
|
|
msg.WriteData(writer);
|
|
}
|
|
|
|
writer.Close();
|
|
LastSave = DateTime.Now;
|
|
logger.Debug("Done");
|
|
}
|
|
}
|
|
}
|