コード例 #1
0
        /// <summary>
        /// Fetches the latest database from MKM, stores it as a CSV file and re-loads the internal structures of this database manager with new data.
        /// Also creates the SQL database and stores it as mkmtool.sqlite file.
        /// </summary>
        /// <returns><c>False</c> in case the update failed either due to bad response from MKM or IO problems.</returns>
        public bool UpdateDatabaseFiles()
        {
            try
            {
                MainView.Instance.LogMainWindow("Updating MKM inventory database...");
                // build inventory
                var doc = MKMInteract.RequestHelper.makeRequest("https://api.cardmarket.com/ws/v2.0/productlist", "GET");

                var node               = doc.GetElementsByTagName("response");
                var data               = Convert.FromBase64String(node.Item(0)["productsfile"].InnerText);
                var aDecompressed      = GzDecompress(data);
                var downloadedProducts = ConvertCSVtoDataTable(aDecompressed);

                // only join the downloaded with the current version, so that we don't overwrite other
                // data we cache into the Inventory (Rarity) that is not present in the productlist
                // the productList is sorted by productid, so just read the last few that we don't have yet
                // this assumes the previous rows never change, which is the case only if there is no error in them...
                for (int i = Inventory.Rows.Count; i < downloadedProducts.Rows.Count; i++)
                {
                    var insertRow = Inventory.NewRow();
                    foreach (DataColumn col2 in downloadedProducts.Columns)
                    {
                        insertRow[col2.ColumnName] = downloadedProducts.Rows[i][col2.ColumnName];
                    }
                    Inventory.Rows.Add(insertRow);
                }
                WriteTableAsCSV(@".\\mkminventory.csv", Inventory);
                Inventory.AcceptChanges();
                buildSinglesDatabase();
                MainView.Instance.LogMainWindow("MKM inventory database updated.");
            }
            catch (Exception eError)
            {
                LogError("downloading MKM inventory", eError.Message, true);
                return(false);
            }
            try
            {
                MainView.Instance.LogMainWindow("Updating MKM expansions database...");

                // build expansions
                var doc  = MKMInteract.RequestHelper.getExpansions("1"); // Only MTG at present
                var node = doc.GetElementsByTagName("expansion");

                using (StreamWriter exp = new StreamWriter(@".\\mkmexpansions.csv"))
                {
                    exp.WriteLine(string.Format("\"{0}\",\"{1}\",\"{2}\",\"{3}\"",
                                                ExpansionsFields.ExpansionID, ExpansionsFields.Abbreviation, ExpansionsFields.Name, ExpansionsFields.ReleaseDate));
                    foreach (XmlNode nExpansion in node)
                    {
                        exp.WriteLine("\"" + nExpansion[ExpansionsFields.ExpansionID].InnerText + "\",\"" // put commas around each, in case wizards ever decide to do set with a comma in the name
                                      + nExpansion[ExpansionsFields.Abbreviation].InnerText + "\",\"" + nExpansion[ExpansionsFields.Name].InnerText + "\",\""
                                      + nExpansion[ExpansionsFields.ReleaseDate].InnerText + "\"");
                    }
                }
                MainView.Instance.LogMainWindow("MKM expansions database updated.");
            }
            catch (Exception eError)
            {
                LogError("downloading MKM expansions", eError.Message, true);
                return(false);
            }
            try
            {
                Expansions = ConvertCSVtoDataTable(@".\\mkmexpansions.csv"); // grab only MTG Singles
            }
            catch (Exception eError)
            {
                LogError("parsing mkm inventory, product list cannot be obtained", eError.Message, true);
                return(false);
            }

#if false // if you want the sql database for some reason, change this to true. MKMTool does not use it and creating it takes unnecessary time
            // Store the database as an SQL database. This is currently not actually used anywhere by MKMTool itself,
            // but it has existed in previous versions, might be used by other software and might have other uses in the future, so for now we keep it.
            // However, if something fails, we continue as if nothing happened.
            SQLiteConnection m_dbConnection;

            var sql2 = CreateTableSql(Inventory, "inventory");

            Console.WriteLine(sql2);

            if (!File.Exists("mkmtool.sqlite"))
            {
                SQLiteConnection.CreateFile("mkmtool.sqlite");

                m_dbConnection = new SQLiteConnection("Data Source=mkmtool.sqlite;Version=3;");
                m_dbConnection.Open();

                var sql = CreateTableSql(Inventory, "inventory");

                var command = new SQLiteCommand(sql, m_dbConnection);

                command.ExecuteNonQuery();

                sql = string.Format("CREATE TABLE expansions ({0}, {1}, {2}, {3})",
                                    ExpansionsFields.ExpansionID, ExpansionsFields.Abbreviation, ExpansionsFields.Name, ExpansionsFields.ReleaseDate);

                command = new SQLiteCommand(sql, m_dbConnection);

                command.ExecuteNonQuery();
            }
            else
            {
                //clean inventory table
                m_dbConnection = new SQLiteConnection("Data Source=mkmtool.sqlite;Version=3;");
                m_dbConnection.Open();

                var sql = "DELETE FROM inventory";

                var command = new SQLiteCommand(sql, m_dbConnection);
                command.ExecuteNonQuery();

                sql = "DELETE FROM expansions";

                command = new SQLiteCommand(sql, m_dbConnection);
                command.ExecuteNonQuery();

                sql = "VACUUM";

                command = new SQLiteCommand(sql, m_dbConnection);
                command.ExecuteNonQuery();
            }

            BulkInsertDataTable("inventory", Inventory, m_dbConnection);

            BulkInsertDataTable("expansions", Expansions, m_dbConnection);

            m_dbConnection.Close();
#endif
            return(true);
        }