static void Main(string[] args) { string configFileName = Directory.GetCurrentDirectory() + @"\Config.xml"; Config config = ApplicationInitialize(configFileName); if (config != null) { try { using (GeoIPDbContext db = new GeoIPDbContext(config.ConnectionString)) { Console.WriteLine("Подключение к базе..."); var dbCreated = db.Database.EnsureCreated(); Console.WriteLine($"Подключение установлено: {db.Database.ProviderName}"); if (CheckUpdates(db, config)) { Console.WriteLine("Обновить сейчас? (y/n)"); int answ = Console.Read(); if (answ == 'y' || answ == 'Y') { DoOperations(db, config); } } } } catch (Exception e) { Console.WriteLine(e.Message); } } else { Console.WriteLine("failed to create application configuration"); } }
//Возвращает сущность последнего установленного обновления. (+) public static UpdateInfo GetLastUpdateInfo(GeoIPDbContext dbContext) { if (dbContext.Updates.Count() > 0) { return(dbContext.Updates.OrderBy(u => u.Id).Last()); } else { return(null); } }
static bool CheckUpdates(GeoIPDbContext dbContext, Config config) { DateTime start = DateTime.Now; Console.WriteLine($"Выполняется проверка обновлений: {start}"); bool checkResult = Updater.CheckUpdate(Updater.GetLastUpdateInfo(dbContext), config.MD5FileUrl, out string message); DateTime finish = DateTime.Now; Console.WriteLine($"Проверка обновлений завершена за {finish - start} с сообщением: {message}"); return(checkResult); }
private const string IPv4_Regex_Pattern = @"((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)"; // Взято осюда: https://habr.com/post/123845/ public LocationController(GeoIPDbContext dbContext) { db = dbContext; }
static void DoOperations(GeoIPDbContext dbContext, Config config) { DateTime start = DateTime.Now; DateTime finish; DateTime startNext; //download updates; string md5FileName, dataFileName, md5Hash; startNext = DateTime.Now; Console.WriteLine($"Загрузка обновлений: {startNext}"); if (Utilites.DownloadFile(config.MD5FileUrl, config.TempFolder, out md5FileName)) { using (StreamReader md5Reader = new StreamReader(md5FileName)) { md5Hash = md5Reader.ReadLine(); } if (Utilites.DownloadFile(config.DataFileUrl, config.TempFolder, md5Hash, out dataFileName, out bool checkRes)) { Console.WriteLine($"Check MD5: {(checkRes ? "OK" : "failed")}"); } else { return; } } else { return; } finish = DateTime.Now; Console.WriteLine($"Загрузка завершена: {finish - startNext}"); //extract updates; startNext = DateTime.Now; Console.WriteLine($"Распаковка обновлений: {startNext}"); string[] extractedFiles = Utilites.ExtractFromZip(dataFileName, config.CashFolder, new string[] { config.Locations_CSV_FileName, config.BlocksIPv4_CSV_FileName }); finish = DateTime.Now; Console.WriteLine($"Распаковка завершена: {finish - startNext}"); //remove temporary files and ordering data; startNext = DateTime.Now; Console.WriteLine($"Удаление временных файлов: {startNext}"); string blocksFileName; string locationsFileName = blocksFileName = string.Empty; for (int i = 0; i < extractedFiles.Length; i++) { if (extractedFiles[i].EndsWith(config.Locations_CSV_FileName)) { locationsFileName = extractedFiles[i]; } else if (extractedFiles[i].EndsWith(config.BlocksIPv4_CSV_FileName)) { blocksFileName = extractedFiles[i]; } } string cashedFilesPath = Path.GetDirectoryName(locationsFileName); File.Move(md5FileName, Path.Combine(cashedFilesPath, Path.GetFileName(md5FileName))); File.Move(dataFileName, Path.Combine(cashedFilesPath, Path.GetFileName(dataFileName))); finish = DateTime.Now; Console.WriteLine($"Удаление завершено: {finish - startNext}"); //install updates; startNext = DateTime.Now; Console.WriteLine($"Установка обновлений: {startNext}"); bool updRes = Updater.DatabaseUpdate(config.ConnectionString, blocksFileName, locationsFileName); if (updRes) { dbContext.Updates.Add(new Database.Models.UpdateInfo { Hash = md5Hash, DateTime = DateTime.Now }); dbContext.SaveChanges(); } finish = DateTime.Now; Console.WriteLine($"{(updRes ? "Установка успешно завершена: " : "Установка завершена с ошибками: ")} " + $"{finish - startNext}"); Console.WriteLine($"Затраченное время: {finish - start}"); }