The purpose of this upgrade is to improve the user experience when using the Admin tool to Update ROs. Currently for larger RO dbs (like Barakah) we can run up against memory constraints that do not allow all the ROs to be updated at one time. This is based upon some initial resource where some places were identified where we could improve memory usage. Some of these should benefit PROMS as a whole while others will be specific to the RO Update option in Admin Tools.
401 lines
15 KiB
C#
401 lines
15 KiB
C#
// ========================================================================
|
|
// Copyright 2007 - Volian Enterprises, Inc. All rights reserved.
|
|
// Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
|
|
// ------------------------------------------------------------------------
|
|
// $Workfile: $ $Revision: $
|
|
// $Author: $ $Date: $
|
|
//
|
|
// $History: $
|
|
// ========================================================================
|
|
|
|
using System;
|
|
using System.Data;
|
|
using System.Data.SqlClient;
|
|
using Csla;
|
|
using Csla.Data;
|
|
using System.Configuration;
|
|
using System.IO;
|
|
using System.ComponentModel;
|
|
using System.Collections.Generic;
|
|
namespace VEPROMS.CSLA.Library
|
|
{
|
|
public delegate void ConnectionInfoEvent(object sender);
|
|
/// <summary>
|
|
/// ConnectionInfo Generated by MyGeneration using the CSLA Object Mapping template
|
|
/// </summary>
|
|
[Serializable()]
|
|
[TypeConverter(typeof(ConnectionInfoConverter))]
|
|
public partial class ConnectionInfo : ReadOnlyBase<ConnectionInfo>, IDisposable
|
|
{
|
|
public event ConnectionInfoEvent Changed;
|
|
private void OnChange()
|
|
{
|
|
if (Changed != null) Changed(this);
|
|
}
|
|
#region Log4Net
|
|
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
#endregion
|
|
#region Collection
|
|
private static List<ConnectionInfo> _CacheList = new List<ConnectionInfo>();
|
|
protected static void AddToCache(ConnectionInfo connectionInfo)
|
|
{
|
|
if (!_CacheList.Contains(connectionInfo)) _CacheList.Add(connectionInfo); // In AddToCache
|
|
}
|
|
protected static void RemoveFromCache(ConnectionInfo connectionInfo)
|
|
{
|
|
while (_CacheList.Contains(connectionInfo)) _CacheList.Remove(connectionInfo); // In RemoveFromCache
|
|
}
|
|
private static Dictionary<string, List<ConnectionInfo>> _CacheByPrimaryKey = new Dictionary<string, List<ConnectionInfo>>();
|
|
private static void ConvertListToDictionary()
|
|
{
|
|
List<ConnectionInfo> remove = new List<ConnectionInfo>();
|
|
foreach (ConnectionInfo tmp in _CacheList)
|
|
{
|
|
if (!_CacheByPrimaryKey.ContainsKey(tmp.DBID.ToString()))
|
|
{
|
|
_CacheByPrimaryKey[tmp.DBID.ToString()] = new List<ConnectionInfo>(); // Add new list for PrimaryKey
|
|
}
|
|
_CacheByPrimaryKey[tmp.DBID.ToString()].Add(tmp); // Add to Primary Key list
|
|
remove.Add(tmp);
|
|
}
|
|
foreach (ConnectionInfo tmp in remove)
|
|
RemoveFromCache(tmp);
|
|
}
|
|
internal static void AddList(ConnectionInfoList lst)
|
|
{
|
|
foreach (ConnectionInfo item in lst) AddToCache(item);
|
|
}
|
|
protected static ConnectionInfo GetCachedByPrimaryKey(int dbid)
|
|
{
|
|
ConvertListToDictionary();
|
|
string key = dbid.ToString();
|
|
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
|
|
return null;
|
|
}
|
|
#endregion
|
|
#region Business Methods
|
|
private string _ErrorMessage = string.Empty;
|
|
public string ErrorMessage
|
|
{
|
|
get { return _ErrorMessage; }
|
|
}
|
|
protected Connection _Editable;
|
|
private IVEHasBrokenRules HasBrokenRules
|
|
{
|
|
get
|
|
{
|
|
IVEHasBrokenRules hasBrokenRules = null;
|
|
if (_Editable != null)
|
|
hasBrokenRules = _Editable.HasBrokenRules;
|
|
return hasBrokenRules;
|
|
}
|
|
}
|
|
private int _DBID;
|
|
[System.ComponentModel.DataObjectField(true, true)]
|
|
public int DBID
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _DBID;
|
|
}
|
|
}
|
|
private string _Name = string.Empty;
|
|
public string Name
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _Name;
|
|
}
|
|
}
|
|
private string _Title = string.Empty;
|
|
public string Title
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _Title;
|
|
}
|
|
}
|
|
private string _ConnectionString = string.Empty;
|
|
public string ConnectionString
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _ConnectionString;
|
|
}
|
|
}
|
|
private int _ServerType;
|
|
/// <summary>
|
|
/// 0 SQL Server
|
|
/// </summary>
|
|
public int ServerType
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _ServerType;
|
|
}
|
|
}
|
|
private string _Config = string.Empty;
|
|
public string Config
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _Config;
|
|
}
|
|
}
|
|
private DateTime _DTS = new DateTime();
|
|
public DateTime DTS
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _DTS;
|
|
}
|
|
}
|
|
private string _UsrID = string.Empty;
|
|
public string UsrID
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _UsrID;
|
|
}
|
|
}
|
|
private int _ConnectionFolderCount = 0;
|
|
/// <summary>
|
|
/// Count of ConnectionFolders for this Connection
|
|
/// </summary>
|
|
public int ConnectionFolderCount
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
return _ConnectionFolderCount;
|
|
}
|
|
}
|
|
private FolderInfoList _ConnectionFolders = null;
|
|
[TypeConverter(typeof(FolderInfoListConverter))]
|
|
public FolderInfoList ConnectionFolders
|
|
{
|
|
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
|
|
get
|
|
{
|
|
if (_ConnectionFolderCount < 0 || (_ConnectionFolderCount > 0 && _ConnectionFolders == null))
|
|
_ConnectionFolders = FolderInfoList.GetByDBID(_DBID);
|
|
if (_ConnectionFolderCount < 0)
|
|
_ConnectionFolderCount = _ConnectionFolders.Count;
|
|
return _ConnectionFolders;
|
|
}
|
|
}
|
|
public void RefreshConnectionFolders()
|
|
{
|
|
ConvertListToDictionary();
|
|
if (_CacheByPrimaryKey.ContainsKey(_DBID.ToString()))
|
|
foreach (ConnectionInfo tmp in _CacheByPrimaryKey[_DBID.ToString()])
|
|
tmp._ConnectionFolderCount = -1; // This will cause the data to be requeried
|
|
}
|
|
// TODO: Replace base ConnectionInfo.ToString function as necessary
|
|
/// <summary>
|
|
/// Overrides Base ToString
|
|
/// </summary>
|
|
/// <returns>A string representation of current ConnectionInfo</returns>
|
|
//public override string ToString()
|
|
//{
|
|
// return base.ToString();
|
|
//}
|
|
// TODO: Check ConnectionInfo.GetIdValue to assure that the ID returned is unique
|
|
/// <summary>
|
|
/// Overrides Base GetIdValue - Used internally by CSLA to determine equality
|
|
/// </summary>
|
|
/// <returns>A Unique ID for the current ConnectionInfo</returns>
|
|
protected override object GetIdValue()
|
|
{
|
|
return _DBID;
|
|
}
|
|
#endregion
|
|
#region Factory Methods
|
|
private static int _ConnectionInfoUnique = 0;
|
|
private static int ConnectionInfoUnique
|
|
{ get { return ++_ConnectionInfoUnique; } }
|
|
private int _MyConnectionInfoUnique = ConnectionInfoUnique;
|
|
public int MyConnectionInfoUnique
|
|
{ get { return _MyConnectionInfoUnique; } }
|
|
protected ConnectionInfo()
|
|
{/* require use of factory methods */
|
|
AddToCache(this);
|
|
}
|
|
public void Dispose()
|
|
{
|
|
RemoveFromCache(this);
|
|
if (!_CacheByPrimaryKey.ContainsKey(DBID.ToString())) return;
|
|
List<ConnectionInfo> listConnectionInfo = _CacheByPrimaryKey[DBID.ToString()]; // Get the list of items
|
|
while (listConnectionInfo.Contains(this)) listConnectionInfo.Remove(this); // Remove the item from the list
|
|
if (listConnectionInfo.Count == 0) // If there are no items left in the list
|
|
_CacheByPrimaryKey.Remove(DBID.ToString()); // remove the list
|
|
}
|
|
public virtual Connection Get()
|
|
{
|
|
return _Editable = Connection.Get(_DBID);
|
|
}
|
|
public static void Refresh(Connection tmp)
|
|
{
|
|
string key = tmp.DBID.ToString();
|
|
ConvertListToDictionary();
|
|
if (_CacheByPrimaryKey.ContainsKey(key))
|
|
foreach (ConnectionInfo tmpInfo in _CacheByPrimaryKey[key])
|
|
tmpInfo.RefreshFields(tmp);
|
|
}
|
|
protected virtual void RefreshFields(Connection tmp)
|
|
{
|
|
_Name = tmp.Name;
|
|
_Title = tmp.Title;
|
|
_ConnectionString = tmp.ConnectionString;
|
|
_ServerType = tmp.ServerType;
|
|
_Config = tmp.Config;
|
|
_DTS = tmp.DTS;
|
|
_UsrID = tmp.UsrID;
|
|
_ConnectionInfoExtension.Refresh(this);
|
|
OnChange();// raise an event
|
|
}
|
|
public static ConnectionInfo Get(int dbid)
|
|
{
|
|
//if (!CanGetObject())
|
|
// throw new System.Security.SecurityException("User not authorized to view a Connection");
|
|
try
|
|
{
|
|
ConnectionInfo tmp = GetCachedByPrimaryKey(dbid);
|
|
if (tmp == null)
|
|
{
|
|
tmp = DataPortal.Fetch<ConnectionInfo>(new PKCriteria(dbid));
|
|
AddToCache(tmp);
|
|
}
|
|
if (tmp.ErrorMessage == "No Record Found")
|
|
{
|
|
tmp.Dispose(); // Clean-up ConnectionInfo
|
|
tmp = null;
|
|
}
|
|
return tmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new DbCslaException("Error on ConnectionInfo.Get", ex);
|
|
}
|
|
}
|
|
#endregion
|
|
#region Data Access Portal
|
|
internal ConnectionInfo(SafeDataReader dr)
|
|
{
|
|
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ConnectionInfo.Constructor", GetHashCode());
|
|
try
|
|
{
|
|
ReadData(dr);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("ConnectionInfo.Constructor", ex);
|
|
throw new DbCslaException("ConnectionInfo.Constructor", ex);
|
|
}
|
|
}
|
|
[Serializable()]
|
|
protected class PKCriteria
|
|
{
|
|
private int _DBID;
|
|
public int DBID
|
|
{ get { return _DBID; } }
|
|
public PKCriteria(int dbid)
|
|
{
|
|
_DBID = dbid;
|
|
}
|
|
}
|
|
private void ReadData(SafeDataReader dr)
|
|
{
|
|
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ConnectionInfo.ReadData", GetHashCode());
|
|
try
|
|
{
|
|
_DBID = dr.GetInt32("DBID");
|
|
_Name = dr.GetString("Name");
|
|
_Title = dr.GetString("Title");
|
|
_ConnectionString = dr.GetString("ConnectionString");
|
|
_ServerType = dr.GetInt32("ServerType");
|
|
_Config = dr.GetString("Config");
|
|
_DTS = dr.GetDateTime("DTS");
|
|
_UsrID = dr.GetString("UsrID");
|
|
_ConnectionFolderCount = dr.GetInt32("FolderCount");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("ConnectionInfo.ReadData", ex);
|
|
_ErrorMessage = ex.Message;
|
|
throw new DbCslaException("ConnectionInfo.ReadData", ex);
|
|
}
|
|
}
|
|
private void DataPortal_Fetch(PKCriteria criteria)
|
|
{
|
|
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ConnectionInfo.DataPortal_Fetch", GetHashCode());
|
|
try
|
|
{
|
|
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
|
|
{
|
|
ApplicationContext.LocalContext["cn"] = cn;
|
|
using (SqlCommand cm = cn.CreateCommand())
|
|
{
|
|
cm.CommandType = CommandType.StoredProcedure;
|
|
cm.CommandText = "getConnection";
|
|
cm.Parameters.AddWithValue("@DBID", criteria.DBID);
|
|
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
|
|
{
|
|
if (!dr.Read())
|
|
{
|
|
_ErrorMessage = "No Record Found";
|
|
return;
|
|
}
|
|
ReadData(dr);
|
|
}
|
|
}
|
|
// removing of item only needed for local data portal
|
|
if (ApplicationContext.ExecutionLocation == ApplicationContext.ExecutionLocations.Client)
|
|
ApplicationContext.LocalContext.Remove("cn");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("ConnectionInfo.DataPortal_Fetch", ex);
|
|
_ErrorMessage = ex.Message;
|
|
throw new DbCslaException("ConnectionInfo.DataPortal_Fetch", ex);
|
|
}
|
|
}
|
|
#endregion
|
|
// Standard Refresh
|
|
#region extension
|
|
ConnectionInfoExtension _ConnectionInfoExtension = new ConnectionInfoExtension();
|
|
[Serializable()]
|
|
partial class ConnectionInfoExtension : extensionBase { }
|
|
[Serializable()]
|
|
class extensionBase
|
|
{
|
|
// Default Refresh
|
|
public virtual void Refresh(ConnectionInfo tmp) { }
|
|
}
|
|
#endregion
|
|
} // Class
|
|
#region Converter
|
|
internal class ConnectionInfoConverter : ExpandableObjectConverter
|
|
{
|
|
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
|
|
{
|
|
if (destType == typeof(string) && value is ConnectionInfo)
|
|
{
|
|
// Return the ToString value
|
|
return ((ConnectionInfo)value).ToString();
|
|
}
|
|
return base.ConvertTo(context, culture, value, destType);
|
|
}
|
|
}
|
|
#endregion
|
|
} // Namespace
|