From d414910e967ee0b36638ca983f828ddc02c9ee51 Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Sun, 26 Oct 2025 14:51:00 +0000 Subject: [PATCH] 3.0.1.8 Control repository status check on update --- .../Web/App/SbmHousekeepingService.cs | 74 ++++++ SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs | 18 +- SaBusMgrStandardBase/Base/App/Sbm-Version.cs | 38 +-- SaBusMgrStandardBase/Base/App/SbmAppConfig.cs | 3 +- .../Base/App/SbmApplication.cs | 32 +-- SaBusMgrStandardBase/Base/App/SbmGlobals.cs | 20 +- .../Base/App/SbmInstanceDataCache.cs | 19 +- SaBusMgrStandardBase/Base/App/SbmInternals.cs | 234 +++++++++--------- SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs | 6 +- .../Dbas/App/SbmInstanceDataCache_Dbas.cs | 25 +- .../Dbas/Consoles/SbmDatabaseConsole.cs | 6 +- .../Dbas/Consoles/SbmDiaryConsole_Dbas.cs | 4 +- .../Dbas/Consoles/SbmItemDataConsole_Dbas.cs | 4 +- .../Dbas/Consoles/SbmItemDocConsole_Dbas.cs | 4 +- .../Dbas/Mgr/SbmAccountMgr_Dbas.cs | 8 +- .../Dbas/Mgr/SbmAssetMgr_Dbas.cs | 8 +- .../Dbas/Mgr/SbmCommodityMgr_Dbas.cs | 9 +- .../Dbas/Mgr/SbmDataItemMgr_Dbas.cs | 8 +- .../Dbas/Mgr/SbmPriceMgr_Dbas.cs | 8 +- .../Dbas/Mgr/SbmProcessMgr_Dbas.cs | 8 +- .../Dbas/Mgr/SbmStockMgr_Dbas.cs | 8 +- .../Dbas/Mgr/SbmTransactionMgr_Dbas.cs | 8 +- .../Web/Control/App/SbmApplication_Tester.cs | 7 +- .../App/SbmApplication_SessionData_Tester.cs | 5 +- .../Control/App/SbmApplication_Control.cs | 112 +++++++-- .../Control/App/SbmStartup_Control.cs | 13 +- .../SbmCoreInstanceConsole_Control.cs | 18 +- .../Instance/RepositoryController-Ajax.cs | 12 +- .../Instance/RepositoryInitController-Ajax.cs | 12 +- .../Views/Account/UserAccount/Index.cshtml | 11 +- .../Views/Instance/Owner/Index.cshtml | 12 +- .../Repository/Database/Schema.cshtml | 10 +- .../Repository/Database/Tables.cshtml | 10 +- .../Views/Instance/Repository/Index.cshtml | 12 +- .../Views/Param/Param/Index.cshtml | 12 +- .../Views/Shared/_Layout.cshtml | 1 + .../Views/System/Logs.cshtml | 35 ++- .../wwwroot/css/sbc-data.css | 2 +- .../wwwroot/css/sbc-form.css | 4 +- .../wwwroot/css/sbc-main.css | 29 +++ .../wwwroot/js/sbc-ins-rep-init.js | 2 +- .../wwwroot/js/sbc-ins-rep.js | 40 ++- .../wwwroot/js/sbc-main.js | 23 +- .../wwwroot/js/sbc-sys-logs.js | 4 + .../Portal/App/SbmApplication_Portal.cs | 177 +++++++++---- .../Portal/App/SbmStartup_Portal.cs | 14 +- .../Security/SecurityController-Ajax.cs | 2 +- 47 files changed, 727 insertions(+), 404 deletions(-) create mode 100644 SaBusMgrCoreWeb/Web/App/SbmHousekeepingService.cs diff --git a/SaBusMgrCoreWeb/Web/App/SbmHousekeepingService.cs b/SaBusMgrCoreWeb/Web/App/SbmHousekeepingService.cs new file mode 100644 index 0000000..40cf34b --- /dev/null +++ b/SaBusMgrCoreWeb/Web/App/SbmHousekeepingService.cs @@ -0,0 +1,74 @@ +using Microsoft.Extensions.Hosting; +using Sarand.Net.Standard.Base.App; +using Sarand.Net.Standard.Base.Utils; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Sarand.BusinessMgr.Net.Core.Web.App +{ + internal class SbmHousekeepingService : BackgroundService + { + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + Task housekeepingTask = null; + CancellationTokenSource cts = null; + int housekeepingInProgressIterationNum = 0; + int housekeepingInProgressIterationMax = 3; + + while (!stoppingToken.IsCancellationRequested) + { + // Wait for a period before invoking housekeeping. + await Task.Delay(TimeSpan.FromHours(1), stoppingToken); + + try + { + // Check if previous housekeeping is still in progress. + if (housekeepingTask != null && !housekeepingTask.IsCompleted) + { + ++housekeepingInProgressIterationNum; + + if (housekeepingInProgressIterationNum >= housekeepingInProgressIterationMax) + { + SaLogger.Warn($"{SysUtil.Fn} Previous housekeeping processing still in progress after {housekeepingInProgressIterationNum} iterations - cancelling and starting new processing."); + cts.Cancel(); + housekeepingInProgressIterationNum = 0; + } + else + { + // Previous housekeeping still in progress. + SaLogger.Warn($"{SysUtil.Fn} Previous housekeeping processing still in progress. Counter: {housekeepingInProgressIterationNum}."); + continue; + } + } + + housekeepingTask = Task.Run(() => + { + try + { + cts = CancellationTokenSource.CreateLinkedTokenSource(stoppingToken); + DoHousekeeping(cts.Token); + } + catch (Exception exc) + { + SaLogger.Error($"{SysUtil.Fn} {exc.GetType().Name} performing application housekeeping.\n{ExceptionUtil.GetMessage(exc)}"); + } + }, stoppingToken); + + } + catch (Exception exc) + { + SaLogger.Error($"{SysUtil.Fn} {exc.GetType().Name} invoking application housekeeping.\n{ExceptionUtil.GetMessage(exc)}"); + } + finally + { + } + } + } + + private void DoHousekeeping(CancellationToken ct) + { + SbmGlobals_Web.Application.DoHousekeeping(ct); + } + } +} diff --git a/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs b/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs index 4681921..33ece4f 100644 --- a/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs +++ b/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs @@ -10,16 +10,16 @@ using Microsoft.Net.Http.Headers; using Sarand.BusinessMgr.Net.Core.Web.Middleware; using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.Net.Standard.Base.App; +using Sarand.Net.Standard.Base.Core; using System; using System.Collections.Generic; using System.Globalization; using System.Net.Http; -using System.Text; namespace Sarand.BusinessMgr.Net.Core.Web.App { //======================================================================= - public class SbmStartup_Web + public class SbmStartup_Web : SacsDisposable { //------------------------------------------------------------------- // Data members. @@ -40,6 +40,12 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App { Configuration = configuration; } + protected override void Dispose(bool disposing) + { + if (disposing) + { + } + } //------------------------------------------------------------------- // Properties. @@ -61,12 +67,16 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App // Authentication service. // Required to handle 'Forbidden' responses etc. config.services - .AddAuthentication(options => { + .AddAuthentication(options => + { options.DefaultAuthenticateScheme = "forbidScheme"; options.DefaultForbidScheme = "forbidScheme"; options.AddScheme("forbidScheme", "Handle Forbidden"); }); + // Periodic housekeeping. + config.services.AddHostedService(); + // Added to support memory caching of sessions. config.services.AddMemoryCache(); //config.services.AddDistributedMemoryCache(); - for multiple web servers. @@ -112,7 +122,7 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App .AddDataAnnotationsLocalization() // Ignore null values during object serialiation. .AddJsonOptions(options => { options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull; }); - // Jun24 Was: .AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = true; }); + // Jun24 Was: .AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = true; }); // Configure localisation middleware. config.services.Configure diff --git a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs index ca9a470..2d4b948 100644 --- a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs +++ b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs @@ -1,9 +1,7 @@ using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Utils; using System; -using System.Collections.Generic; using System.Linq; -using System.Text; namespace Sarand.BusinessMgr.Net.Standard.Base.App { @@ -15,7 +13,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App //------------------------------------------------------------------- public static class Version { - private static String version { get; } = "3.0.1.7"; + private static String version { get; } = "3.0.1.8"; // Retrieve version. public static String GetFullVersion() { return version; } public static String GetAppVersion() @@ -37,23 +35,25 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App //------------------------------------------------------------------- // Version history. //------------------------------------------------------------------- - // 3.0.1 19-Feb-25 Portal Transactions. - // 3.0.1.1 19-Feb-25 Portal tidy. - // 3.0.1.2 26-Feb-25 Requirements & tidy. - // 3.0.1.3 02-Mar-25 Requirements. - // 3.0.1.4 02-Mar-25 Fix pre-login crash on GetCurrencyDecimals(). - // 3.0.1.5 03-Mar-25 Refresh Transaction. Assets tidy. - // 3.0.1.6 05-May-25 Addresses. + // 3.0.1 19-Feb-25 Portal Transactions. + // 3.0.1.1 19-Feb-25 Portal tidy. + // 3.0.1.2 26-Feb-25 Requirements & tidy. + // 3.0.1.3 02-Mar-25 Requirements. + // 3.0.1.4 02-Mar-25 Fix pre-login crash on GetCurrencyDecimals(). + // 3.0.1.5 03-Mar-25 Refresh Transaction. Assets tidy. + // 3.0.1.6 05-May-25 Addresses. + // 3.0.1.7 21-Oct-25 Business object disposability. + // 3.0.1.8 26-Oct-25 Control repository status check on update. //------------------------------------------------------------------- - // 3.0.0 Jul-2021 Initial demo test version. - // 02-Feb-25 Initial live deployment. - // 3.0.0.1 08-Feb-25 Demo repository registration. - // 3.0.0.2 08-Feb-25 Production SMTP config. - // 3.0.0.3 10-Feb-25 Osie feedback #1. Control Repository Schema, Logs. - // 3.0.0.4 11-Feb-25 Portal Commodity Sales properties. Control Index population. - // 3.0.0.5 12-Feb-25 Portal Security forms tidy. Default Commodity type. Code Types and Codes. - // 3.0.0.6 13-Feb-25 Main page layouts. Demo Account registration. - // 3.0.0.7 17-Feb-25 Demo Transaction population. + // 3.0.0 Jul-2021 Initial demo test version. + // 02-Feb-25 Initial live deployment. + // 3.0.0.1 08-Feb-25 Demo repository registration. + // 3.0.0.2 08-Feb-25 Production SMTP config. + // 3.0.0.3 10-Feb-25 Osie feedback #1. Control Repository Schema, Logs. + // 3.0.0.4 11-Feb-25 Portal Commodity Sales properties. Control Index population. + // 3.0.0.5 12-Feb-25 Portal Security forms tidy. Default Commodity type. Code Types and Codes. + // 3.0.0.6 13-Feb-25 Main page layouts. Demo Account registration. + // 3.0.0.7 17-Feb-25 Demo Transaction population. //------------------------------------------------------------------- } //======================================================================= diff --git a/SaBusMgrStandardBase/Base/App/SbmAppConfig.cs b/SaBusMgrStandardBase/Base/App/SbmAppConfig.cs index cbabf03..98af86f 100644 --- a/SaBusMgrStandardBase/Base/App/SbmAppConfig.cs +++ b/SaBusMgrStandardBase/Base/App/SbmAppConfig.cs @@ -2,7 +2,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Base.Interfaces; using Sarand.Net.Standard.Base.Utils; using System; @@ -234,7 +233,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App // Interfaces must be available. if (internals.InterfaceConsole == null || !internals.InterfaceConsole.DatabaseIsValid) return false; // System Account & User tables must be available. - ISacsDatabase busMgrDb = SbmGlobals.Application.GetBusMgrDatabase(sessionConsole.UserContext.SessionContext); + ISacsDatabase busMgrDb = internals.BusMgrDatabase; if (!SbmGlobals.Application.DbTableExists(busMgrDb, SbmDbDfn.TableIdx.SystemAccount)) return false; if (!SbmGlobals.Application.DbTableExists(busMgrDb, SbmDbDfn.TableIdx.SystemUser)) return false; return true; diff --git a/SaBusMgrStandardBase/Base/App/SbmApplication.cs b/SaBusMgrStandardBase/Base/App/SbmApplication.cs index 46d4949..e699ed5 100644 --- a/SaBusMgrStandardBase/Base/App/SbmApplication.cs +++ b/SaBusMgrStandardBase/Base/App/SbmApplication.cs @@ -1,23 +1,15 @@ using Sarand.BusinessMgr.Net.Standard.Base.Consoles; using Sarand.BusinessMgr.Net.Standard.Base.Core; -using Sarand.Net.Standard.Base.CodeTypes; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Base.Diary; -using Sarand.Net.Standard.Base.Interfaces; -using Sarand.Net.Standard.Base.ItemData; -using Sarand.Net.Standard.Base.ItemDocs; -using Sarand.Net.Standard.Base.ItemOptions; -using Sarand.Net.Standard.Base.ReferenceData; -using Sarand.Net.Standard.Base.Security; -using Sarand.Net.Standard.Base.UpdateLog; using System; using System.Collections.Generic; +using System.Threading; namespace Sarand.BusinessMgr.Net.Standard.Base.App { - //======================================================================= - public abstract class SbmApplication : SacsDisposable + //======================================================================= + public abstract class SbmApplication : SacsDisposable { //------------------------------------------------------------------- // Data members. @@ -45,28 +37,20 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App return properties.GetPropertyValue(section, name); } - //------------------------------------------------------------------- - // Properties. + // --- Properties --- + public abstract SbmSystem System { get; } // Control & Template Databases. public abstract ISacsDatabase GetControlDatabase(); public abstract ISacsDatabase GetTemplateDatabase(); // Business Mgr Database. public abstract HashSet GetRepositoryContexts(SbmSessionContext sessionContext); - public abstract ISacsDatabase GetBusMgrDatabase(SbmSessionContext sessionContext); - public IDatabaseInfo CreateBusMgrDbInfo(SbmSessionContext sessionContext) - { - return GetBusMgrDatabase(sessionContext).CreateDbInfo(); - } + public abstract ISacsDatabase CreateBusMgrDatabase(SbmSessionContext sessionContext); // Instance and Organisation profiles. public abstract SbmInstanceConfig GetInstanceConfig(SbmSessionContext sessionContext); public abstract SbmInstanceDataCache GetInstanceDataCache(SbmSessionContext sessionContext); public abstract SbmOrganisationConfig GetOrganisationConfig(ISbmUserOrganisationContext userContext); // Database utilities. - public IDatabaseInfo CreateDbInfo(ISacsDatabase db) - { - return db?.CreateDbInfo() ?? null; - } public bool DbTableExists(ISacsDatabase db, SbmDbDfn.TableIdx tableIdx) { return db?.TableExists(SbmDbDfn.GetTableName(tableIdx)) ?? false; @@ -84,6 +68,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App // Email configuration. public abstract SbmEmailConfig EmailConfig { get; } + // --- Utilities --- + + public abstract void DoHousekeeping(CancellationToken ct); + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaBusMgrStandardBase/Base/App/SbmGlobals.cs b/SaBusMgrStandardBase/Base/App/SbmGlobals.cs index 7a98225..c420704 100644 --- a/SaBusMgrStandardBase/Base/App/SbmGlobals.cs +++ b/SaBusMgrStandardBase/Base/App/SbmGlobals.cs @@ -1,15 +1,4 @@ -using Sarand.Net.Standard.Base.CodeTypes; -using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Base.Diary; -using Sarand.Net.Standard.Base.Interfaces; -using Sarand.Net.Standard.Base.ItemData; -using Sarand.Net.Standard.Base.ItemDocs; -using Sarand.Net.Standard.Base.ItemOptions; -using Sarand.Net.Standard.Base.ReferenceData; -using Sarand.Net.Standard.Base.Security; -using Sarand.Net.Standard.Base.UpdateLog; - -namespace Sarand.BusinessMgr.Net.Standard.Base.App +namespace Sarand.BusinessMgr.Net.Standard.Base.App { //======================================================================= public static class SbmGlobals @@ -22,13 +11,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App // Application. public static SbmApplication Application { get; set; } = null; - //------------------------------------------------------------------- - // Database. - public static ISacsDatabase GetBusMgrDatabase(SbmSessionContext sessionContext) - { - return Application != null ? Application.GetBusMgrDatabase(sessionContext) : null; - } - //------------------------------------------------------------------- // Clear globals. public static void Clear() diff --git a/SaBusMgrStandardBase/Base/App/SbmInstanceDataCache.cs b/SaBusMgrStandardBase/Base/App/SbmInstanceDataCache.cs index 4869c44..5e22b1c 100644 --- a/SaBusMgrStandardBase/Base/App/SbmInstanceDataCache.cs +++ b/SaBusMgrStandardBase/Base/App/SbmInstanceDataCache.cs @@ -1,11 +1,7 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.ItemOptions; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Sarand.BusinessMgr.Net.Standard.Base.App { @@ -17,15 +13,28 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App { //------------------------------------------------------------------- // Construction. + public SbmInstanceDataCache() { } + protected override void Dispose(bool disposing) { } //------------------------------------------------------------------- - // Retrieve Item Options for Owner Organisation configuration. + + /// + /// Retrieve Item Options for Owner Organisation configuration. + /// + /// + /// public abstract List GetOwnerOptions(ISbmUserOrganisationContext userContext); + /// + /// Resets the state of the cache to its initial condition. + /// + /// Typically done when something significant about the instance (eg. db connection configuration) has changed. + public abstract void Reset(); + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaBusMgrStandardBase/Base/App/SbmInternals.cs b/SaBusMgrStandardBase/Base/App/SbmInternals.cs index 0f8de4e..d45ccc7 100644 --- a/SaBusMgrStandardBase/Base/App/SbmInternals.cs +++ b/SaBusMgrStandardBase/Base/App/SbmInternals.cs @@ -2,14 +2,12 @@ using Sarand.BusinessMgr.Net.Standard.Base.Consoles; using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; -using Sarand.BusinessMgr.Net.Standard.Base.Mgr.Control; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.CodeTypes; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Diary; -using Sarand.Net.Standard.Base.Email; using Sarand.Net.Standard.Base.Interfaces; using Sarand.Net.Standard.Base.ItemData; using Sarand.Net.Standard.Base.ItemDocs; @@ -17,7 +15,6 @@ using Sarand.Net.Standard.Base.ItemOptions; using Sarand.Net.Standard.Base.ReferenceData; using Sarand.Net.Standard.Base.Security; using Sarand.Net.Standard.Base.UpdateLog; -using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; using System.Linq; @@ -61,41 +58,46 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App //------------------------------------------------------------------- // Data members. - private readonly SbmSystem system = SbmGlobals.System; - // Managers. - private class Managers + private class DataMembers { - public SbmAccountMgr accountMgr; - public SbmAssetMgr assetMgr; - public SbmCommodityMgr commodityMgr; - public SbmPriceMgr priceMgr; - public SbmTransactionMgr transactionMgr; - public SbmStockMgr stockMgr; - public SbmProcessMgr processMgr; - public SbmDataItemMgr dataItemMgr; + public SbmSystem system { get; } = SbmGlobals.System; + public ISacsDatabase busMgrDatabase { get; set; } + // Managers. + public class Managers + { + public SbmAccountMgr accountMgr; + public SbmAssetMgr assetMgr; + public SbmCommodityMgr commodityMgr; + public SbmPriceMgr priceMgr; + public SbmTransactionMgr transactionMgr; + public SbmStockMgr stockMgr; + public SbmProcessMgr processMgr; + public SbmDataItemMgr dataItemMgr; + } + public Managers mgr { get; } = new Managers(); + // Consoles. + public class Consoles + { + public SbmInstanceSchemaConsole instanceSchemaConsole; + public SbmSessionConsole sessionConsole; + public SbmAccountsConsole accountsConsole; + public SaDiaryConsole diaryConsole; + public SaSecurityConsole securityConsole; + public SaCodeTypeConsole codeTypeConsole; + public SaReferenceDataConsole referenceDataConsole; + public SaUpdateLogConsole updateLogConsole; + public SaInterfaceConsole interfaceConsole; + public SaItemDocConsole itemDocConsole; + public SaItemOptionConsole itemOptionConsole; + public SaItemDataConsole itemDataConsole; + public SbmEmailConsole emailConsole; + } + public Consoles con { get; } = new Consoles(); + // Configurations. + public SbmStockControlConfig stockControlConfig { get; set; } + public SbmRequirementCostingConfig requirementCostingConfig { get; set; } } - private readonly Managers mgr = new Managers(); - // Consoles. - private class Consoles - { - public SbmInstanceSchemaConsole instanceSchemaConsole; - public SbmSessionConsole sessionConsole; - public SbmAccountsConsole accountsConsole; - public SaDiaryConsole diaryConsole; - public SaSecurityConsole securityConsole; - public SaCodeTypeConsole codeTypeConsole; - public SaReferenceDataConsole referenceDataConsole; - public SaUpdateLogConsole updateLogConsole; - public SaInterfaceConsole interfaceConsole; - public SaItemDocConsole itemDocConsole; - public SaItemOptionConsole itemOptionConsole; - public SaItemDataConsole itemDataConsole; - public SbmEmailConsole emailConsole; - } - private readonly Consoles con = new Consoles(); - // Configurations. - private SbmStockControlConfig stockControlConfig; - private SbmRequirementCostingConfig requirementCostingConfig; + private DataMembers mbr { get; } = new DataMembers(); //------------------------------------------------------------------- // Construction. @@ -121,27 +123,27 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App if (disposing) { // Managers. - if (mgr.accountMgr != null) mgr.accountMgr.Dispose(); - if (mgr.assetMgr != null) mgr.assetMgr.Dispose(); - if (mgr.commodityMgr != null) mgr.commodityMgr.Dispose(); - if (mgr.priceMgr != null) mgr.priceMgr.Dispose(); - if (mgr.transactionMgr != null) mgr.transactionMgr.Dispose(); - if (mgr.stockMgr != null) mgr.stockMgr.Dispose(); - if (mgr.processMgr != null) mgr.processMgr.Dispose(); - if (mgr.dataItemMgr != null) mgr.dataItemMgr.Dispose(); + if (mbr.mgr.accountMgr != null) mbr.mgr.accountMgr.Dispose(); + if (mbr.mgr.assetMgr != null) mbr.mgr.assetMgr.Dispose(); + if (mbr.mgr.commodityMgr != null) mbr.mgr.commodityMgr.Dispose(); + if (mbr.mgr.priceMgr != null) mbr.mgr.priceMgr.Dispose(); + if (mbr.mgr.transactionMgr != null) mbr.mgr.transactionMgr.Dispose(); + if (mbr.mgr.stockMgr != null) mbr.mgr.stockMgr.Dispose(); + if (mbr.mgr.processMgr != null) mbr.mgr.processMgr.Dispose(); + if (mbr.mgr.dataItemMgr != null) mbr.mgr.dataItemMgr.Dispose(); // Consoles. // Database console doesn't require disposal. - if (con.sessionConsole != null) con.sessionConsole.Dispose(); - if (con.diaryConsole != null) con.diaryConsole.Dispose(); - if (con.securityConsole != null) con.securityConsole.Dispose(); - if (con.codeTypeConsole != null) con.codeTypeConsole.Dispose(); - if (con.referenceDataConsole != null) con.referenceDataConsole.Dispose(); - if (con.updateLogConsole != null) con.updateLogConsole.Dispose(); - if (con.interfaceConsole != null) con.interfaceConsole.Dispose(); - if (con.itemDocConsole != null) con.itemDocConsole.Dispose(); - if (con.itemOptionConsole != null) con.itemOptionConsole.Dispose(); - if (con.itemDataConsole != null) con.itemDataConsole.Dispose(); - if (con.itemDataConsole != null) con.itemDataConsole.Dispose(); + if (mbr.con.sessionConsole != null) mbr.con.sessionConsole.Dispose(); + if (mbr.con.diaryConsole != null) mbr.con.diaryConsole.Dispose(); + if (mbr.con.securityConsole != null) mbr.con.securityConsole.Dispose(); + if (mbr.con.codeTypeConsole != null) mbr.con.codeTypeConsole.Dispose(); + if (mbr.con.referenceDataConsole != null) mbr.con.referenceDataConsole.Dispose(); + if (mbr.con.updateLogConsole != null) mbr.con.updateLogConsole.Dispose(); + if (mbr.con.interfaceConsole != null) mbr.con.interfaceConsole.Dispose(); + if (mbr.con.itemDocConsole != null) mbr.con.itemDocConsole.Dispose(); + if (mbr.con.itemOptionConsole != null) mbr.con.itemOptionConsole.Dispose(); + if (mbr.con.itemDataConsole != null) mbr.con.itemDataConsole.Dispose(); + if (mbr.con.itemDataConsole != null) mbr.con.itemDataConsole.Dispose(); } } @@ -152,11 +154,19 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App public ISbmUserOrganisationContext UserContext { get; } public SbmSessionContext SessionContext { get { return UserContext?.SessionContext; } } public ISbmSecurityProfile_Core SecurityProfile { get { return UserContext.SecurityProfile; } } - public SbmAccountsConsole AccountsConsole { get { if (con.accountsConsole == null) con.accountsConsole = new SbmAccountsConsole(this); { return con.accountsConsole; } } } + public SbmAccountsConsole AccountsConsole { get { if (mbr.con.accountsConsole == null) mbr.con.accountsConsole = new SbmAccountsConsole(this); { return mbr.con.accountsConsole; } } } //------------------------------------------------------------------- // Database. - public ISacsDatabase BusMgrDatabase { get { return Application.GetBusMgrDatabase(SessionContext); } } + public ISacsDatabase BusMgrDatabase + { + get + { + if (mbr.busMgrDatabase == null) + mbr.busMgrDatabase = Application.CreateBusMgrDatabase(SessionContext); + return mbr.busMgrDatabase; + } + } public DbUpdateInfo DbUpdateInfo { get { return UserContext.DbUpdateInfo; } } // Schema. public bool TableExists(String tableName) @@ -288,72 +298,72 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App { get { - if (mgr.accountMgr == null) - mgr.accountMgr = system.CreateAccountMgr(this); - return mgr.accountMgr; + if (mbr.mgr.accountMgr == null) + mbr.mgr.accountMgr = mbr.system.CreateAccountMgr(this); + return mbr.mgr.accountMgr; } } public SbmAssetMgr AssetMgr { get { - if (mgr.assetMgr == null) - mgr.assetMgr = system.CreateAssetMgr(this); - return mgr.assetMgr; + if (mbr.mgr.assetMgr == null) + mbr.mgr.assetMgr = mbr.system.CreateAssetMgr(this); + return mbr.mgr.assetMgr; } } public SbmCommodityMgr CommodityMgr { get { - if (mgr.commodityMgr == null) - mgr.commodityMgr = system.CreateCommodityMgr(this); - return mgr.commodityMgr; + if (mbr.mgr.commodityMgr == null) + mbr.mgr.commodityMgr = mbr.system.CreateCommodityMgr(this); + return mbr.mgr.commodityMgr; } } public SbmPriceMgr PriceMgr { get { - if (mgr.priceMgr == null) - mgr.priceMgr = system.CreatePriceMgr(this); - return mgr.priceMgr; + if (mbr.mgr.priceMgr == null) + mbr.mgr.priceMgr = mbr.system.CreatePriceMgr(this); + return mbr.mgr.priceMgr; } } public SbmTransactionMgr TransactionMgr { get { - if (mgr.transactionMgr == null) - mgr.transactionMgr = system.CreateTransactionMgr(this); - return mgr.transactionMgr; + if (mbr.mgr.transactionMgr == null) + mbr.mgr.transactionMgr = mbr.system.CreateTransactionMgr(this); + return mbr.mgr.transactionMgr; } } public SbmStockMgr StockMgr { get { - if (mgr.stockMgr == null) - mgr.stockMgr = system.CreateStockMgr(this); - return mgr.stockMgr; + if (mbr.mgr.stockMgr == null) + mbr.mgr.stockMgr = mbr.system.CreateStockMgr(this); + return mbr.mgr.stockMgr; } } public SbmProcessMgr ProcessMgr { get { - if (mgr.processMgr == null) - mgr.processMgr = system.CreateProcessMgr(this); - return mgr.processMgr; + if (mbr.mgr.processMgr == null) + mbr.mgr.processMgr = mbr.system.CreateProcessMgr(this); + return mbr.mgr.processMgr; } } public SbmDataItemMgr DataItemMgr { get { - if (mgr.dataItemMgr == null) - mgr.dataItemMgr = SbmGlobals.System.CreateDataItemMgr(this); - return mgr.dataItemMgr; + if (mbr.mgr.dataItemMgr == null) + mbr.mgr.dataItemMgr = SbmGlobals.System.CreateDataItemMgr(this); + return mbr.mgr.dataItemMgr; } } @@ -363,89 +373,89 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App { get { - if (con.instanceSchemaConsole == null) { con.instanceSchemaConsole = new SbmInstanceSchemaConsole(BusMgrDatabase); } - return con.instanceSchemaConsole; + if (mbr.con.instanceSchemaConsole == null) { mbr.con.instanceSchemaConsole = new SbmInstanceSchemaConsole(BusMgrDatabase); } + return mbr.con.instanceSchemaConsole; } } public SbmSessionConsole SessionConsole { get { - if (con.sessionConsole == null) { con.sessionConsole = SbmGlobals.System.CreateSessionConsole(this); } - return con.sessionConsole; + if (mbr.con.sessionConsole == null) { mbr.con.sessionConsole = SbmGlobals.System.CreateSessionConsole(this); } + return mbr.con.sessionConsole; } } public SaDiaryConsole DiaryConsole { get { - if (con.diaryConsole == null) { con.diaryConsole = SbmGlobals.System.CreateDiaryConsole(this); } - return con.diaryConsole; + if (mbr.con.diaryConsole == null) { mbr.con.diaryConsole = SbmGlobals.System.CreateDiaryConsole(this); } + return mbr.con.diaryConsole; } } public SaSecurityConsole SecurityConsole { get { - if (con.securityConsole == null) { con.securityConsole = SbmGlobals.System.CreateSecurityConsole(this); } - return con.securityConsole; + if (mbr.con.securityConsole == null) { mbr.con.securityConsole = SbmGlobals.System.CreateSecurityConsole(this); } + return mbr.con.securityConsole; } } public SaCodeTypeConsole CodeTypeConsole { get { - if (con.codeTypeConsole == null) { con.codeTypeConsole = SbmGlobals.System.CreateCodeTypeConsole(this); } - return con.codeTypeConsole; + if (mbr.con.codeTypeConsole == null) { mbr.con.codeTypeConsole = SbmGlobals.System.CreateCodeTypeConsole(this); } + return mbr.con.codeTypeConsole; } } public SaReferenceDataConsole ReferenceDataConsole { get { - if (con.referenceDataConsole == null) { con.referenceDataConsole = SbmGlobals.System.CreateReferenceDataConsole(this); } - return con.referenceDataConsole; + if (mbr.con.referenceDataConsole == null) { mbr.con.referenceDataConsole = SbmGlobals.System.CreateReferenceDataConsole(this); } + return mbr.con.referenceDataConsole; } } public SaUpdateLogConsole UpdateLogConsole { get { - if (con.updateLogConsole == null) { con.updateLogConsole = SbmGlobals.System.CreateUpdateLogConsole(this); } - return con.updateLogConsole; + if (mbr.con.updateLogConsole == null) { mbr.con.updateLogConsole = SbmGlobals.System.CreateUpdateLogConsole(this); } + return mbr.con.updateLogConsole; } } public SaInterfaceConsole InterfaceConsole { get { - if (con.interfaceConsole == null) { con.interfaceConsole = SbmGlobals.System.CreateInterfaceConsole(this); } - return con.interfaceConsole; + if (mbr.con.interfaceConsole == null) { mbr.con.interfaceConsole = SbmGlobals.System.CreateInterfaceConsole(this); } + return mbr.con.interfaceConsole; } } public SaItemDocConsole ItemDocConsole { get { - if (con.itemDocConsole == null) { con.itemDocConsole = SbmGlobals.System.CreateItemDocConsole(this); } - return con.itemDocConsole; + if (mbr.con.itemDocConsole == null) { mbr.con.itemDocConsole = SbmGlobals.System.CreateItemDocConsole(this); } + return mbr.con.itemDocConsole; } } public SaItemOptionConsole ItemOptionConsole { get { - if (con.itemOptionConsole == null) - con.itemOptionConsole = SbmGlobals.System.CreateItemOptionConsole(this); - return con.itemOptionConsole; + if (mbr.con.itemOptionConsole == null) + mbr.con.itemOptionConsole = SbmGlobals.System.CreateItemOptionConsole(this); + return mbr.con.itemOptionConsole; } } public SaItemDataConsole ItemDataConsole { get { - if (con.itemDataConsole == null) { con.itemDataConsole = SbmGlobals.System.CreateItemDataConsole(this); } - return con.itemDataConsole; + if (mbr.con.itemDataConsole == null) { mbr.con.itemDataConsole = SbmGlobals.System.CreateItemDataConsole(this); } + return mbr.con.itemDataConsole; } } @@ -456,8 +466,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App { get { - if (con.emailConsole == null) { con.emailConsole = SbmGlobals.System.CreateEmailConsole(EmailConfig); } - return con.emailConsole; + if (mbr.con.emailConsole == null) { mbr.con.emailConsole = SbmGlobals.System.CreateEmailConsole(EmailConfig); } + return mbr.con.emailConsole; } } @@ -467,18 +477,18 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App { get { - if (stockControlConfig == null) - stockControlConfig = SessionConsole.GetStockControlConfig(); - return stockControlConfig; + if (mbr.stockControlConfig == null) + mbr.stockControlConfig = SessionConsole.GetStockControlConfig(); + return mbr.stockControlConfig; } } public SbmRequirementCostingConfig RequirementCostingConfig { get { - if (requirementCostingConfig == null) - requirementCostingConfig = SessionConsole.GetRequirementCostingConfig(); - return requirementCostingConfig; + if (mbr.requirementCostingConfig == null) + mbr.requirementCostingConfig = SessionConsole.GetRequirementCostingConfig(); + return mbr.requirementCostingConfig; } } diff --git a/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs b/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs index 7fa61a2..46a2141 100644 --- a/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs +++ b/SaBusMgrStandardBase/Base/Mgr/SbmCoreMgr.cs @@ -258,8 +258,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr SbmApplication application = SbmGlobals.Application; if (application != null) { - ISacsDatabase busMgrDb = application.GetBusMgrDatabase(SessionContext); - return application.DbTableExists(busMgrDb, tableIdx); + return application.DbTableExists(Internals.BusMgrDatabase, tableIdx); } return false; } @@ -268,8 +267,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr SbmApplication application = SbmGlobals.Application; if (application != null) { - ISacsDatabase busMgrDb = application.GetBusMgrDatabase(SessionContext); - return application.DbColumnExists(busMgrDb, columnIdx); + return application.DbColumnExists(Internals.BusMgrDatabase, columnIdx); } return false; } diff --git a/SaBusMgrStandardDbas/Dbas/App/SbmInstanceDataCache_Dbas.cs b/SaBusMgrStandardDbas/Dbas/App/SbmInstanceDataCache_Dbas.cs index 2c54f49..f64977f 100644 --- a/SaBusMgrStandardDbas/Dbas/App/SbmInstanceDataCache_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/App/SbmInstanceDataCache_Dbas.cs @@ -7,9 +7,6 @@ using Sarand.Net.Standard.Base.ItemOptions; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Sarand.BusinessMgr.Net.Standard.Dbas.App { @@ -21,6 +18,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.App { //------------------------------------------------------------------- // Definitions. + private class ItemOptionData { public ItemOptionData(ItemId itemId) @@ -46,16 +44,20 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.App //------------------------------------------------------------------- // Data members. + private SbmInternals internals = null; + // Instance Item Options - keyed on Owner Affiliate Id. private readonly Dictionary itemOptionCaches = new Dictionary(); //------------------------------------------------------------------- // Construction. + public SbmInstanceDataCache_Dbas(SbmSessionContext sessionContext) { this.SessionContext = sessionContext; } + protected override void Dispose(bool disposing) { if (internals != null) internals.Dispose(); internals = null; @@ -64,7 +66,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.App //------------------------------------------------------------------- // Properties. - public SbmSessionContext SessionContext { get; } + + public SbmSessionContext SessionContext { get; } private SbmInternals Internals { get { if (internals == null) { internals = new SbmInternals(SessionContext); }; return internals; } } //------------------------------------------------------------------- @@ -108,6 +111,20 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.App } //------------------------------------------------------------------- + + /// + /// Resets the state of the cache to its initial condition. + /// + /// Typically done when something significant about the instance (eg. db connection configuration) has changed. + public override void Reset() + { + lock (itemOptionCaches) + { + itemOptionCaches.Clear(); + } + } + + //------------------------------------------------------------------- } //======================================================================= } diff --git a/SaBusMgrStandardDbas/Dbas/Consoles/SbmDatabaseConsole.cs b/SaBusMgrStandardDbas/Dbas/Consoles/SbmDatabaseConsole.cs index 0d4e3d3..bb3b9b5 100644 --- a/SaBusMgrStandardDbas/Dbas/Consoles/SbmDatabaseConsole.cs +++ b/SaBusMgrStandardDbas/Dbas/Consoles/SbmDatabaseConsole.cs @@ -1,11 +1,7 @@ using Sarand.BusinessMgr.Net.Standard.Base.App; -using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Base; using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles { @@ -35,7 +31,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles //------------------------------------------------------------------- // Properties. private SbmSessionContext SessionContext { get { return mbr.SessionContext; } } - private ISacsDatabase Database { get { if (mbr.Database == null) { mbr.Database = SbmGlobals.Application.GetBusMgrDatabase(SessionContext); } return mbr.Database; } } + private ISacsDatabase Database { get { if (mbr.Database == null) { mbr.Database = SbmGlobals.Application.CreateBusMgrDatabase(SessionContext); } return mbr.Database; } } private new IndexStats IndexStats { get; set; } //------------------------------------------------------------------- diff --git a/SaBusMgrStandardDbas/Dbas/Consoles/SbmDiaryConsole_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Consoles/SbmDiaryConsole_Dbas.cs index 1dc0a60..dc4cfe0 100644 --- a/SaBusMgrStandardDbas/Dbas/Consoles/SbmDiaryConsole_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Consoles/SbmDiaryConsole_Dbas.cs @@ -1,6 +1,5 @@ using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Core; -using Sarand.Net.Standard.Dbas.Base; using Sarand.Net.Standard.Dbas.Diary; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles @@ -10,7 +9,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles { //------------------------------------------------------------------- // Construction. - protected SbmDiaryConsole_Dbas(ISbmUserOrganisationContext userContext) : base(SbmGlobals.Application.GetBusMgrDatabase(userContext.SessionContext)) + protected SbmDiaryConsole_Dbas(ISbmUserOrganisationContext userContext) + : base(SbmGlobals.Application.CreateBusMgrDatabase(userContext.SessionContext)) { UserContext = userContext; } diff --git a/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDataConsole_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDataConsole_Dbas.cs index 148bf6e..6b9a614 100644 --- a/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDataConsole_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDataConsole_Dbas.cs @@ -1,6 +1,5 @@ using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Core; -using Sarand.Net.Standard.Dbas.Base; using Sarand.Net.Standard.Dbas.ItemData; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles @@ -10,7 +9,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles { //------------------------------------------------------------------- // Construction. - protected SbmItemDataConsole_Dbas(ISbmUserOrganisationContext userContext) : base(SbmGlobals.Application.GetBusMgrDatabase(userContext.SessionContext)) + protected SbmItemDataConsole_Dbas(ISbmUserOrganisationContext userContext) + : base(SbmGlobals.Application.CreateBusMgrDatabase(userContext.SessionContext)) { UserContext = userContext; } diff --git a/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDocConsole_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDocConsole_Dbas.cs index f7707ed..e9d44c3 100644 --- a/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDocConsole_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Consoles/SbmItemDocConsole_Dbas.cs @@ -1,6 +1,5 @@ using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Core; -using Sarand.Net.Standard.Dbas.Base; using Sarand.Net.Standard.Dbas.ItemDocs; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles @@ -10,7 +9,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Consoles { //------------------------------------------------------------------- // Construction. - protected SbmItemDocConsole_Dbas(ISbmUserOrganisationContext userContext) : base(SbmGlobals.Application.GetBusMgrDatabase(userContext.SessionContext)) + protected SbmItemDocConsole_Dbas(ISbmUserOrganisationContext userContext) + : base(SbmGlobals.Application.CreateBusMgrDatabase(userContext.SessionContext)) { UserContext = userContext; } diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas.cs index 8bd2102..1fba8ef 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas.cs @@ -3,7 +3,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.BusinessMgr.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Dbas.Base; using System; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr @@ -15,7 +14,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -44,14 +42,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); } //------------------------------------------------------------------- // Properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } public override bool SystemAccountDatabaseIsValid { get { return Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SystemAccount)); } } //------------------------------------------------------------------- diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs index 35795b2..ba219c5 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas.cs @@ -3,7 +3,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.BusinessMgr.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Dbas.Base; using System; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr @@ -18,7 +17,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -47,14 +45,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); } //------------------------------------------------------------------- // Properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } //------------------------------------------------------------------- // Utilities. diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas.cs index 436bb48..12828be 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas.cs @@ -3,7 +3,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.BusinessMgr.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Dbas.Base; using System; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr @@ -15,7 +14,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -45,14 +43,13 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); + } //------------------------------------------------------------------- // Database properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } public String TableName_PortfolioItem { get { return SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem); } } //------------------------------------------------------------------- diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas.cs index 4ae996a..cbbc289 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas.cs @@ -3,7 +3,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.BusinessMgr.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Dbas.Base; using System; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr @@ -18,7 +17,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -47,14 +45,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); } //------------------------------------------------------------------- // Properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } //------------------------------------------------------------------- // Utilities. diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas.cs index 31195c3..3b49838 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmPriceMgr_Dbas.cs @@ -3,7 +3,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.BusinessMgr.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Dbas.Base; using System; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr @@ -15,7 +14,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -44,14 +42,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); } //------------------------------------------------------------------- // Properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } protected String TableName_PriceSet { get { return SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPriceSet); } } protected String TableName_Price { get { return SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPriceSet); } } public override bool PriceDatabaseIsValid { get { return Database.TableExists(TableName_PriceSet) && Database.TableExists(TableName_Price); } } diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas.cs index 4f47955..1c5123b 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmProcessMgr_Dbas.cs @@ -3,7 +3,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.BusinessMgr.Net.Standard.Dbas.Data; using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Dbas.Base; using System; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr @@ -18,7 +17,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -39,14 +37,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); } //------------------------------------------------------------------- // Properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } protected String TableName_Process { get { return SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Process); } } protected String TableName_ItemLink { get { return SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink); } } public override bool ProcessDatabaseIsValid diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas.cs index 29e28ee..2d1c6b5 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmStockMgr_Dbas.cs @@ -8,7 +8,6 @@ using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; -using Sarand.Net.Standard.Dbas.Base; using System; using System.Collections.Generic; using System.Linq; @@ -22,7 +21,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -51,14 +49,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); } //------------------------------------------------------------------- // Properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } //------------------------------------------------------------------- // Utilities. diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas.cs index bd982e9..65baf3e 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas.cs @@ -9,7 +9,6 @@ using Sarand.Net.Standard.Base.CodeTypes; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; -using Sarand.Net.Standard.Dbas.Base; using Sarand.Net.Standard.Dbas.Data; using System; using System.Collections.Generic; @@ -23,7 +22,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Data members. public class DataMembers { - public SacsDatabase db = null; public SbmDbDataItem.SbmDatabaseInfo dbInfo; } private readonly DataMembers mbr = new DataMembers(); @@ -44,14 +42,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Initialisation. private void Initialise() { - mbr.db = (SbmGlobals.Application.GetBusMgrDatabase(SessionContext) as SacsDatabase); - mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(mbr.db.DatabaseName, mbr.db.GetTableDfns()); } //------------------------------------------------------------------- // Properties. - protected ISacsDatabase Database { get { return mbr.db; } } - protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { return mbr.dbInfo; } } + protected ISacsDatabase Database { get { return Internals.BusMgrDatabase; } } + protected SbmDbDataItem.SbmDatabaseInfo DbInfo { get { if (mbr.dbInfo is null) mbr.dbInfo = new SbmDbDataItem.SbmDatabaseInfo(Database.DatabaseName, Database.GetTableDfns()); return mbr.dbInfo; } } //------------------------------------------------------------------- // Utilities. diff --git a/SaBusMgrTest_Control/Web/Control/App/SbmApplication_Tester.cs b/SaBusMgrTest_Control/Web/Control/App/SbmApplication_Tester.cs index 2f04a0a..55d31d3 100644 --- a/SaBusMgrTest_Control/Web/Control/App/SbmApplication_Tester.cs +++ b/SaBusMgrTest_Control/Web/Control/App/SbmApplication_Tester.cs @@ -1,9 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Sarand.BusinessMgr.Net.Core.Web.App; -using Sarand.BusinessMgr.Net.Standard.Base.App; +using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control; using Sarand.BusinessMgr.Net.Standard.Base.Consoles; -using Sarand.BusinessMgr.Net.Standard.Base.Mgr.Control; using Sarand.BusinessMgr.Web.Control.Consoles; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; @@ -129,7 +126,7 @@ namespace Sarand.BusinessMgr.Test.Web.Control.App Assert.IsNotNull(instanceConsole); // Session Context. - ushort sessionIdx = App_Control.GetCoreSessionIndexForControlRepository(repository.OwnerId, repository.Id); + ushort sessionIdx = App_Control.GetCoreSessionIndexForControlRepository(repository.Id); SbmSessionContext sessionContext = App_Control.GetSessionContextByIndex(sessionIdx); Assert.IsNotNull(sessionContext); Assert.AreEqual(sessionIdx, sessionContext.Index); diff --git a/SaBusMgrTest_Portal/Web/Portal/App/SbmApplication_SessionData_Tester.cs b/SaBusMgrTest_Portal/Web/Portal/App/SbmApplication_SessionData_Tester.cs index 61ad044..b351528 100644 --- a/SaBusMgrTest_Portal/Web/Portal/App/SbmApplication_SessionData_Tester.cs +++ b/SaBusMgrTest_Portal/Web/Portal/App/SbmApplication_SessionData_Tester.cs @@ -12,7 +12,6 @@ using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Helpers; using Sarand.Net.Standard.Base.Security; using Sarand.Net.Standard.Base.Utils; -using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Test.Web.Portal.App @@ -41,7 +40,7 @@ namespace Sarand.BusinessMgr.Test.Web.Portal.App string repositoryContext = "Mimo"; SbmSessionContext sessionContext = GetCoreSessionContext(repositoryContext); Assert.IsNotNull(sessionContext); - ISacsDatabase busMgrDatabase = AppPortal.GetBusMgrDatabase(sessionContext); + ISacsDatabase busMgrDatabase = AppPortal.CreateBusMgrDatabase(sessionContext); // Session data. SbmSessionData_Portal sessionData = new SbmSessionData_Portal(sessionContext, repositoryContext, null, null, null, null); @@ -172,7 +171,7 @@ namespace Sarand.BusinessMgr.Test.Web.Portal.App string repositoryContext = "Mimo"; SbmSessionContext sessionContext = GetCoreSessionContext(repositoryContext); Assert.IsNotNull(sessionContext); - ISacsDatabase busMgrDatabase = AppPortal.GetBusMgrDatabase(sessionContext); + ISacsDatabase busMgrDatabase = AppPortal.CreateBusMgrDatabase(sessionContext); // User Session. SbmSessionData_Portal sessionData = new SbmSessionData_Portal(sessionContext, repositoryContext, null, null, null, null); diff --git a/SaBusinessMgrCoreWebControl/Control/App/SbmApplication_Control.cs b/SaBusinessMgrCoreWebControl/Control/App/SbmApplication_Control.cs index 113d962..331426e 100644 --- a/SaBusinessMgrCoreWebControl/Control/App/SbmApplication_Control.cs +++ b/SaBusinessMgrCoreWebControl/Control/App/SbmApplication_Control.cs @@ -26,6 +26,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; namespace Sarand.BusinessMgr.Web.Control.App { @@ -52,19 +53,53 @@ namespace Sarand.BusinessMgr.Web.Control.App private ISacsDatabase templateDatabase = null; // Core Session contexts - to access Core database via repository configuration. private static ushort sessionContextIdx_Next = 101; - private class CoreInstanceContextData + private class CoreInstanceContextData : SacsDisposable { - public CoreInstanceContextData(SbmSessionContext_Web sessionContext, SysId controlOwnerId, SysId controlRepositoryId) + public CoreInstanceContextData(SbmSessionContext_Web sessionContext, SbmcRepository repository) { SessionContext = sessionContext; - ControlOwnerId = controlOwnerId; - ControlRepositoryId = controlRepositoryId; + ControlRepositoryId = repository.Id; + RefreshRepository(repository); + } + protected override void Dispose(bool disposing) + { + instanceDataCache?.Dispose(); + instanceDataCache = null; + } + public void RefreshRepository(SbmcRepository repository) + { + bool contextChanged = false; + if (ControlOwnerId is null || !ControlOwnerId.Equals(repository.OwnerId)) + { + ControlOwnerId = repository.OwnerId; + contextChanged = true; + } + if (!RepositoryContexts.Contains(repository.Context)) + { + RepositoryContexts.Clear(); + RepositoryContexts.Add(repository.Context); + contextChanged = true; + } + // Database. + SacsDatabaseConsole.OdbcConfig odbcConfig = SbmCoreInstanceConsole_Dbas.GetRepositoryOdbcConfig(repository); + if (!odbcConfig.ConnectionString.EqualsCI(OdbcConfig?.ConnectionString ?? "")) + { + OdbcConfig = odbcConfig; + contextChanged = true; + } + if (contextChanged) + { + instanceConfig = null; + instanceDataCache?.Reset(); + } + PropertiesPopulated = DateTime.Now; } public SbmSessionContext_Web SessionContext { get; } - public SysId ControlOwnerId { get; } - public SysId ControlRepositoryId { get; } + public SysId ControlOwnerId { get; private set; } + public SysId ControlRepositoryId { get; init; } public HashSet RepositoryContexts { get; } = new HashSet(); - public ISacsDatabase BusMgrDatabase { get; set; } + public SacsDatabaseConsole.OdbcConfig OdbcConfig { get; private set; } + public DateTime PropertiesPopulated { get; private set; } = DateTime.Now; // Instance config. private SbmInstanceConfig instanceConfig = null; public SbmInstanceConfig InstanceConfig @@ -108,9 +143,20 @@ namespace Sarand.BusinessMgr.Web.Control.App throw; } } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + { + foreach (var coreInstance in coreInstances.Values) + coreInstance.Dispose(); + coreInstances.Clear(); + } + } //------------------------------------------------------------------- // Properties. + public static SbmApplication_Control Instance { get { return appInstance; } } // Application Configuration. public override Net.Core.Web.App.SbmAppConfig AppConfig { get { return appConfigs.Values.ToList().getConfigForApplication(); } } @@ -128,12 +174,13 @@ namespace Sarand.BusinessMgr.Web.Control.App { return new List(coreInstances.Values.Select(item => item.SessionContext)); } + /// /// Identify the Core session context by the Repository Id. /// If context not yet defined for Repository, load and then return index. /// If repository not found, return 0. /// - public ushort GetCoreSessionIndexForControlRepository(SysId ownerId, SysId repositoryId) + public ushort GetCoreSessionIndexForControlRepository(SysId repositoryId) { using (DisposableCollection disposables = new DisposableCollection()) { @@ -145,19 +192,11 @@ namespace Sarand.BusinessMgr.Web.Control.App SbmcRepository repository = instanceMgr.GetRepositoryById(repositoryId); if (repository != null) { - // Core database connection. - SacsDatabaseConsole.OdbcConfig odbcConfig = SbmCoreInstanceConsole_Dbas.GetRepositoryOdbcConfig(repository); - SacsDatabase busMgrDatabase = SacsDatabaseConsole.OpenOdbcDatabase(odbcConfig); - if (busMgrDatabase.HasErrorState()) - SaLogger.Warn($"{SysUtil.Fn} BusMgr Database: " + busMgrDatabase.DatabaseName + ". Initialisation error: " + busMgrDatabase.ErrorStateMessage); - // Session context. ushort sessionContextIdx = sessionContextIdx_Next++; if (sessionContextIdx_Control < 1) sessionContextIdx_Control = sessionContextIdx; - CoreInstanceContextData sessionContextData = new CoreInstanceContextData(new SbmSessionContext_Web(sessionContextIdx, Sbm.Application.WebControl), ownerId, repositoryId); - sessionContextData.RepositoryContexts.Add(repository.Context); - sessionContextData.BusMgrDatabase = busMgrDatabase; + CoreInstanceContextData sessionContextData = new CoreInstanceContextData(new SbmSessionContext_Web(sessionContextIdx, Sbm.Application.WebControl), repository); coreInstances.Add(sessionContextData.SessionContext.Index, sessionContextData); return sessionContextData.SessionContext.Index; } @@ -165,6 +204,18 @@ namespace Sarand.BusinessMgr.Web.Control.App return 0; } + /// + /// Refresh the session context properties for the specified repository. + /// + /// + public void RefreshInstanceSessionProperties(SbmcRepository repository) + { + // Find session context and refresh repository properties. + CoreInstanceContextData sessionContext = coreInstances.Values.FirstOrDefault(item => item.ControlRepositoryId.Equals(repository.Id)); + if (sessionContext != null) + sessionContext.RefreshRepository(repository); + } + // Databases. public override ISacsDatabase GetControlDatabase() { return controlDatabase; } public override ISacsDatabase GetTemplateDatabase() { return templateDatabase; } @@ -172,9 +223,12 @@ namespace Sarand.BusinessMgr.Web.Control.App { return coreInstances.GetValue(sessionContext.Index, null)?.RepositoryContexts ?? new HashSet(); } - public override ISacsDatabase GetBusMgrDatabase(SbmSessionContext sessionContext) + public override ISacsDatabase CreateBusMgrDatabase(SbmSessionContext sessionContext) { - return coreInstances.GetValue(sessionContext.Index, null)?.BusMgrDatabase; + ISacsDatabase busMgrDatabase = SacsDatabaseConsole.OpenOdbcDatabase(coreInstances.GetValue(sessionContext.Index, null)?.OdbcConfig); + if (busMgrDatabase.HasErrorState()) + SaLogger.Warn($"{SysUtil.Fn} BusMgr Database: " + busMgrDatabase.DatabaseName + ". Initialisation error: " + busMgrDatabase.ErrorStateMessage); + return busMgrDatabase; } // Instance configuration. public override SbmInstanceConfig GetInstanceConfig(SbmSessionContext sessionContext) @@ -196,7 +250,6 @@ namespace Sarand.BusinessMgr.Web.Control.App //------------------------------------------------------------------- // Consoles. - //------------------------------------------------------------------- public static SbmEmailConsole_Control CreateEmailConsole_Control(SbmEmailConfig emailConfig) { @@ -205,6 +258,7 @@ namespace Sarand.BusinessMgr.Web.Control.App //------------------------------------------------------------------- // Initialisation. + /// Initialise environment - from Startup. internal void InitWebHostEnvironment(IWebHostEnvironment env) { @@ -308,6 +362,7 @@ namespace Sarand.BusinessMgr.Web.Control.App //------------------------------------------------------------------- // Generate database definition. + private void GenerateDatabaseDefinition(SbmDbDfnGenerator.DatabaseInstance dbInstance, ISacsDatabase db) { if (!SbmSystem.DebugMode) return; @@ -317,6 +372,7 @@ namespace Sarand.BusinessMgr.Web.Control.App // Generate database definitions. GenerateDatabaseDefinition(dbInstance, db.ConnectionString); } + private void GenerateDatabaseDefinition(SbmDbDfnGenerator.DatabaseInstance dbInstance, String connectionString) { if (!SbmSystem.DebugMode) return; @@ -328,6 +384,22 @@ namespace Sarand.BusinessMgr.Web.Control.App //SaUpdateLogDbDfnGenerator.Generate(database.ConnectionString); } + //------------------------------------------------------------------- + // Housekeeping. + + private class HousekeepingConfig + { + } + private HousekeepingConfig housekeepingConfig = new HousekeepingConfig(); + + /// + /// Perform periodic application housekeeping. + /// + public override void DoHousekeeping(CancellationToken ct) + { + SaLogger.Info($"{SysUtil.Fn} Doing housekeeping.", true); + } + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaBusinessMgrCoreWebControl/Control/App/SbmStartup_Control.cs b/SaBusinessMgrCoreWebControl/Control/App/SbmStartup_Control.cs index 5881333..52d52a6 100644 --- a/SaBusinessMgrCoreWebControl/Control/App/SbmStartup_Control.cs +++ b/SaBusinessMgrCoreWebControl/Control/App/SbmStartup_Control.cs @@ -1,15 +1,10 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Sarand.BusinessMgr.Net.Core.Web.App; using Sarand.BusinessMgr.Net.Standard.Base.App; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace Sarand.BusinessMgr.Web.Control.App { @@ -28,6 +23,14 @@ namespace Sarand.BusinessMgr.Web.Control.App // Initialise application. application = new SbmApplication_Control(Configuration); } + protected override void Dispose(bool disposing) + { + if (disposing) + { + application.Dispose(); + } + base.Dispose(disposing); + } //------------------------------------------------------------------- // This method gets called by the runtime. Use this method to add services to the container. diff --git a/SaBusinessMgrCoreWebControl/Control/Consoles/SbmCoreInstanceConsole_Control.cs b/SaBusinessMgrCoreWebControl/Control/Consoles/SbmCoreInstanceConsole_Control.cs index 442f91f..bd38a26 100644 --- a/SaBusinessMgrCoreWebControl/Control/Consoles/SbmCoreInstanceConsole_Control.cs +++ b/SaBusinessMgrCoreWebControl/Control/Consoles/SbmCoreInstanceConsole_Control.cs @@ -1,20 +1,8 @@ -using Sarand.BusinessMgr.Net.Core.Web.App; -using Sarand.BusinessMgr.Net.Standard.Base.App; +using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control; -using Sarand.BusinessMgr.Net.Standard.Base.Consoles; -using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Dbas.Consoles; using Sarand.BusinessMgr.Web.Control.App; -using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; -using Sarand.Net.Standard.Base.Core; -using Sarand.Net.Standard.Base.Dbas; -using Sarand.Net.Standard.Base.Security; -using Sarand.Net.Standard.Base.Utils; -using Sarand.Net.Standard.Dbas.Base; -using System; -using System.Collections.Generic; -using System.Linq; namespace Sarand.BusinessMgr.Web.Control.Consoles { @@ -42,6 +30,8 @@ namespace Sarand.BusinessMgr.Web.Control.Consoles mbr.OwnerId = repository.OwnerId; mbr.RepositoryId = repository.Id; this.SessionData_Control = sessionData_Control; + // In case Repository definition has changed since Instance was registered with Application. + App_Control.RefreshInstanceSessionProperties(repository); } protected override void Dispose(bool disposing) { @@ -64,7 +54,7 @@ namespace Sarand.BusinessMgr.Web.Control.Consoles /// Core internals for accessing core managers etc. protected SbmInternals CreateCoreInternals() { - ushort sessionIndex = App_Control.GetCoreSessionIndexForControlRepository(mbr.OwnerId, mbr.RepositoryId); + ushort sessionIndex = App_Control.GetCoreSessionIndexForControlRepository(mbr.RepositoryId); SbmSessionContext sessionContext = App_Control.GetSessionContextByIndex(sessionIndex); return new SbmInternals(sessionContext); } diff --git a/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryController-Ajax.cs b/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryController-Ajax.cs index 9fac593..097ebb0 100644 --- a/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryController-Ajax.cs +++ b/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryController-Ajax.cs @@ -20,7 +20,7 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance // Definitions. // Repository data. - private class RepositoryListData : AjaxResponse_Data.ItemData_Base + internal class RepositoryListData : AjaxResponse_Data.ItemData_Base { public String OwnerName { get; set; } public String Context { get; set; } @@ -28,12 +28,12 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance public String InstanceName { get; set; } public String DatabaseName { get; set; } } - private class RepositoryItemData : RepositoryListData + internal class RepositoryItemData : RepositoryListData { public String OwnerId { get; set; } public String UserName { get; set; } } - private void PopulateRepositoryResponseListData(SbmModel_Control model, RepositoryListData data, SbmcOwner owner, SbmcRepository repository) + internal static void PopulateRepositoryResponseListData(SbmModel_Control model, RepositoryListData data, SbmcOwner owner, SbmcRepository repository) { data.Id = SysId.ToString(repository.Id); data.OwnerName = owner.Name; @@ -44,7 +44,7 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance data.StatusCode = repository.StatusCode; data.StatusDesc = repository.StatusDesc; } - private void PopulateRepositoryResponseItemData(SbmModel_Control model, RepositoryItemData data, SbmcOwner owner, SbmcRepository repository) + internal static void PopulateRepositoryResponseItemData(SbmModel_Control model, RepositoryItemData data, SbmcOwner owner, SbmcRepository repository) { PopulateRepositoryResponseListData(model, data, owner, repository); data.OwnerId = SysId.ToString(repository.OwnerId); @@ -147,7 +147,7 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance // Construction. public AjaxResponse_Repository(SbmModel_Control model) : base(model) { } // Repository details. - public RepositoryItemData repository { get; } = new RepositoryItemData(); + public RepositoryItemData repository { get; } = new(); } //------------------------------------------------------------------- [HttpPost] @@ -367,6 +367,8 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ControlInstanceMgr.ErrorStateMessage)); } responseData.SetNotification(messageTitle, Localiser["msg.item.updated"]); + // In case Repository definition has changed since Instance was registered with Application. + App_Control.RefreshInstanceSessionProperties(repository); } // Construct response. diff --git a/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryInitController-Ajax.cs b/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryInitController-Ajax.cs index 6ef88bc..738439a 100644 --- a/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryInitController-Ajax.cs +++ b/SaBusinessMgrCoreWebControl/Control/Controllers/Instance/RepositoryInitController-Ajax.cs @@ -1,11 +1,9 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Sarand.BusinessMgr.Net.Core.Web.App; -using Sarand.BusinessMgr.Net.Core.Web.Consoles; using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control; -using Sarand.BusinessMgr.Net.Standard.Base.Consoles; using Sarand.BusinessMgr.Net.Standard.Base.Data; using Sarand.BusinessMgr.Web.Control.Components; using Sarand.BusinessMgr.Web.Control.Consoles; @@ -13,7 +11,6 @@ using Sarand.BusinessMgr.Web.Control.Models.Instance; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; -using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Security; using Sarand.Net.Standard.Base.Utils; using System; @@ -198,6 +195,8 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance { // Construction. public AjaxResponse_RepositoryInitialise(SbmModel_Control model) : base(model) { } + // Repository details - to mimic response from GetRepositoryList. + public RepositoryController.RepositoryListData Repository { get; } = new(); } [HttpPost] [Route("Instance/Repository/Ajax/Initialise")] @@ -228,6 +227,12 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance SaLogger.Warn($"{SysUtil.Fn} Repository does not exist. Id: {repositoryId}."); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); } + SbmcOwner owner = ControlInstanceMgr.GetOwnerById(repository.OwnerId); + if (owner == null) + { + SaLogger.Warn($"{SysUtil.Fn} Owner does not exist. Id: {repository.OwnerId}."); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); + } // Core Instance Console. SbmCoreInstanceConsole_Control instanceConsole = new SbmCoreInstanceConsole_Control(SessionData_Control, repository); @@ -397,6 +402,7 @@ namespace Sarand.BusinessMgr.Web.Control.Controllers.Instance return Json(responseData.SetMessage(messageTitle, repositoryConsole.ErrorStateMessage)); // Complete response. + RepositoryController.PopulateRepositoryResponseListData(model, responseData.Repository, owner, repository); responseData.Success = true; } return Json(responseData); diff --git a/SaBusinessMgrCoreWebControl/Views/Account/UserAccount/Index.cshtml b/SaBusinessMgrCoreWebControl/Views/Account/UserAccount/Index.cshtml index 7715dc9..178a2a1 100644 --- a/SaBusinessMgrCoreWebControl/Views/Account/UserAccount/Index.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Account/UserAccount/Index.cshtml @@ -40,10 +40,13 @@ @* Filter Panel *@
-
-
@Localiser["label.search"]
-
- @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" }) +
+
+
+
@Localiser["label.search"]
+
+ @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch sbc-input", @maxlength = "32" }) +
diff --git a/SaBusinessMgrCoreWebControl/Views/Instance/Owner/Index.cshtml b/SaBusinessMgrCoreWebControl/Views/Instance/Owner/Index.cshtml index 74de6e4..b854b0e 100644 --- a/SaBusinessMgrCoreWebControl/Views/Instance/Owner/Index.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Instance/Owner/Index.cshtml @@ -40,10 +40,14 @@ @* Filter Panel *@
-
-
@Localiser["label.search"]
-
- @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" }) +
+
+
+
+
@Localiser["label.search"]
+
+ @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch sbc-input", @maxlength = "32" }) +
diff --git a/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Schema.cshtml b/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Schema.cshtml index d8d35c5..c4d6349 100644 --- a/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Schema.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Schema.cshtml @@ -41,16 +41,18 @@
@Html.HiddenFor(model => model.DatabaseFilter.Instance, new { @id = "", @class = "FilterInstance" })
-
+
@Localiser["label.context"]
- @Html.DropDownListFor(model => model.DatabaseFilter.Context, Model.GetInstanceContextsForSelect(), "", new { @id = "", @class = "FilterContext" }) + @Html.DropDownListFor(model => model.DatabaseFilter.Context, Model.GetInstanceContextsForSelect(), "", new { @id = "", @class = "FilterContext sbc-select" })
-
+
+
+
@Localiser["label.search"]
- @Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" }) + @Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @type = "search", @id = "", @class = "FilterSearch sbc-input", @maxlength = "32" })
diff --git a/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Tables.cshtml b/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Tables.cshtml index b5aee11..a14157f 100644 --- a/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Tables.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Database/Tables.cshtml @@ -38,16 +38,18 @@ @* Filter Panel *@
-
+
@Localiser["label.context"]
- @Html.DropDownListFor(model => model.DatabaseFilter.Context, Model.GetInstanceContextsForSelect(), "", new { @id = "", @class = "FilterContext" }) + @Html.DropDownListFor(model => model.DatabaseFilter.Context, Model.GetInstanceContextsForSelect(), "", new { @id = "", @class = "FilterContext sbc-select" })
-
+
+
+
@Localiser["label.search"]
- @Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" }) + @Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @type = "search", @id = "", @class = "FilterSearch sbc-input", @maxlength = "32" })
diff --git a/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Index.cshtml b/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Index.cshtml index fbf8553..ba8b580 100644 --- a/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Index.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Instance/Repository/Index.cshtml @@ -41,10 +41,14 @@ @* Filter Panel *@
-
-
@Localiser["label.search"]
-
- @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch", @maxlength = "32" }) +
+
+
+
+
@Localiser["label.search"]
+
+ @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch sbc-input", @maxlength = "32" }) +
diff --git a/SaBusinessMgrCoreWebControl/Views/Param/Param/Index.cshtml b/SaBusinessMgrCoreWebControl/Views/Param/Param/Index.cshtml index 1484082..ccfda58 100644 --- a/SaBusinessMgrCoreWebControl/Views/Param/Param/Index.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Param/Param/Index.cshtml @@ -43,16 +43,16 @@ @* Filter Panel *@
-
+
@Localiser["label.item"]
-
- @Html.DropDownListFor(model => model.Filter.ItemType, Model.GetParamItemTypesForSelect(), new { @id = "", @class = "FilterItemType mr-1" }) +
+ @Html.DropDownListFor(model => model.Filter.ItemType, Model.GetParamItemTypesForSelect(), new { @id = "", @class = "FilterItemType sbc-select" })
-
- +
+
@@ -63,7 +63,7 @@
@Localiser["label.search"]
- @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch fullwidth", @maxlength = "32" }) + @Html.TextBoxFor(model => model.Filter.Search, new { @type = "search", @id = "", @class = "FilterSearch sbc-input fullwidth", @maxlength = "32" })
diff --git a/SaBusinessMgrCoreWebControl/Views/Shared/_Layout.cshtml b/SaBusinessMgrCoreWebControl/Views/Shared/_Layout.cshtml index 50e2489..badcc28 100644 --- a/SaBusinessMgrCoreWebControl/Views/Shared/_Layout.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Shared/_Layout.cshtml @@ -41,6 +41,7 @@ crossorigin="anonymous" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" /> + diff --git a/SaBusinessMgrCoreWebControl/Views/System/Logs.cshtml b/SaBusinessMgrCoreWebControl/Views/System/Logs.cshtml index 425dbe2..b266637 100644 --- a/SaBusinessMgrCoreWebControl/Views/System/Logs.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/System/Logs.cshtml @@ -6,6 +6,11 @@ }