using System; using System.Collections.Generic; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; namespace Sarand.Net.Standard.Base.UpdateLog { //======================================================================= public abstract class SaUpdateLogMgr : SacsItemMgr { //------------------------------------------------------------------- // Data members. private readonly Dictionary userNames = new Dictionary(); //------------------------------------------------------------------- // Static initialisation. static SaUpdateLogMgr () { } //------------------------------------------------------------------- // Construction. protected SaUpdateLogMgr (SaUpdateLogConsole updateLogConsole) { UpdateLogConsole = updateLogConsole; } //------------------------------------------------------------------- // Properties. protected SaUpdateLogConsole UpdateLogConsole { get; } public abstract bool DatabaseIsValid { get; } public abstract bool CanUpdateDatabase { get; } //******************************************************************* // U p d a t e L o g E n t r i e s //******************************************************************* // Retrieve individual update log entries. public abstract bool LogEntryExists (SaUpdateLogEntry logEntry); public abstract bool LogEntryExists (ItemId itemId, String attribute, DateTime logged); public abstract SaUpdateLogEntry GetLogEntry (ItemId itemId, String attribute, DateTime logged); // Create Update Log Entry. public abstract SaUpdateLogEntry CreateLogEntry (ItemId itemId, String attribute); //------------------------------------------------------------------- // Validate Update Log Entry. public bool IsValidLogEntry (SaUpdateLogEntry logEntry) { ClearErrorState(); if (logEntry == null) return SetErrorState(ErrorMessage.ItemNotSpecified); return IsValidLogEntryData(logEntry.GetData(), new SaUpdateLogEntry.ErrField()); } public virtual bool IsValidLogEntryData (SaUpdateLogEntry.Data logEntryData, SaUpdateLogEntry.ErrField errField) { ClearErrorState(); if ((int)logEntryData.ItemId.Type < 1) { errField.ItemType = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.ItemTypeNotSpecified); } if (!SysId.IsValid(logEntryData.ItemId.Id)) { errField.ItemId = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.ItemIdNotSpecified); } if (!IsValidValue(logEntryData.Attribute, "attribute", (long)SaUpdateLogDbDfn.GetColTextLen(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Attribute), true)) { errField.Attribute = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!IsValidValue(logEntryData.DataBefore, "data before", (long)SaUpdateLogDbDfn.GetColTextLen(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataBefore))) { errField.DataBefore = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!IsValidValue(logEntryData.DataAfter, "data after", (long)SaUpdateLogDbDfn.GetColTextLen(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataAfter))) { errField.DataAfter = SacsHierarchyItem.ValidValue.Invalid; return false; } // Common properties. if (!IsValidValue(logEntryData.Notes, "notes", (long)SaUpdateLogDbDfn.GetColTextLen(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Notes))) { errField.Notes = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!SaUpdateLogEntry.ValidStatuses.Contains(logEntryData.Status)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.InvalidStatus); } return true; } //------------------------------------------------------------------- // Update Log Entry database interface. public abstract bool LogUpdates (SaUpdateLogItemMonitor updateLogItemMonitor, DbUpdateInfo dbUpdateInfo); public abstract bool InsertLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo); public abstract bool UpdateLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo); public virtual bool LogEntryCanBeDeleted (SaUpdateLogEntry logEntry) { ClearErrorState(); return true; } public abstract bool DeleteLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo); public abstract bool ClearLogEntriesForItem (ItemId itemId, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Update Log Entry list. public abstract ColumnDfn GetLogEntryColumnDfn (SaUpdateLogEntry.Column columnId, String caption = "", int width = 0); public abstract List GetLogEntryQueryFilter (SaUpdateLogEntry.Params prm); public abstract long GetLogEntryCount (SaUpdateLogEntry.Params prm); public abstract List GetLogEntryList (SaUpdateLogEntry.Params prm); public abstract DbResultSet ExecuteLogEntryQuery (List columns, SaUpdateLogEntry.Params prm); //------------------------------------------------------------------- /// /// Extract and format result set data value where specific handling is required. /// Where response is an invalid data value, format value using column.FormatValue(values). /// public virtual DataValue GetLogEntryDataValue (ColumnDfn column, NamedValue.Map values) { DataValue value = new DataValue(); switch ((SaUpdateLogEntry.Column)column.Id) { //----------------------------------------------------------- // Item type. case SaUpdateLogEntry.Column.ItemType_Desc: { short itemType = (short)values.GetValue(column.DataName).AsLong(); value = new DataValue(itemType.ToString()); } break; //----------------------------------------------------------- // Data values. case SaUpdateLogEntry.Column.DataBefore: case SaUpdateLogEntry.Column.DataAfter: { value = new DataValue(values.GetValue(column.DataName).ToString()); String attribute = values.GetValue(GetLogEntryColumnDfn(SaUpdateLogEntry.Column.Attribute).DataName).ToString(); if (attribute.EqualsCI("Status")) value = new DataValue(SacsSystem.GetStatusDescForCode(value.ToString())); } break; //----------------------------------------------------------- // Notes. case SaUpdateLogEntry.Column.Notes: { value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200)); } break; //----------------------------------------------------------- // Status. case SaUpdateLogEntry.Column.Status_Desc: case SaUpdateLogEntry.Column.Status_Ind: { String statusCode = values.GetValue(column.DataName).ToString(); SaStatus status = SacsSystem.GetStatusForCode(statusCode); if (column.Id == (int)SaUpdateLogEntry.Column.Status_Desc) { String statusDesc = SacsSystem.GetStatusDescForCode(statusCode); value = new DataValue(statusDesc); } else if (column.Id == (int)SaUpdateLogEntry.Column.Status_Ind) { DataValue.TriStateType triState = DataValue.TriStateType.Unknown; if (status == SaStatus.Logged) triState = DataValue.TriStateType.Green; value = new DataValue(triState); } } break; //----------------------------------------------------------- // Notes. case SaUpdateLogEntry.Column.CreateBy_Name: { SysId userId = new SysId(StringUtil.ToInt(values.GetValue(GetLogEntryColumnDfn(SaUpdateLogEntry.Column.CreateBy).DataName).ToString())); String userName = SysId.ToString(userId); if (SysId.IsValid(userId) && !userNames.ContainsKey(userId)) { foreach (var userNameKV in UpdateLogConsole.GetNameForUserIds(new List { userId })) userNames.Add(userNameKV.Key, userNameKV.Value); } if (userNames.ContainsKey(userId)) userName = userNames[userId]; value = new DataValue(userName); } break; //----------------------------------------------------------- } return value; } //------------------------------------------------------------------- } //======================================================================= }