コード例 #1
0
        static public long ParseEDDBUpdateSystems(string filename, Action <string> logline)
        {
            StreamReader sr = new StreamReader(filename);         // read directly from file..

            if (sr == null)
            {
                return(0);
            }

            string line;

            int updated  = 0;
            int inserted = 0;

            while (!sr.EndOfStream)
            {
                using (SQLExtTransactionLock <SQLiteConnectionSystem> tl = new SQLExtTransactionLock <SQLiteConnectionSystem>())
                {
                    tl.OpenWriter();
                    using (SQLiteConnectionSystem cn = new SQLiteConnectionSystem(mode: SQLLiteExtensions.SQLExtConnection.AccessMode.Writer))  // open the db
                    {
                        DbCommand selectCmd    = null;
                        DbCommand insertCmd    = null;
                        DbCommand updateCmd    = null;
                        DbCommand updateSysCmd = null;

                        using (DbTransaction txn = cn.BeginTransaction())
                        {
                            try
                            {
                                selectCmd = cn.CreateCommand("SELECT EddbId, Population, EddbUpdatedAt FROM EddbSystems WHERE EdsmId = @EdsmId LIMIT 1", txn);   // 1 return matching ID
                                selectCmd.AddParameter("@Edsmid", DbType.Int64);

                                insertCmd = cn.CreateCommand("INSERT INTO EddbSystems (EdsmId, EddbId, Name, Faction, Population, GovernmentId, AllegianceId, State, Security, PrimaryEconomyId, NeedsPermit, EddbUpdatedAt) " +
                                                             "VALUES (@EdsmId, @EddbId, @Name, @Faction, @Population, @GovernmentId, @AllegianceId, @State, @Security, @PrimaryEconomyid, @NeedsPermit, @EddbUpdatedAt)", txn);
                                insertCmd.AddParameter("@EdsmId", DbType.Int64);
                                insertCmd.AddParameter("@EddbId", DbType.Int64);
                                insertCmd.AddParameter("@Name", DbType.String);
                                insertCmd.AddParameter("@Faction", DbType.String);
                                insertCmd.AddParameter("@Population", DbType.Int64);
                                insertCmd.AddParameter("@GovernmentId", DbType.Int64);
                                insertCmd.AddParameter("@AllegianceId", DbType.Int64);
                                insertCmd.AddParameter("@State", DbType.Int64);
                                insertCmd.AddParameter("@Security", DbType.Int64);
                                insertCmd.AddParameter("@PrimaryEconomyId", DbType.Int64);
                                insertCmd.AddParameter("@NeedsPermit", DbType.Int64);
                                insertCmd.AddParameter("@EddbUpdatedAt", DbType.Int64);

                                updateCmd = cn.CreateCommand("UPDATE EddbSystems SET EddbId=@EddbId, Name=@Name, Faction=@Faction, Population=@Population, GovernmentId=@GovernmentId, AllegianceId=@AllegianceId, State=@State, Security=@Security, PrimaryEconomyId=@PrimaryEconomyId, NeedsPermit=@NeedsPermit, EddbUpdatedAt=@EddbUpdatedAt WHERE EdsmId=@EdsmId", txn);
                                updateCmd.AddParameter("@EdsmId", DbType.Int64);
                                updateCmd.AddParameter("@EddbId", DbType.Int64);
                                updateCmd.AddParameter("@Name", DbType.String);
                                updateCmd.AddParameter("@Faction", DbType.String);
                                updateCmd.AddParameter("@Population", DbType.Int64);
                                updateCmd.AddParameter("@GovernmentId", DbType.Int64);
                                updateCmd.AddParameter("@AllegianceId", DbType.Int64);
                                updateCmd.AddParameter("@State", DbType.Int64);
                                updateCmd.AddParameter("@Security", DbType.Int64);
                                updateCmd.AddParameter("@PrimaryEconomyId", DbType.Int64);
                                updateCmd.AddParameter("@NeedsPermit", DbType.Int64);
                                updateCmd.AddParameter("@EddbUpdatedAt", DbType.Int64);

                                updateSysCmd = cn.CreateCommand("UPDATE EdsmSystems SET EddbId=@EddbId WHERE EdsmId=@EdsmId");
                                updateSysCmd.AddParameter("@EdsmId", DbType.Int64);
                                updateSysCmd.AddParameter("@EddbId", DbType.Int64);

                                int c       = 0;
                                int hasinfo = 0;
                                int lasttc  = Environment.TickCount;

                                while (!SQLiteConnectionSystem.IsReadWaiting)
                                {
                                    line = sr.ReadLine();
                                    if (line == null)  // End of stream
                                    {
                                        break;
                                    }

                                    {
                                        JObject jo = JObject.Parse(line);

                                        ISystem system = SystemClassDB.FromEDDB(jo);

                                        if (system.HasEDDBInformation)                                  // screen out for speed any EDDB data with empty interesting fields
                                        {
                                            hasinfo++;

                                            selectCmd.Parameters["@EdsmId"].Value = system.EDSMID;     // EDDB carries EDSM ID, so find entry in dB

                                            //DEBUGif ( c > 30000 )  Console.WriteLine("EDDB ID " + system.id_eddb + " EDSM ID " + system.id_edsm + " " + system.name + " Late info system");

                                            long updated_at = 0;
                                            long population = 0;
                                            long eddbid     = 0;

                                            using (DbDataReader reader1 = selectCmd.ExecuteReader())    // if found (if not, we ignore EDDB system)
                                            {
                                                if (reader1.Read())                                     // its there.. check its got the right stuff in it.
                                                {
                                                    eddbid     = (long)reader1["EddbId"];
                                                    updated_at = (long)reader1["EddbUpdatedAt"];
                                                    population = (long)reader1["Population"];
                                                }
                                            }

                                            updateSysCmd.Parameters["@EdsmId"].Value = system.EDSMID;
                                            updateSysCmd.Parameters["@EddbId"].Value = system.EDDBID;
                                            updateSysCmd.ExecuteNonQuery();

                                            if (eddbid != 0)
                                            {
                                                if (updated_at != system.EDDBUpdatedAt || population != system.Population)
                                                {
                                                    updateCmd.Parameters["@EddbId"].Value           = system.EDDBID;
                                                    updateCmd.Parameters["@Name"].Value             = system.Name;
                                                    updateCmd.Parameters["@Faction"].Value          = system.Faction;
                                                    updateCmd.Parameters["@Population"].Value       = system.Population;
                                                    updateCmd.Parameters["@GovernmentId"].Value     = system.Government;
                                                    updateCmd.Parameters["@AllegianceId"].Value     = system.Allegiance;
                                                    updateCmd.Parameters["@State"].Value            = system.State;
                                                    updateCmd.Parameters["@Security"].Value         = system.Security;
                                                    updateCmd.Parameters["@PrimaryEconomyId"].Value = system.PrimaryEconomy;
                                                    updateCmd.Parameters["@NeedsPermit"].Value      = system.NeedsPermit;
                                                    updateCmd.Parameters["@EddbUpdatedAt"].Value    = system.EDDBUpdatedAt;
                                                    updateCmd.Parameters["@EdsmId"].Value           = system.EDSMID;
                                                    updateCmd.ExecuteNonQuery();
                                                    updated++;
                                                }
                                            }
                                            else
                                            {
                                                insertCmd.Parameters["@EdsmId"].Value           = system.EDSMID;
                                                insertCmd.Parameters["@EddbId"].Value           = system.EDDBID;
                                                insertCmd.Parameters["@Name"].Value             = system.Name;
                                                insertCmd.Parameters["@Faction"].Value          = system.Faction;
                                                insertCmd.Parameters["@Population"].Value       = system.Population;
                                                insertCmd.Parameters["@GovernmentId"].Value     = system.Government;
                                                insertCmd.Parameters["@AllegianceId"].Value     = system.Allegiance;
                                                insertCmd.Parameters["@State"].Value            = system.State;
                                                insertCmd.Parameters["@Security"].Value         = system.Security;
                                                insertCmd.Parameters["@PrimaryEconomyId"].Value = system.PrimaryEconomy;
                                                insertCmd.Parameters["@NeedsPermit"].Value      = system.NeedsPermit;
                                                insertCmd.Parameters["@EddbUpdatedAt"].Value    = system.EDDBUpdatedAt;
                                                insertCmd.ExecuteNonQuery();
                                                inserted++;
                                            }
                                        }
                                        else
                                        {
                                            //Console.WriteLine("EDDB ID " + system.id_eddb + " EDSM ID " + system.id_edsm + " " + system.name + " No info reject");
                                        }

                                        if (++c % 10000 == 0)
                                        {
                                            System.Diagnostics.Trace.WriteLine("EDDB Count " + c + " Delta " + (Environment.TickCount - lasttc) + " info " + hasinfo + " update " + updated + " new " + inserted);
                                            lasttc = Environment.TickCount;
                                        }
                                    }
                                }

                                txn.Commit();
                            }
                            catch
                            {
                                ExtendedControls.MessageBoxTheme.Show("There is a problem using the EDDB systems file." + Environment.NewLine +
                                                                      "Please perform a manual EDDB sync (see Admin menu) next time you run the program ", "EDDB Sync Error");
                                break;
                            }
                            finally
                            {
                                if (selectCmd != null)
                                {
                                    selectCmd.Dispose();
                                }
                                if (updateCmd != null)
                                {
                                    updateCmd.Dispose();
                                }
                                if (insertCmd != null)
                                {
                                    insertCmd.Dispose();
                                }
                            }
                        }
                    }
                }
            }

            return(updated + inserted);
        }