From 8fbead3c8baf0f3e9bb6faf42574fb4f7b4fb2a3 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 27 Jan 2020 22:01:21 +0000 Subject: [PATCH] --- .../Controllers/ImportAyaNova7Controller.cs | 2 +- .../AyaNova/Controllers/LicenseController.cs | 2 +- server/AyaNova/Controllers/TrialController.cs | 2 +- .../AyaNova/Controllers/WidgetController.cs | 2 +- server/AyaNova/Startup.cs | 2 +- server/AyaNova/biz/ImportAyaNova7Biz.cs | 48 +++++++-------- server/AyaNova/biz/JobsBiz.cs | 6 +- .../generator/CoreJobMetricsSnapshot.cs | 4 +- server/AyaNova/util/DbUtil.cs | 61 ++++++++++--------- server/AyaNova/util/License.cs | 2 +- server/AyaNova/util/Seeder.cs | 2 +- 11 files changed, 67 insertions(+), 66 deletions(-) diff --git a/server/AyaNova/Controllers/ImportAyaNova7Controller.cs b/server/AyaNova/Controllers/ImportAyaNova7Controller.cs index 8c72a929..e86fb6b5 100644 --- a/server/AyaNova/Controllers/ImportAyaNova7Controller.cs +++ b/server/AyaNova/Controllers/ImportAyaNova7Controller.cs @@ -259,7 +259,7 @@ namespace AyaNova.Api.Controllers j.JobType = JobType.ImportV7Data; //j.O wnerId = UserIdFromContext.Id(HttpContext.Items); j.JobInfo = jobInfo.ToString(); - JobsBiz.AddJob(j, ct); + JobsBiz.AddJobAsync(j, ct); return Accepted(new { JobId = j.GId });//202 accepted } diff --git a/server/AyaNova/Controllers/LicenseController.cs b/server/AyaNova/Controllers/LicenseController.cs index 61208146..9dbfa4da 100644 --- a/server/AyaNova/Controllers/LicenseController.cs +++ b/server/AyaNova/Controllers/LicenseController.cs @@ -155,7 +155,7 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); } - if (!AyaNova.Util.DbUtil.DBIsEmpty(ct, log)) + if (!AyaNova.Util.DbUtil.DBIsEmptyAsync(ct, log)) { return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Only an empty AyaNova database can request a trial key. Erase the database to proceed with a new trial.")); } diff --git a/server/AyaNova/Controllers/TrialController.cs b/server/AyaNova/Controllers/TrialController.cs index 110b6e6e..e4d9ff6a 100644 --- a/server/AyaNova/Controllers/TrialController.cs +++ b/server/AyaNova/Controllers/TrialController.cs @@ -101,7 +101,7 @@ namespace AyaNova.Api.Controllers j.JobType = JobType.SeedTestData; j.Exclusive = true;//don't run other jobs, this will erase the db j.JobInfo = o.ToString(); - JobsBiz.AddJob(j, ct); + JobsBiz.AddJobAsync(j, ct); //Log EventLogProcessor.LogEventToDatabaseAsync(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.TrialSeeder, AyaEvent.Created, size), ct); diff --git a/server/AyaNova/Controllers/WidgetController.cs b/server/AyaNova/Controllers/WidgetController.cs index 3bebb228..0282c9d3 100644 --- a/server/AyaNova/Controllers/WidgetController.cs +++ b/server/AyaNova/Controllers/WidgetController.cs @@ -312,7 +312,7 @@ namespace AyaNova.Api.Controllers OpsJob j = new OpsJob(); j.Name = "TestWidgetJob"; j.JobType = JobType.TestWidgetJob; - JobsBiz.AddJob(j, ct); + JobsBiz.AddJobAsync(j, ct); return Accepted(new { JobId = j.GId });//202 accepted } diff --git a/server/AyaNova/Startup.cs b/server/AyaNova/Startup.cs index d28f2224..da7d68ca 100644 --- a/server/AyaNova/Startup.cs +++ b/server/AyaNova/Startup.cs @@ -432,7 +432,7 @@ namespace AyaNova //Check database integrity _newLog.LogDebug("BOOT: db integrity check"); - DbUtil.CheckFingerPrint(AySchema.EXPECTED_COLUMN_COUNT, AySchema.EXPECTED_INDEX_COUNT, _newLog); + DbUtil.CheckFingerPrintAsync(AySchema.EXPECTED_COLUMN_COUNT, AySchema.EXPECTED_INDEX_COUNT, _newLog); //Initialize license AyaNova.Core.License.InitializeAsync(apiServerState, dbContext, _newLog); diff --git a/server/AyaNova/biz/ImportAyaNova7Biz.cs b/server/AyaNova/biz/ImportAyaNova7Biz.cs index 335d607e..c4280d60 100644 --- a/server/AyaNova/biz/ImportAyaNova7Biz.cs +++ b/server/AyaNova/biz/ImportAyaNova7Biz.cs @@ -62,8 +62,8 @@ namespace AyaNova.Biz //basically any error condition during job processing should throw up an exception if it can't be handled List importMap = new List(); - JobsBiz.UpdateJobStatusAsync(job.GId, JobStatus.Running, ct); - JobsBiz.LogJobAsync(job.GId, $"ImportAyaNova7 starting", ct); + await JobsBiz.UpdateJobStatusAsync(job.GId, JobStatus.Running, ct); + await JobsBiz.LogJobAsync(job.GId, $"ImportAyaNova7 starting", ct); //Get the import filename from the jsondata JObject jobData = JObject.Parse(job.JobInfo); @@ -81,8 +81,8 @@ namespace AyaNova.Biz //Erase all the data except for the license, schema and the manager user Microsoft.Extensions.Logging.ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("ImportAyaNova7"); - JobsBiz.LogJobAsync(job.GId, "ImportAyaNova7 - Erasing data from database", ct); - DbUtil.EmptyBizDataFromDatabaseForSeedingOrImporting(log); + await JobsBiz.LogJobAsync(job.GId, "ImportAyaNova7 - Erasing data from database", ct); + DbUtil.EmptyBizDataFromDatabaseForSeedingOrImportingAsync(log); //get the contents of the archive @@ -105,42 +105,42 @@ namespace AyaNova.Biz //IMPORT UNIT MODEL CATEGORIES AS TAGS TagLists.Add("UnitModelCategory", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.UnitModelCategory", job.GId, TagLists["UnitModelCategory"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.UnitModelCategory", job.GId, TagLists["UnitModelCategory"], importFileName, zipEntries); //IMPORT Unit service type AS TAGS TagLists.Add("UnitServiceType", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.UnitServiceType", job.GId, TagLists["UnitServiceType"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.UnitServiceType", job.GId, TagLists["UnitServiceType"], importFileName, zipEntries); //IMPORT Workorder Item Type AS TAGS TagLists.Add("WorkorderItemType", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.WorkorderItemType", job.GId, TagLists["WorkorderItemType"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.WorkorderItemType", job.GId, TagLists["WorkorderItemType"], importFileName, zipEntries); //IMPORT Client group AS TAGS TagLists.Add("ClientGroup", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.ClientGroup", job.GId, TagLists["ClientGroup"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.ClientGroup", job.GId, TagLists["ClientGroup"], importFileName, zipEntries); //IMPORT Workorder category AS TAGS TagLists.Add("WorkorderCategory", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.WorkorderCategory", job.GId, TagLists["WorkorderCategory"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.WorkorderCategory", job.GId, TagLists["WorkorderCategory"], importFileName, zipEntries); //IMPORT Part Category AS TAGS TagLists.Add("PartCategory", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.PartCategory", job.GId, TagLists["PartCategory"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.PartCategory", job.GId, TagLists["PartCategory"], importFileName, zipEntries); //IMPORT Dispatch zones AS TAGS TagLists.Add("DispatchZone", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.DispatchZone", job.GId, TagLists["DispatchZone"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.DispatchZone", job.GId, TagLists["DispatchZone"], importFileName, zipEntries); //IMPORT Scheduleable User Groups AS TAGS TagLists.Add("ScheduleableUserGroup", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.ScheduleableUserGroup", job.GId, TagLists["ScheduleableUserGroup"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.ScheduleableUserGroup", job.GId, TagLists["ScheduleableUserGroup"], importFileName, zipEntries); //Now can set users to correct tag for scheduleable user group // await ImportTagList("GZTW.AyaNova.BLL.ScheduleableUserGroup", "scheduleableusergrouptags", AyaType.Tag, job.GId, importMap, importFileName, zipEntries); //IMPORT REGIONS AS TAGS TagLists.Add("Region", new Dictionary()); - ImportTagList("GZTW.AyaNova.BLL.Region", job.GId, TagLists["Region"], importFileName, zipEntries); + await ImportTagListAsync("GZTW.AyaNova.BLL.Region", job.GId, TagLists["Region"], importFileName, zipEntries); @@ -173,8 +173,8 @@ namespace AyaNova.Biz //---------------- - JobsBiz.LogJobAsync(job.GId, "ImportAyaNova7 finished", ct); - JobsBiz.UpdateJobStatusAsync(job.GId, JobStatus.Completed, ct); + await JobsBiz.LogJobAsync(job.GId, "ImportAyaNova7 finished", ct); + await JobsBiz.UpdateJobStatusAsync(job.GId, JobStatus.Completed, ct); } @@ -204,11 +204,11 @@ namespace AyaNova.Biz { if (importTask != "main") { - JobsBiz.LogJobAsync(jobId, $"Starting import sub-task {importTask} of {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Starting import sub-task {importTask} of {entryStartsWith} objects", ct); } else { - JobsBiz.LogJobAsync(jobId, $"Starting import of {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Starting import of {entryStartsWith} objects", ct); } var jList = FileUtil.ZipGetUtilityArchiveEntriesAsJsonObjects(zipObjectList, importFileName); @@ -235,11 +235,11 @@ namespace AyaNova.Biz { if (importTask != "main") { - JobsBiz.LogJobAsync(jobId, $"Successfully ran import subtask {importTask} on {importCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Successfully ran import subtask {importTask} on {importCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); } else { - JobsBiz.LogJobAsync(jobId, $"Successfully imported {importCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Successfully imported {importCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); } } @@ -247,11 +247,11 @@ namespace AyaNova.Biz { if (importTask != "main") { - JobsBiz.LogJobAsync(jobId, $"Failed to run import subtask {importTask} on {notImportCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Failed to run import subtask {importTask} on {notImportCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); } else { - JobsBiz.LogJobAsync(jobId, $"Did not import {notImportCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Did not import {notImportCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); } } } @@ -260,14 +260,14 @@ namespace AyaNova.Biz //Other job handlers here... - private void ImportTagList(string entryStartsWith, Guid jobId, Dictionary tagDictionary, string importFileName, List zipEntries) + private async Task ImportTagListAsync(string entryStartsWith, Guid jobId, Dictionary tagDictionary, string importFileName, List zipEntries) { var zipObjectList = zipEntries.Where(m => m.StartsWith(entryStartsWith)).ToList(); long importCount = 0; if (zipObjectList.Count > 0) { - JobsBiz.LogJobAsync(jobId, $"Starting import to TAGS of {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Starting import to TAGS of {entryStartsWith} objects", ct); var jList = FileUtil.ZipGetUtilityArchiveEntriesAsJsonObjects(zipObjectList, importFileName); foreach (JObject j in jList) @@ -327,7 +327,7 @@ namespace AyaNova.Biz if (importCount > 0) { - JobsBiz.LogJobAsync(jobId, $"Successfully imported as TAGS {importCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); + await JobsBiz.LogJobAsync(jobId, $"Successfully imported as TAGS {importCount.ToString()} of {zipObjectList.Count.ToString()} {entryStartsWith} objects", ct); } } } diff --git a/server/AyaNova/biz/JobsBiz.cs b/server/AyaNova/biz/JobsBiz.cs index daecfea8..4efadd7d 100644 --- a/server/AyaNova/biz/JobsBiz.cs +++ b/server/AyaNova/biz/JobsBiz.cs @@ -140,11 +140,11 @@ namespace AyaNova.Biz /// /// /// - internal static OpsJob AddJob(OpsJob newJob, AyContext ct) + internal static async Task AddJobAsync(OpsJob newJob, AyContext ct) { //TODO: Does this need to create an event so we know which user created the job? - ct.OpsJob.Add(newJob); - ct.SaveChanges(); + await ct.OpsJob.AddAsync(newJob); + await ct.SaveChangesAsync(); return newJob; } diff --git a/server/AyaNova/generator/CoreJobMetricsSnapshot.cs b/server/AyaNova/generator/CoreJobMetricsSnapshot.cs index 322a4149..3fa6c283 100644 --- a/server/AyaNova/generator/CoreJobMetricsSnapshot.cs +++ b/server/AyaNova/generator/CoreJobMetricsSnapshot.cs @@ -64,7 +64,7 @@ namespace AyaNova.Biz //Get a count of important tables in db - List allTableNames = DbUtil.GetAllTablenames(); + List allTableNames = DbUtil.GetAllTablenamesAsync(); //Skip some tables as they are internal and / or only ever have one record List skipTableNames = new List(); @@ -76,7 +76,7 @@ namespace AyaNova.Biz if (!skipTableNames.Contains(table)) { var tags = new MetricTags("TableTagKey", table); - metrics.Measure.Gauge.SetValue(MetricsRegistry.DBRecordsGauge, tags, DbUtil.CountOfRecords(table)); + metrics.Measure.Gauge.SetValue(MetricsRegistry.DBRecordsGauge, tags, DbUtil.CountOfRecordsAsync(table)); } } } diff --git a/server/AyaNova/util/DbUtil.cs b/server/AyaNova/util/DbUtil.cs index cbc07332..6cd04ac8 100644 --- a/server/AyaNova/util/DbUtil.cs +++ b/server/AyaNova/util/DbUtil.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging; using AyaNova.Models; using System.Linq; using System.Collections.Generic; +using System.Threading.Tasks; namespace AyaNova.Util @@ -251,7 +252,7 @@ namespace AyaNova.Util // Erase all user entered data from the db // This is called by seeder for trial seeding purposes // - internal static void EmptyBizDataFromDatabaseForSeedingOrImporting(ILogger _log) + internal static async Task EmptyBizDataFromDatabaseForSeedingOrImportingAsync(ILogger _log) { @@ -265,14 +266,14 @@ namespace AyaNova.Util using (var conn = new Npgsql.NpgsqlConnection(_dbConnectionString)) { - conn.Open(); + await conn.OpenAsync(); //Delete from user options table first using (var cmd = new Npgsql.NpgsqlCommand()) { cmd.Connection = conn; cmd.CommandText = "delete from \"auseroptions\" where UserId <> 1;"; - cmd.ExecuteNonQuery(); + await cmd.ExecuteNonQueryAsync(); } //Delete from users table @@ -280,20 +281,20 @@ namespace AyaNova.Util { cmd.Connection = conn; cmd.CommandText = "delete from \"auser\" where id <> 1;"; - cmd.ExecuteNonQuery(); + await cmd.ExecuteNonQueryAsync(); } //REMOVE ALL DATA with few exceptions of manager user, license, schema tables //and job logs because this is called by job code - EraseTable("afileattachment", conn); - EraseTable("awidget", conn); - EraseTable("aevent", conn); - EraseTable("adatalistfilter", conn); - EraseTable("adatalisttemplate", conn); - EraseTable("aformcustom", conn); - EraseTable("asearchkey", conn); - EraseTable("asearchdictionary", conn); - EraseTable("atag", conn); + EraseTableAsync("afileattachment", conn); + EraseTableAsync("awidget", conn); + EraseTableAsync("aevent", conn); + EraseTableAsync("adatalistfilter", conn); + EraseTableAsync("adatalisttemplate", conn); + EraseTableAsync("aformcustom", conn); + EraseTableAsync("asearchkey", conn); + EraseTableAsync("asearchdictionary", conn); + EraseTableAsync("atag", conn); conn.Close(); } @@ -309,13 +310,13 @@ namespace AyaNova.Util /////////////////////////////////////////// // Erase all data from the table specified // - private static void EraseTable(string sTable, Npgsql.NpgsqlConnection conn) + private static async Task EraseTableAsync(string sTable, Npgsql.NpgsqlConnection conn) { using (var cmd = new Npgsql.NpgsqlCommand()) { cmd.Connection = conn; cmd.CommandText = "TRUNCATE \"" + sTable + "\" RESTART IDENTITY CASCADE;"; - cmd.ExecuteNonQuery(); + await cmd.ExecuteNonQueryAsync(); } } @@ -324,7 +325,7 @@ namespace AyaNova.Util // Check if DB is empty // CALLED BY LICENSE CONTROLLER AND LICENSE.CS FOR TRIAL Request check // Also called by Import - internal static bool DBIsEmpty(AyContext ctx, ILogger _log) + internal static bool DBIsEmpty(AyContext ct, ILogger _log) { //TODO: This needs to be way more thorough, only the main tables though, no need to get crazy with it //just stuff that would be shitty to have to re-enter @@ -332,7 +333,7 @@ namespace AyaNova.Util _log.LogDebug("DB empty check"); //An empty db contains only one User - if (ctx.User.Count() > 1) return false; + if (ct.User.Count() > 1) return false; //No clients //if(ctx.Client.Count()>0) return false; @@ -354,7 +355,7 @@ namespace AyaNova.Util /////////////////////////////////////////// // Ensure the db is not modified // - internal static void CheckFingerPrint(long ExpectedColumns, long ExpectedIndexes, ILogger _log) + internal static async Task CheckFingerPrintAsync(long ExpectedColumns, long ExpectedIndexes, ILogger _log) { _log.LogDebug("Checking DB integrity"); @@ -363,19 +364,19 @@ namespace AyaNova.Util using (var conn = new Npgsql.NpgsqlConnection(_dbConnectionString)) { - conn.Open(); + await conn.OpenAsync(); using (var command = conn.CreateCommand()) { //Count all columns in all our tables command.CommandText = "SELECT count(*) FROM information_schema.columns where table_schema='public'"; - using (var result = command.ExecuteReader()) + using (var result = await command.ExecuteReaderAsync()) { if (result.HasRows) { //check the values - result.Read(); + await result.ReadAsync(); actualColumns = result.GetInt64(0); } else @@ -393,12 +394,12 @@ namespace AyaNova.Util //Count all indexes in all our tables command.CommandText = "select Count(*) from pg_indexes where schemaname='public'"; - using (var result = command.ExecuteReader()) + using (var result = await command.ExecuteReaderAsync()) { if (result.HasRows) { //check the values - result.Read(); + await result.ReadAsync(); actualIndexes = result.GetInt64(0); } else @@ -409,7 +410,7 @@ namespace AyaNova.Util } } } - conn.Close(); + await conn.CloseAsync(); if (ExpectedColumns != actualColumns || ExpectedIndexes != actualIndexes) { @@ -426,27 +427,27 @@ namespace AyaNova.Util // Used for metrics // /// - internal static long CountOfRecords(string TableName) + internal static async Task CountOfRecordsAsync(string TableName) { long ret = 0; using (var conn = new Npgsql.NpgsqlConnection(_dbConnectionString)) { - conn.Open(); + await conn.OpenAsync(); using (var command = conn.CreateCommand()) { command.CommandText = $"SELECT count(*) FROM {TableName}"; - using (var result = command.ExecuteReader()) + using (var result = await command.ExecuteReaderAsync()) { if (result.HasRows) { - result.Read(); + await result.ReadAsync(); ret = result.GetInt64(0); } } } - conn.Close(); + await conn.CloseAsync(); } return ret; } @@ -456,7 +457,7 @@ namespace AyaNova.Util // Returns all table names that are ours in current schema // /// - internal static List GetAllTablenames() + internal static async Task> GetAllTablenamesAsync() { List ret = new List(); diff --git a/server/AyaNova/util/License.cs b/server/AyaNova/util/License.cs index 3d8f0286..ead72903 100644 --- a/server/AyaNova/util/License.cs +++ b/server/AyaNova/util/License.cs @@ -522,7 +522,7 @@ namespace AyaNova.Core } //Can't install a trial into a non-empty db - if (ParsedNewKey.TrialLicense && !DbUtil.DBIsEmpty(ct, log)) + if (ParsedNewKey.TrialLicense && !DbUtil.DBIsEmptyAsync(ct, log)) { throw new ApplicationException("E1020 - Can't install a trial key into a non empty AyaNova database. Erase the database first."); } diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 8187c220..f436596a 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -68,7 +68,7 @@ namespace AyaNova.Util apiServerState.SetOpsOnly("Seeding database"); //Erase all the data except for the license, schema and the manager user - DbUtil.EmptyBizDataFromDatabaseForSeedingOrImporting(log); + DbUtil.EmptyBizDataFromDatabaseForSeedingOrImportingAsync(log); //Set the time zone of the manager account