public List <StarSystem> GetOrFetchStarSystems(string[] names, bool fetchIfMissing = true, bool refreshIfOutdated = true) { if (!names.Any()) { return(new List <StarSystem>()); } List <StarSystem> systems = GetStarSystems(names, refreshIfOutdated) ?? new List <StarSystem>(); // If a system isn't found after we've read our local database, we need to fetch it. List <string> fetchSystems = new List <string>(); foreach (string name in names) { if (fetchIfMissing && systems.FirstOrDefault(s => s.systemname == name) == null) { fetchSystems.Add(name); } } List <StarSystem> fetchedSystems = dataProviderService.GetSystemsData(fetchSystems.ToArray()); if (fetchedSystems?.Count > 0) { Instance.SaveStarSystems(fetchedSystems); systems.AddRange(fetchedSystems); } return(systems); }
public List <StarSystem> GetOrFetchStarSystems(string[] names, bool fetchIfMissing = true) { if (names.Count() == 0) { return(null); } List <StarSystem> systems = Instance.GetStarSystems(names, fetchIfMissing); List <string> fetchSystems = new List <string>(); // If a system isn't found after we've read our local database, we need to fetch it. foreach (string name in names) { if (fetchIfMissing && systems.FirstOrDefault(s => s.name == name) == null) { fetchSystems.Add(name); } } List <StarSystem> fetchedSystems = DataProviderService.GetSystemsData(fetchSystems.ToArray()); if (fetchedSystems?.Count > 0) { Instance.insertStarSystems(fetchedSystems); systems.AddRange(fetchedSystems); } return(systems); }
public List <StarSystem> GetOrCreateStarSystems(string[] names, bool fetchIfMissing = true, bool refreshIfOutdated = true) { if (names.Count() == 0) { return(null); } // Get (and update if required) systems already in our database List <StarSystem> systems = Instance.GetStarSystems(names, refreshIfOutdated); // If a system isn't found after we've read our local database, we need to fetch it. List <string> fetchSystems = new List <string>(); foreach (string name in names) { if (fetchIfMissing && systems.FirstOrDefault(s => s.name == name) == null) { fetchSystems.Add(name); } } List <StarSystem> fetchedSystems = DataProviderService.GetSystemsData(fetchSystems.ToArray()); if (fetchedSystems?.Count > 0) { Instance.insertStarSystems(fetchedSystems); systems.AddRange(fetchedSystems); } // Create a new system object for each name that isn't in the database and couldn't be fetched from a server foreach (string name in names) { if (systems?.Find(s => s?.name == name) == null) { systems.Add(new StarSystem() { name = name }); } } return(systems); }
public List <StarSystem> GetStarSystems(string[] names, bool refreshIfOutdated = true) { if (!File.Exists(DbFile)) { return(null); } if (names.Count() == 0) { return(null); } List <StarSystem> results = new List <StarSystem>(); List <string> systemsToUpdate = new List <string>(); List <KeyValuePair <string, string> > dataSets = Instance.ReadStarSystems(names); foreach (KeyValuePair <string, string> kv in dataSets) { bool needToUpdate = false; StarSystem result = null; if (kv.Value != null && kv.Value != "") { string name = kv.Key; // Old versions of the data could have a string "No volcanism" for volcanism. If so we remove it string data = kv.Value?.Replace(@"""No volcanism""", "null"); // Determine whether our data is stale (We won't deserialize the the entire system if it's stale) IDictionary <string, object> system = Deserializtion.DeserializeData(data); system.TryGetValue("comment", out object commentVal); system.TryGetValue("lastupdated", out object lastUpdatedVal); system.TryGetValue("systemAddress", out object systemAddressVal); system.TryGetValue("EDSMID", out object edsmIdVal); string comment = (string)commentVal ?? ""; DateTime?lastupdated = (DateTime?)lastUpdatedVal; long? systemAddress = (long?)systemAddressVal; long? edsmId = (long?)edsmIdVal; if (refreshIfOutdated) { if (lastupdated < DateTime.UtcNow.AddHours(-1)) { // Data is stale needToUpdate = true; } else if (lastupdated is null) { // We have no record of ever updating this star system needToUpdate = true; } else if (SCHEMA_VERSION >= 2 && (systemAddress is null || edsmId is null)) { // Obtain data for optimized data searches starting with schema version 2 needToUpdate = true; } } if (needToUpdate) { // We want to update this star system systemsToUpdate.Add(name); } else { // Deserialize the old result result = DeserializeStarSystem(name, data, ref needToUpdate); if (result != null) { results.Add(result); } } } } if (systemsToUpdate.Count > 0) { List <StarSystem> updatedSystems = DataProviderService.GetSystemsData(systemsToUpdate.ToArray()); // If the newly fetched star system is an empty object except (for the object name), reject it List <string> systemsToRevert = new List <string>(); foreach (StarSystem starSystem in updatedSystems) { if (starSystem.systemAddress == null) { systemsToRevert.Add(starSystem.systemname); } } updatedSystems.RemoveAll(s => systemsToRevert.Contains(s.systemname)); // Return old results when new results have been rejected foreach (string systemName in systemsToRevert) { results.Add(GetStarSystem(systemName, false)); } // Synchronize EDSM visits and comments updatedSystems = DataProviderService.syncFromStarMapService(updatedSystems); // Add our updated systems to our results results.AddRange(updatedSystems); // Save changes to our star systems Instance.updateStarSystems(updatedSystems); } foreach (StarSystem starSystem in results) { starSystem.lastupdated = DateTime.UtcNow; } return(results); }