Updated DBSyncWatcher and Syncer

Added Locking system, so that we don't try to access the same file with
both read and write functions at the same time causing an locked
exception on the file when watching it.
This commit is contained in:
Mario Steele 2025-07-30 17:03:35 -05:00
parent 8d53ce79f3
commit ddf50a3052
2 changed files with 14 additions and 2 deletions

View file

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Threading;
namespace FreeTubeSyncer.Library;
@ -13,6 +14,8 @@ public class DBSyncWatcher
public delegate void DatabaseChange(string db, string value);
public event DatabaseChange OnDatabaseChange;
public bool Locked = false;
public DBSyncWatcher(string path)
{
_watcher = new FileSystemWatcher(path);
@ -32,6 +35,11 @@ public class DBSyncWatcher
{
if (e.ChangeType != WatcherChangeTypes.Changed) return;
while (Locked)
{
Thread.Sleep(100);
}
var dbName = Path.GetFileName(e.FullPath);
if (!WatchFiles.Keys.Contains(dbName)) return;

View file

@ -28,14 +28,16 @@ public class Syncer<T> : ISyncer where T : class, IDataModel, new()
private string _dbPath;
private string _dbName;
private string _restEndpoint;
private DBSyncWatcher _watcher;
private bool _isDirty = false;
private bool _syncing = false;
public Syncer(DBSyncWatcher watcher, string dbPath, string dbName, string restEndpoint)
{
watcher.WatchFiles[dbName] = typeof(T);
watcher.OnDatabaseChange += HandleDatabaseChange;
_watcher = watcher;
_watcher.WatchFiles[dbName] = typeof(T);
_watcher.OnDatabaseChange += HandleDatabaseChange;
_client = new RestClient(new RestClientOptions("http://192.168.1.30:5050"));
_dbPath = dbPath;
_dbName = dbName;
@ -138,6 +140,7 @@ public class Syncer<T> : ISyncer where T : class, IDataModel, new()
var json = new List<string>();
foreach (var entry in _entries)
json.Add(entry.JsonData());
_watcher.Locked = true;
using (var fh = File.OpenWrite(_dbPath))
{
foreach (var line in json)
@ -145,6 +148,7 @@ public class Syncer<T> : ISyncer where T : class, IDataModel, new()
fh.Flush();
fh.Close();
}
_watcher.Locked = false;
Console.WriteLine($"Updated {_dbPath}.");
_isDirty = false;
_syncing = false;