diff --git a/gaseous-server/Classes/Metadata/Storage.cs b/gaseous-server/Classes/Metadata/Storage.cs index 1f10712..219fdaa 100644 --- a/gaseous-server/Classes/Metadata/Storage.cs +++ b/gaseous-server/Classes/Metadata/Storage.cs @@ -4,6 +4,7 @@ using System.Reflection; using gaseous_tools; using IGDB; using IGDB.Models; +using Microsoft.Extensions.Caching.Memory; namespace gaseous_server.Classes.Metadata { @@ -16,14 +17,32 @@ namespace gaseous_server.Classes.Metadata Expired } + private static Dictionary ObjectCache = new Dictionary(); + public static CacheStatus GetCacheStatus(string Endpoint, string Slug) { - return _GetCacheStatus(Endpoint, "slug", Slug); + CacheClean(); + if (ObjectCache.ContainsKey(Endpoint + Slug)) + { + return CacheStatus.Current; + } + else + { + return _GetCacheStatus(Endpoint, "slug", Slug); + } } public static CacheStatus GetCacheStatus(string Endpoint, long Id) { - return _GetCacheStatus(Endpoint, "id", Id); + CacheClean(); + if (ObjectCache.ContainsKey(Endpoint + Id)) + { + return CacheStatus.Current; + } + else + { + return _GetCacheStatus(Endpoint, "id", Id); + } } public static CacheStatus GetCacheStatus(DataRow Row) @@ -164,6 +183,21 @@ namespace gaseous_server.Classes.Metadata { string Endpoint = EndpointType.GetType().Name; + if (ObjectCache.ContainsKey(Endpoint + SearchValue)) + { + MemoryCacheObject cacheObject = ObjectCache[Endpoint + SearchValue]; + if (cacheObject.ExpiryTime < DateTime.UtcNow) + { + // object has expired, remove it + ObjectCache.Remove(Endpoint + SearchValue); + } + else + { + // object is valid, return it + return (T)cacheObject.Object; + } + } + Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); string sql = "SELECT * FROM " + Endpoint + " WHERE " + SearchField + " = @" + SearchField; @@ -181,7 +215,11 @@ namespace gaseous_server.Classes.Metadata else { DataRow dataRow = dt.Rows[0]; - return BuildCacheObject(EndpointType, dataRow); + object returnObject = BuildCacheObject(EndpointType, dataRow); + ObjectCache.Add(Endpoint + SearchValue, new MemoryCacheObject{ + Object = returnObject + }); + return (T)returnObject; } } @@ -380,6 +418,35 @@ namespace gaseous_server.Classes.Metadata return EndpointType; } + + private static void CacheClean() + { + if (ObjectCache == null) + { + ObjectCache = new Dictionary(); + } + Dictionary workCache = ObjectCache; + foreach (KeyValuePair objectCache in workCache) + { + if (objectCache.Value.ExpiryTime < DateTime.UtcNow) + { + ObjectCache.Remove(objectCache.Key); + } + } + } + + private class MemoryCacheObject + { + public object Object { get; set; } + public DateTime CreationTime { get; } = DateTime.UtcNow; + public DateTime ExpiryTime + { + get + { + return CreationTime.AddMinutes(60); + } + } + } } } diff --git a/gaseous-server/Models/PlatformMapping.cs b/gaseous-server/Models/PlatformMapping.cs index e7fd6ad..c2f5abe 100644 --- a/gaseous-server/Models/PlatformMapping.cs +++ b/gaseous-server/Models/PlatformMapping.cs @@ -15,6 +15,8 @@ namespace gaseous_server.Models { public class PlatformMapping { + private static Dictionary PlatformMapCache = new Dictionary(); + /// /// Updates the platform map from the embedded platform map resource /// @@ -98,7 +100,15 @@ namespace gaseous_server.Models List platformMaps = new List(); foreach (DataRow row in data.Rows) { - platformMaps.Add(BuildPlatformMapItem(row)); + long mapId = (long)row["Id"]; + if (PlatformMapCache.ContainsKey(mapId.ToString())) + { + platformMaps.Add(PlatformMapCache[mapId.ToString()]); + } + else + { + platformMaps.Add(BuildPlatformMapItem(row)); + } } platformMaps.Sort((x, y) => x.IGDBName.CompareTo(y.IGDBName)); @@ -109,23 +119,30 @@ namespace gaseous_server.Models public static PlatformMapItem GetPlatformMap(long Id) { - Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = "SELECT * FROM PlatformMap WHERE Id = @Id"; - Dictionary dbDict = new Dictionary(); - dbDict.Add("Id", Id); - DataTable data = db.ExecuteCMD(sql, dbDict); - - if (data.Rows.Count > 0) + if (PlatformMapCache.ContainsKey(Id.ToString())) { - PlatformMapItem platformMap = BuildPlatformMapItem(data.Rows[0]); - - return platformMap; + return PlatformMapCache[Id.ToString()]; } else { - Exception exception = new Exception("Platform Map Id " + Id + " does not exist."); - Logging.Log(Logging.LogType.Critical, "Platform Map", "Platform Map Id " + Id + " does not exist.", exception); - throw exception; + Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT * FROM PlatformMap WHERE Id = @Id"; + Dictionary dbDict = new Dictionary(); + dbDict.Add("Id", Id); + DataTable data = db.ExecuteCMD(sql, dbDict); + + if (data.Rows.Count > 0) + { + PlatformMapItem platformMap = BuildPlatformMapItem(data.Rows[0]); + + return platformMap; + } + else + { + Exception exception = new Exception("Platform Map Id " + Id + " does not exist."); + Logging.Log(Logging.LogType.Critical, "Platform Map", "Platform Map Id " + Id + " does not exist.", exception); + throw exception; + } } } @@ -218,6 +235,11 @@ namespace gaseous_server.Models db.ExecuteCMD(sql, dbDict); } } + + if (PlatformMapCache.ContainsKey(item.IGDBId.ToString())) + { + PlatformMapCache.Remove(item.IGDBId.ToString()); + } } static PlatformMapItem BuildPlatformMapItem(DataRow row) @@ -321,6 +343,15 @@ namespace gaseous_server.Models }; mapItem.Bios = bioss; + if (PlatformMapCache.ContainsKey(IGDBId.ToString())) + { + PlatformMapCache[IGDBId.ToString()] = mapItem; + } + else + { + PlatformMapCache.Add(IGDBId.ToString(), mapItem); + } + return mapItem; } diff --git a/gaseous-server/Program.cs b/gaseous-server/Program.cs index c26a392..badd79c 100644 --- a/gaseous-server/Program.cs +++ b/gaseous-server/Program.cs @@ -198,9 +198,8 @@ ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem( }) ); ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem( - ProcessQueue.QueueItemType.LibraryScan, 30, new List + ProcessQueue.QueueItemType.LibraryScan, 1440, new List { - ProcessQueue.QueueItemType.TitleIngestor, ProcessQueue.QueueItemType.OrganiseLibrary }) );