using Jackett;
using JacRed.Engine.CORE;
using JacRed.Models;
namespace JacRed.Engine
{
public partial class FileDB : IDisposable
{
#region FileDB
///
/// $"{search_name}:{search_originalname}"
/// Верхнее время изменения
///
public static ConcurrentDictionary masterDb = new ConcurrentDictionary();
static ConcurrentDictionary openWriteTask = new ConcurrentDictionary();
static FileDB()
{
if (File.Exists("cache/jacred/masterDb.bz"))
masterDb = JsonStream.Read>("cache/jacred/masterDb.bz");
if (masterDb == null)
{
if (File.Exists($"cache/jacred/masterDb_{DateTime.Today:dd-MM-yyyy}.bz"))
masterDb = JsonStream.Read>($"cache/jacred/masterDb_{DateTime.Today:dd-MM-yyyy}.bz");
if (masterDb == null && File.Exists($"cache/jacred/masterDb_{DateTime.Today.AddDays(-1):dd-MM-yyyy}.bz"))
masterDb = JsonStream.Read>($"cache/jacred/masterDb_{DateTime.Today.AddDays(-1):dd-MM-yyyy}.bz");
if (masterDb == null)
masterDb = new ConcurrentDictionary();
if (File.Exists("cache/jacred/lastsync.txt"))
File.Delete("cache/jacred/lastsync.txt");
}
}
#endregion
#region pathDb
static string pathDb(string key)
{
string md5key = CrypTo.md5(key);
Directory.CreateDirectory($"cache/jacred/fdb/{md5key.Substring(0, 2)}");
return $"cache/jacred/fdb/{md5key.Substring(0, 2)}/{md5key.Substring(2)}";
}
#endregion
#region Open
public static FileDB Open(string key, bool empty = false)
{
if (empty)
{
openWriteTask.TryRemove(key, out _);
return new FileDB(key, empty: empty);
}
if (openWriteTask.TryGetValue(key, out WriteTaskModel val))
{
val.countread++;
val.openconnection += 1;
val.lastread = DateTime.UtcNow;
return val.db;
}
else
{
var fdb = new FileDB(key);
openWriteTask.TryAdd(key, new WriteTaskModel() { db = fdb, openconnection = 1, countread = 1, lastread = DateTime.UtcNow });
return fdb;
}
}
#endregion
#region SaveChangesToFile
public static void SaveChangesToFile()
{
try
{
JsonStream.Write("cache/jacred/masterDb.bz", masterDb);
if (!File.Exists($"cache/jacred/masterDb_{DateTime.Today:dd-MM-yyyy}.bz"))
File.Copy("cache/jacred/masterDb.bz", $"cache/jacred/masterDb_{DateTime.Today:dd-MM-yyyy}.bz");
if (File.Exists($"cache/jacred/masterDb_{DateTime.Today.AddDays(-2):dd-MM-yyyy}.bz"))
File.Delete($"cache/jacred/masterDb_{DateTime.Today.AddDays(-2):dd-MM-yyyy}.bz");
}
catch { }
}
#endregion
#region Cron
async public static Task Cron()
{
while (true)
{
await Task.Delay(TimeSpan.FromMinutes(10));
if (!ModInit.conf.Red.evercache.enable || 0 >= ModInit.conf.Red.evercache.validHour)
continue;
try
{
var deleteKeys = openWriteTask
.Where(i => DateTime.UtcNow > i.Value.lastread.AddHours(ModInit.conf.Red.evercache.validHour))
.Select(i => i.Key)
.ToArray();
foreach (string key in deleteKeys)
openWriteTask.TryRemove(key, out _);
}
catch { }
}
}
async public static Task CronFast()
{
while (true)
{
await Task.Delay(TimeSpan.FromSeconds(20));
if (!ModInit.conf.Red.evercache.enable || 0 >= ModInit.conf.Red.evercache.validHour)
continue;
try
{
if (openWriteTask.Count > ModInit.conf.Red.evercache.maxOpenWriteTask)
{
var deleteKeys = openWriteTask
.Where(i => DateTime.Now > i.Value.create.AddMinutes(10))
.OrderBy(i => i.Value.countread).ThenBy(i => i.Value.lastread)
.Take(ModInit.conf.Red.evercache.dropCacheTake)
.Select(i => i.Key)
.ToArray();
foreach (string key in deleteKeys)
openWriteTask.TryRemove(key, out _);
}
}
catch { }
}
}
#endregion
}
}