Esempio n. 1
0
        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 });
            }
        }
Esempio n. 2
0
        /// <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);
            }
        }
Esempio n. 3
0
        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");
            }
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        /// <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);
            }
        }