public static int[] SaveToDatabase(List <DAT_Rom> roms) { // get current rom list List <DAT_Rom> current = DAT_Rom.GetRoms(); int added = 0; int updated = 0; // create temp objects pre-database actions List <DAT_Rom> toAdd = new List <DAT_Rom>(); List <DAT_Rom> toUpdate = new List <DAT_Rom>(); // iterate through each incoming rom foreach (var r in roms) { // attempt rom lookup in current DAT_Rom l = (from a in current where a.md5 == r.md5 && a.pid == r.pid select a).ToList().FirstOrDefault(); if (l == null) { // no entry found toAdd.Add(r); } else { // entry found - update required fields DAT_Rom dr = r; dr.gid = l.gid; dr.rid = l.rid; toUpdate.Add(dr); } } using (var db = new AsniDATAdminDbContext()) { // check for duplicate keys var distinctToAdd = toAdd.GroupBy(x => x.rid).Select(g => g.OrderByDescending(x => x.rid).First()); var distinctToUpdate = toUpdate.GroupBy(x => x.rid).Select(g => g.OrderByDescending(x => x.rid).First()); // update existing entries db.DAT_Rom.UpdateRange(distinctToUpdate); // add new entries db.DAT_Rom.AddRange(distinctToAdd); db.SaveChanges(); added = distinctToAdd.Count(); updated = distinctToUpdate.Count(); return(new int[] { added, updated }); } }
/// <summary> /// return dat_game based on gid /// </summary> /// <returns></returns> public static DAT_Game GetGameByMD5(string md5) { DAT_Rom dr = DAT_Rom.GetRom(md5); if (dr == null) { return(null); } using (var context = new AsniDATAdminDbContext()) { var cData = (from g in context.DAT_Game where g.gid == dr.gid select g).FirstOrDefault(); return(cData); } }
public async void CalculateYearsAndPublishers() { var mySettings = new MetroDialogSettings() { NegativeButtonText = "Cancel Procedure", AnimateShow = false, AnimateHide = false }; int working = 0; string output = "Processing Years & Publishers \n"; var controller = await mw.ShowProgressAsync("Searching Years & Publishers", output, true, settings : mySettings); controller.SetCancelable(true); controller.SetIndeterminate(); await Task.Delay(1000); await Task.Run(() => { // get all games List <DAT_Game> AllGames = DAT_Game.GetGames(); List <DAT_Rom> AllRoms = DAT_Rom.GetRoms(); List <DAT_Game> gWorking = new List <DAT_Game>(); // automated searching first int numGames = AllGames.Where(a => a.year == null || a.publisher == null || a.developer == null).Count(); int skipped = 0; // iterate through each game that does not have a year or publisher set foreach (var game in AllGames.Where(a => a.year == null || a.publisher == null || a.developer == null)) { DAT_Game g = new DAT_Game(); g = game; controller.SetMessage(output + "Number of games to process: " + numGames + "\nFixed: " + gWorking.Count() + "\nSkipped: " + skipped); bool updateNeeded = false; // lookup all roms for this game List <DAT_Rom> search = (from a in AllRoms.Where(x => x.gid == game.gid) select a).ToList(); if (search.Count() > 0) { var yearSearch = (from a in search where a.year != null select a).FirstOrDefault(); var devSearch = (from a in search where a.developer != null select a).FirstOrDefault(); var pubSearch = (from a in search where a.publisher != null select a).FirstOrDefault(); if (yearSearch != null) { g.year = yearSearch.year; updateNeeded = true; } if (pubSearch != null) { g.publisher = pubSearch.publisher; updateNeeded = true; } if (devSearch != null) { g.developer = pubSearch.developer; updateNeeded = true; } } if (updateNeeded == true) { gWorking.Add(g); } else { skipped++; } } // db work DAT_Game.SaveToDatabase(gWorking); working = gWorking.Count(); }); await controller.CloseAsync(); if (controller.IsCanceled) { await mw.ShowMessageAsync("DAT_Game Builder", "Procedure Cancelled"); } else { await mw.ShowMessageAsync("DAT_Game Builder", "Procedure Completed - " + working + " games updated"); } }
public async void ImportCRC32Only(ProviderType providerType, int platformId) { string providerName = "All Platforms"; if (platformId > 0) { providerName = DAT_Provider.GetProviders().Where(a => a.datProviderId == platformId).FirstOrDefault().providerName; } var mySettings = new MetroDialogSettings() { NegativeButtonText = "Cancel Import", AnimateShow = false, AnimateHide = false }; string output = "Scanning local DAT files for CRC32: " + providerName + "\n"; var controller = await mw.ShowProgressAsync("DAT Importer", output, true, settings : mySettings); controller.SetCancelable(true); controller.SetIndeterminate(); await Task.Delay(1000); // start import await Task.Run(() => { // setup working list object List <DAT_Rom> roms = new List <DAT_Rom>(); // populate roms based on provider switch (providerType) { case ProviderType.NoIntro: Platforms.NOINTRO.Models.NoIntroCollection nointro = new Platforms.NOINTRO.Models.NoIntroCollection(platformId); roms = nointro.Data; break; case ProviderType.ToSec: Platforms.TOSEC.Models.ToSecCollection tosec = new Platforms.TOSEC.Models.ToSecCollection(platformId); roms = tosec.Data; break; case ProviderType.ReDump: break; case ProviderType.PsxDataCenter: Platforms.PSXDATACENTER.Models.PsxDataCenterCollection psxdc = new Platforms.PSXDATACENTER.Models.PsxDataCenterCollection(); roms = psxdc.Data; break; case ProviderType.Satakore: Platforms.SATAKORE.Models.SatakoreCollection saturn = new Platforms.SATAKORE.Models.SatakoreCollection(); roms = saturn.Data; break; } controller.SetMessage(output + roms.Count + " Separate ROM files scraped. Starting database import procedure"); int[] result = DAT_Rom.SaveToDatabase(roms); output = "ROMs Added: " + result[0] + "\nROMs Updated/Skipped: " + result[1]; }); await controller.CloseAsync(); if (controller.IsCanceled) { await mw.ShowMessageAsync("DAT Builder", "Import Cancelled"); } else { await mw.ShowMessageAsync("DAT Builder", "Import Completed\n\n" + output); } }
/// <summary> /// Creates / updates the top-level games table (DAT_Game) /// matching rom names and updating the gid in DAT_Rom /// </summary> public async void ProcessTopLevelGames() { var mySettings = new MetroDialogSettings() { NegativeButtonText = "Cancel Procedure", AnimateShow = false, AnimateHide = false }; int gamesCreated = 0; int gamesUpdated = 0; int romsUpdated = 0; string output = "Processing DAT_Game Table \n"; var controller = await mw.ShowProgressAsync("Top-Level Game Builder", output, true, settings : mySettings); controller.SetCancelable(true); controller.SetIndeterminate(); await Task.Delay(1000); await Task.Run(() => { List <DAT_Game> AllGames = DAT_Game.GetGames(); // iterate through each platform (system) and do processing foreach (DAT_System sys in DAT_System.GetSystems()) { int gamesCreatedProc = 0; int gamesUpdatedProc = 0; int romsMatchedProc = 0; // instantiate working lists List <DAT_Game> gWorking = new List <DAT_Game>(); List <DAT_Rom> rWorking = new List <DAT_Rom>(); // get all roms wihtout a gameid set controller.SetMessage(output + "Loading ROMs for " + sys.platformName); List <DAT_Rom> roms = DAT_Rom.GetRomsWithNoGameId(sys.pid); // get all games for this system controller.SetMessage(output + "Loading Games for " + sys.platformName); List <DAT_Game> games = AllGames.Where(a => a.pid == sys.pid).ToList(); // iterate through each ROM foreach (var rom in roms) { controller.SetMessage(output + "Processing ROMs for " + sys.platformName + "\n\n***In-Progress Stats***" + "\nGames Created (processing): " + gamesCreatedProc + "\nGames Updated (processing): " + gamesUpdatedProc + "\nROMs Matched (processing): " + romsMatchedProc + "\n\n***Database Stats***" + "\nGames Created: " + gamesCreated + "\nGames Updated: " + gamesUpdated + "\nROMs Updated: " + romsUpdated ); // check whether game already exists var gCheck = (from a in games where FormatName(a.gameName) == FormatName(rom.name) select a).FirstOrDefault(); if (gCheck == null) { // no game found - create one DAT_Game dg = new DAT_Game(); dg.gameName = rom.name; dg.pid = sys.pid; if (rom.year != null && rom.year.Trim() != "") { dg.year = rom.year; } if (rom.publisher != null && rom.publisher.Trim() != "") { dg.publisher = rom.publisher; } if (rom.developer != null && rom.developer.Trim() != "") { dg.developer = rom.developer; } // get the latest availble gid and set this var newg = AllGames.ToList().OrderByDescending(a => a.gid).FirstOrDefault(); int gid = 1; if (newg != null) { gid = (newg.gid + 1); } // set gid on the game object dg.gid = gid; // add to working game set gWorking.Add(dg); // since we have created a new game - add it to the games list games.Add(dg); AllGames.Add(dg); gamesCreatedProc++; // update the gid in the rom record and add to working set DAT_Rom dr = rom; rom.gid = gid; rWorking.Add(dr); } else { // game has been found - update the game (if neccessary) and update the ROM with the gameId DAT_Game dg = gCheck; bool updateNeeded = false; if (rom.year != null && rom.year.Trim() != "") { dg.year = rom.year; updateNeeded = true; } if (rom.publisher != null && rom.publisher.Trim() != "") { updateNeeded = true; dg.publisher = rom.publisher; } if (rom.developer != null && rom.developer.Trim() != "") { updateNeeded = true; dg.developer = rom.developer; } // update game directly if (updateNeeded == true) { gWorking.Add(dg); gamesUpdatedProc++; } // update the gid in the rom record and add to working set DAT_Rom dr = rom; rom.gid = dg.gid; rWorking.Add(dr); } romsMatchedProc++; } // process working list of games controller.SetMessage(output + "Updating Games in Database for " + sys.platformName + "\n\n***In-Progress Stats***" + "\nGames Created (processing): " + gamesCreatedProc + "\nGames Updated (processing): " + gamesUpdatedProc + "\nROMs Matched (processing): " + romsMatchedProc + "\n\n***Database Stats***" + "\nGames Created: " + gamesCreated + "\nGames Updated: " + gamesUpdated + "\nROMs Updated: " + romsUpdated ); int[] resG = DAT_Game.SaveToDatabase(gWorking); gamesCreated += resG[0]; gamesUpdated += resG[1]; // now process the working list of ROMs controller.SetMessage(output + "Updating ROMs in Database for " + sys.platformName + "\n\n***In-Progress Stats***" + "\nGames Created (processing): " + gamesCreatedProc + "\nGames Updated (processing): " + gamesUpdatedProc + "\nROMs Matched (processing): " + romsMatchedProc + "\n\n***Database Stats***" + "\nGames Created: " + gamesCreated + "\nGames Updated: " + gamesUpdated + "\nROMs Updated: " + romsUpdated ); DAT_Rom.UpdateRoms(rWorking); romsUpdated += romsMatchedProc; } }); await controller.CloseAsync(); if (controller.IsCanceled) { await mw.ShowMessageAsync("DAT_Game Builder", "Procedure Cancelled"); } else { await mw.ShowMessageAsync("DAT_Game Builder", "Procedure Completed\n\nGames Created/Updated: " + (gamesCreated + gamesUpdated) + "\nRoms Updated: " + romsUpdated); } }