public void GenerateSolverRun()
        {
            var l = new LibraryComponent();
            var lib1 = l.LoadLegacySokoSolve_SSX(l.GetPathData(@".\LegacySSX\Sasquatch.ssx"));
            var lib2 = l.LoadLegacySokoSolve_SSX(l.GetPathData(@".\LegacySSX\SasquatchIII.ssx"));
            var lib3 = l.LoadLegacySokoSolve_SSX(l.GetPathData(@".\LegacySSX\SasquatchIV.ssx"));
            var lib4 = l.LoadLegacySokoSolve_SSX(l.GetPathData(@".\LegacySSX\Thinking Rabbit Inc, Origonal.ssx"));

            var pool = new List<LibraryPuzzle>(lib1);
            pool.AddRange(lib2);
            pool.AddRange(lib3);
            pool.AddRange(lib4);

            var rep = new SokoDBRepository();

            int cc = 0;
            foreach (var puzzle in pool.OrderBy(x=>StaticAnalysis.CalculateRating(x)))
            {
                Console.WriteLine("Puzzle.{0}={1}", cc++, puzzle.Ident);
                var dto = new PuzzleDTO()
                {
                    Name = puzzle.Name,
                    CharMap = puzzle.ToString(),
                    Rating = (int)StaticAnalysis.CalculateRating(puzzle),
                    Hash = puzzle.GetHashCode(),
                    SourceIdent = puzzle.Ident.ToString(),
                    Created = DateTime.Now,
                    Modified = DateTime.Now
                };
                dto = rep.Confirm(dto);
                Assert.That(dto.PuzzleId, Is.Not.EqualTo(0));
            }

            Assert.That(lib1, Is.Not.Null);
            Assert.That(lib1.Count, Is.EqualTo(50));
        }
        public PuzzleDTO Confirm(PuzzleDTO dto)
        {
            var exist = Get(dto.CharMap);
            if (exist != null) return exist;

            Store(dto);
            return dto;
        }
 PuzzleDTO Bind(IDataReader row)
 {
     var item = new PuzzleDTO();
     item.PuzzleId = puzzleBinder.GetInt(row, "PuzzleId");
     item.Name = puzzleBinder.GetString(row, "Name");
     item.Hash = puzzleBinder.GetInt(row, "Hash");
     item.Rating = puzzleBinder.GetInt(row, "Rating");
     item.CharMap = puzzleBinder.GetString(row, "CharMap");
     item.Created = puzzleBinder.GetDateTime(row, "Created");
     item.Modified = puzzleBinder.GetDateTime(row, "Modified");
     item.Author = puzzleBinder.GetString(row, "Author");
     item.Url = puzzleBinder.GetString(row, "Url");
     item.Email = puzzleBinder.GetString(row, "Email");
     item.SourceIdent = puzzleBinder.GetString(row, "SourceIdent");
     return item;
 }
 public Puzzle ToDomain(PuzzleDTO dto)
 {
     return new Puzzle(dto.CharMap)
     {
         Name = dto.Name,
         Tag = dto
     };
 }
 public void Store(PuzzleDTO item)
 {
     item.PuzzleId = DBHelper.ExecuteScalarCommand<int>(GetConnection(),
        @"INSERT INTO [Puzzle]
     ( Name, Hash, Rating, CharMap, Created, Modified, Author, Url, Email, SourceIdent ) VALUES
     (
     {1},   -- Name
     {2},   -- Hash
     {3},   -- Rating
     {4},   -- CharMap
     {5},   -- Created
     {6},   -- Modified
     {7},   -- Author
     {8},   -- Url
     {9},   -- Email
     {10}   -- SourceIdent
     );
     SELECT CAST(@@IDENTITY AS int);",
     item.PuzzleId, item.Name, item.Hash, item.Rating, item.CharMap, item.Created, item.Modified,
     item.Author, item.Url, item.Email, item.SourceIdent
         );
 }
        private void StoreSolution(ISolver solver, PuzzleDTO dto, List<Path> solutions)
        {
            var best = solutions.OrderBy(x => x.Count).First();

            var sol = new SolutionDTO()
            {
                PuzzleREF = dto.PuzzleId,
                CharPath = best.ToString(),
                Created = DateTime.Now,
                Modified = DateTime.Now,
                HostMachine = Environment.MachineName,
                SolverType = solver.GetType().Name,
                SolverVersionMajor = solver.VersionMajor,
                SolverVersionMinor = solver.VersionMinor,
                SolverDescription = solver.VersionDescription,
                TotalNodes = solver.Statistics.First().TotalNodes,
                TotalSecs = (decimal) solver.Statistics.First().DurationInSec,
            };

            var exists = Repository.GetSolutions(dto.PuzzleId);
            if (exists.Any())
            {
                var thisMachine = exists.FindAll(x => x.HostMachine == sol.HostMachine && x.SolverType == sol.SolverType);
                if (thisMachine.Any())
                {
                    var exact = thisMachine.OrderByDescending(x => x.CharPath.Length).First();
                    // Is Better
                    if (exact.TotalSecs > sol.TotalSecs)
                    {
                        // Replace
                        sol.SolutionId = exact.SolutionId;
                        sol.Created = exact.Created;
                        Repository.Update(sol);
                    }
                }
                else
                {
                    Repository.Store(sol);
                }
            }
            else
            {
                Repository.Store(sol);
            }
        }