using System; using System.Threading.Tasks; using Alphaleonis.Win32.Filesystem; using Dapper; using Newtonsoft.Json; using Wabbajack.Common; using Wabbajack.Lib.NexusApi; namespace Wabbajack.Server.DataLayer { /// /// SQL routines that read/write cached information from the Nexus /// public partial class SqlService { public async Task DeleteNexusModInfosUpdatedBeforeDate(Game game, long modId, DateTime date) { await using var conn = await Open(); var deleted = await conn.ExecuteScalarAsync( @"DELETE FROM dbo.NexusModInfos WHERE Game = @Game AND ModID = @ModId AND LastChecked < @Date SELECT @@ROWCOUNT AS Deleted", new {Game = game.MetaData().NexusGameId, ModId = modId, @Date = date}); return deleted; } public async Task DeleteNexusModFilesUpdatedBeforeDate(Game game, long modId, DateTime date) { await using var conn = await Open(); var deleted = await conn.ExecuteScalarAsync( @"DELETE FROM dbo.NexusModFiles WHERE Game = @Game AND ModID = @ModId AND LastChecked < @Date SELECT @@ROWCOUNT AS Deleted", new {Game = game.MetaData().NexusGameId, ModId = modId, Date = date}); return deleted; } public async Task GetNexusModInfoString(Game game, long modId) { await using var conn = await Open(); var result = await conn.QueryFirstOrDefaultAsync( "SELECT Data FROM dbo.NexusModInfos WHERE Game = @Game AND @ModId = ModId", new {Game = game.MetaData().NexusGameId, ModId = modId}); return result == null ? null : JsonConvert.DeserializeObject(result); } public async Task AddNexusModInfo(Game game, long modId, DateTime lastCheckedUtc, ModInfo data) { await using var conn = await Open(); await conn.ExecuteAsync( @"MERGE dbo.NexusModInfos AS Target USING (SELECT @Game Game, @ModId ModId, @LastChecked LastChecked, @Data Data) AS Source ON Target.Game = Source.Game AND Target.ModId = Source.ModId WHEN MATCHED THEN UPDATE SET Target.Data = @Data, Target.LastChecked = @LastChecked WHEN NOT MATCHED THEN INSERT (Game, ModId, LastChecked, Data) VALUES (@Game, @ModId, @LastChecked, @Data);", new { Game = game.MetaData().NexusGameId, ModId = modId, LastChecked = lastCheckedUtc, Data = JsonConvert.SerializeObject(data) }); } public async Task AddNexusModFiles(Game game, long modId, DateTime lastCheckedUtc, NexusApiClient.GetModFilesResponse data) { await using var conn = await Open(); await conn.ExecuteAsync( @"MERGE dbo.NexusModFiles AS Target USING (SELECT @Game Game, @ModId ModId, @LastChecked LastChecked, @Data Data) AS Source ON Target.Game = Source.Game AND Target.ModId = Source.ModId WHEN MATCHED THEN UPDATE SET Target.Data = @Data, Target.LastChecked = @LastChecked WHEN NOT MATCHED THEN INSERT (Game, ModId, LastChecked, Data) VALUES (@Game, @ModId, @LastChecked, @Data);", new { Game = game.MetaData().NexusGameId, ModId = modId, LastChecked = lastCheckedUtc, Data = JsonConvert.SerializeObject(data) }); } public async Task AddNexusModFileSlow(Game game, long modId, long fileId, DateTime lastCheckedUtc) { await using var conn = await Open(); await conn.ExecuteAsync( @"MERGE dbo.NexusModFilesSlow AS Target USING (SELECT @GameId GameId, @ModId ModId, @LastChecked LastChecked, @FileId FileId) AS Source ON Target.GameId = Source.GameId AND Target.ModId = Source.ModId AND Target.FileId = Source.FileId WHEN MATCHED THEN UPDATE SET Target.LastChecked = @LastChecked WHEN NOT MATCHED THEN INSERT (GameId, ModId, LastChecked, FileId) VALUES (@GameId, @ModId, @LastChecked, @FileId);", new { GameId = game.MetaData().NexusGameId, ModId = modId, FileId = fileId, LastChecked = lastCheckedUtc, }); } public async Task GetModFiles(Game game, long modId) { await using var conn = await Open(); var result = await conn.QueryFirstOrDefaultAsync( "SELECT Data FROM dbo.NexusModFiles WHERE Game = @Game AND @ModId = ModId", new {Game = game.MetaData().NexusGameId, ModId = modId}); return result == null ? null : JsonConvert.DeserializeObject(result); } } }