private static void InsertSet(Set set) { using (SQLiteCommand com = GamesRepository.DatabaseConnection.CreateCommand()) { //Build Query var sb = new StringBuilder(); sb.Append("INSERT OR REPLACE INTO [sets]("); sb.Append("[id],[name],[game_real_id],[game_version],[version],[package]"); sb.Append(") VALUES("); sb.Append( "@id,@name,(SELECT real_id FROM games WHERE id = @game_id LIMIT 1),@game_version,@version,@package"); sb.Append(");\n"); com.CommandText = sb.ToString(); com.Parameters.AddWithValue("@id", set.Id.ToString()); com.Parameters.AddWithValue("@name", set.Name); com.Parameters.AddWithValue("@game_id", set.Game.Id.ToString()); com.Parameters.AddWithValue("@game_version", set.GameVersion.ToString()); com.Parameters.AddWithValue("@version", set.Version.ToString()); com.Parameters.AddWithValue("@package", set.PackageName); com.ExecuteNonQuery(); } if (SimpleDataTableCache.CacheExists()) { SimpleDataTableCache.ClearCache(); } }
public void Apply(GamesRepository repository, bool patchInstalledSets, string patchFolder) { if (!patchInstalledSets && patchFolder == null) { return; } using (Package package = Package.Open(_filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { ReadPackageDescription(package); // Get the list of sets to potentially patch _game = repository.Games.FirstOrDefault(g => g.Id == _gameId); if (_game == null) { return; } List <string> installedSets = _game.Sets.Select(s => s.PackageName).ToList(); List <string> uninstalledSets; if (patchFolder != null) { string[] files = Directory.GetFiles(patchFolder, "*.o8s"); uninstalledSets = files.Except(installedSets).ToList(); if (!patchInstalledSets) { installedSets = files.Intersect(installedSets).ToList(); } } else { uninstalledSets = new List <string>(0); } _current = 0; _max = installedSets.Count + uninstalledSets.Count; OnProgress(); foreach (string set in installedSets) { SafeApply(package, set, true); } foreach (string set in uninstalledSets) { SafeApply(package, set, false); } if (SimpleDataTableCache.CacheExists()) { SimpleDataTableCache.ClearCache(); } } }
public void DeleteSet(Set set) { using (SQLiteCommand com = GamesRepository.DatabaseConnection.CreateCommand()) { com.CommandText = "DELETE FROM [sets] WHERE [id]=@id;"; com.Parameters.AddWithValue("@id", set.Id.ToString()); com.ExecuteNonQuery(); } if (SimpleDataTableCache.CacheExists()) { SimpleDataTableCache.ClearCache(); } }
private static void InsertPack(Pack pack, string xml, Guid setId) { using (SQLiteCommand com = GamesRepository.DatabaseConnection.CreateCommand()) { //Build Query var sb = new StringBuilder(); sb.Append("INSERT OR REPLACE INTO [packs]("); sb.Append("[id],[set_real_id],[name],[xml]"); sb.Append(") VALUES("); sb.Append("@id,(SELECT real_id FROM sets WHERE id = @set_id LIMIT 1),@name,@xml"); sb.Append(");\n"); com.CommandText = sb.ToString(); com.Parameters.AddWithValue("@id", pack.Id.ToString()); com.Parameters.AddWithValue("@set_id", setId.ToString()); com.Parameters.AddWithValue("@name", pack.Name); com.Parameters.AddWithValue("@xml", xml); com.ExecuteNonQuery(); } if (SimpleDataTableCache.CacheExists()) { SimpleDataTableCache.ClearCache(); } }
public void InstallSet(string filename) { SQLiteTransaction trans = GamesRepository.DatabaseConnection.BeginTransaction(); try { using (Package package = Package.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { PackageRelationship defRelationship = package.GetRelationshipsByType("http://schemas.octgn.org/set/definition").First(); PackagePart definition = package.GetPart(defRelationship.TargetUri); var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema, IgnoreWhitespace = true }; using ( Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(typeof(GamesRepository), "CardSet.xsd")) //CardSet.xsd determines the "attributes" of a card (name, guid, alternate, dependent) if (s != null) { using (XmlReader reader = XmlReader.Create(s)) settings.Schemas.Add(null, reader); } // Read the cards using (XmlReader reader = XmlReader.Create(definition.GetStream(), settings)) { reader.ReadToFollowing("set"); // <?xml ... ?> var set = new Set(filename, reader, Repository); if (set.Game != this) { throw new ApplicationException( string.Format("The set '{0}' is not built for the game '{1}'.", set.Name, Name)); } if (set.GameVersion.Major != Version.Major || set.GameVersion.Minor != Version.Minor) { throw new ApplicationException( string.Format( "The set '{0}' is incompatible with the installed game version.\nGame version: \nSet made for version: {1:2}.", set.Name, set.GameVersion)); } InsertSet(set); if (reader.IsStartElement("packaging")) { reader.ReadStartElement(); // <packaging> while (reader.IsStartElement("pack")) { string xml = reader.ReadOuterXml(); var pack = new Pack(set, xml); InsertPack(pack, xml, set.Id); } reader.ReadEndElement(); // </packaging> } if (reader.IsStartElement("markers")) { reader.ReadStartElement(); // <markers> while (reader.IsStartElement("marker")) { reader.MoveToAttribute("name"); string markerName = reader.Value; reader.MoveToAttribute("id"); var markerId = new Guid(reader.Value); Uri markerImageUri = definition.GetRelationship("M" + markerId.ToString("N")).TargetUri; string markerUri = markerImageUri.OriginalString; if (!package.PartExists(markerImageUri)) { throw new ApplicationException( string.Format( "Image for marker '{0}', with URI '{1}' was not found in the package.", markerName, markerUri)); } reader.Read(); // <marker /> InsertMarker(markerId, markerName, markerUri, set.Id); } reader.ReadEndElement(); // </markers> } if (reader.IsStartElement("cards")) { reader.ReadStartElement(); // <cards> while (reader.IsStartElement("card")) { InsertCard(new CardModel(reader, this, set, definition, package)); } // cards are parsed through the CardModel constructor, which are then inserted individually into the database reader.ReadEndElement(); // </cards> } reader.ReadEndElement(); } CopyDecks(package); package.Close(); // Commit the changes trans.Commit(); } } catch (Exception e) { trans.Rollback(); throw e; } if (SimpleDataTableCache.CacheExists()) { SimpleDataTableCache.ClearCache(); } }