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.
392 lines
16 KiB
C#
392 lines
16 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
|
|
{
|
|
/// <summary>
|
|
/// ItemInfoList Generated by MyGeneration using the CSLA Object Mapping template
|
|
/// </summary>
|
|
[Serializable()]
|
|
[TypeConverter(typeof(ItemInfoListConverter))]
|
|
public partial class ItemInfoList : ReadOnlyListBase<ItemInfoList, ItemInfo>, ICustomTypeDescriptor, IDisposable
|
|
{
|
|
#region Log4Net
|
|
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
#endregion
|
|
#region Business Methods
|
|
internal new IList<ItemInfo> Items
|
|
{ get { return base.Items; } }
|
|
public void AddEvents()
|
|
{
|
|
foreach (ItemInfo tmp in this)
|
|
{
|
|
tmp.Changed += new ItemInfoEvent(tmp_Changed);
|
|
tmp.Deleted += new ItemInfoEvent(tmp_Deleted);
|
|
}
|
|
}
|
|
private bool _RefreshingList = false;
|
|
public bool RefreshingList
|
|
{
|
|
get { return _RefreshingList; }
|
|
set { _RefreshingList = value; }
|
|
}
|
|
void tmp_Deleted(object sender)
|
|
{
|
|
ItemInfo ii = sender as ItemInfo;
|
|
if (ii != null)
|
|
{
|
|
RefreshingList = true;
|
|
IsReadOnly = false;
|
|
Remove(ii);
|
|
IsReadOnly = true;
|
|
this.OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, 0));
|
|
RefreshingList = false;
|
|
}
|
|
}
|
|
// sender can be either the current item changed, or the current item with one added before it (when an item is inserted)
|
|
void tmp_Changed(object sender)
|
|
{
|
|
for (int i = 0; i < Count; i++)
|
|
{
|
|
if (base[i] == sender)
|
|
{
|
|
// Added insert to fix when item is replaced and a 'delete' is done, the item needs inserted. Note
|
|
// that when text is modified, i.e. 'Changed', this code is not executed. Fixed B2016-130.
|
|
RefreshingList = true;
|
|
IsReadOnly = false;
|
|
// the following checks to see if the previous is this one, and if so, it is not an insert it is a change
|
|
// On an insert, inserting from 'sender', MyPrevious is set as the new item.
|
|
if (SourceOfList != "Search" && (sender as ItemInfo).MyPrevious != null && i > 0 && base[i - 1].ItemID != (sender as ItemInfo).MyPrevious.ItemID)
|
|
Items.Insert(i, (sender as ItemInfo).MyPrevious);
|
|
IsReadOnly = true;
|
|
this.OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, i));
|
|
RefreshingList = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
private string _SourceOfList;
|
|
public string SourceOfList
|
|
{
|
|
get { return _SourceOfList; }
|
|
set { _SourceOfList = value; }
|
|
}
|
|
//private void ShowList(string txt)
|
|
//{
|
|
// Console.WriteLine("\r\n{0} - {1} - {2}: i, base[i].Ordinal, base[i].ItemID, base[i].DisplayText", txt, Count, SourceOfList);
|
|
// for (int i = 0; i < Count; i++)
|
|
// {
|
|
// Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}", i, base[i].Ordinal, base[i].ItemID, base[i].DisplayText, base[i].MyItemInfoUnique, base[i].Disposed);
|
|
// }
|
|
//}
|
|
private bool _Disposed = false;
|
|
private static int _CountCreated = 0;
|
|
private static int _CountDisposed = 0;
|
|
private static int _CountFinalized = 0;
|
|
private static int IncrementCountCreated
|
|
{ get { return ++_CountCreated; } }
|
|
private int _CountWhenCreated = IncrementCountCreated;
|
|
public static int CountCreated
|
|
{ get { return _CountCreated; } }
|
|
public static int CountNotDisposed
|
|
{ get { return _CountCreated - _CountDisposed; } }
|
|
public static int CountNotFinalized
|
|
{ get { return _CountCreated - _CountFinalized; } }
|
|
~ItemInfoList()
|
|
{
|
|
_CountFinalized++;
|
|
}
|
|
public void Dispose()
|
|
{
|
|
if (_Disposed) return;
|
|
_Disposed = true;
|
|
_CountDisposed++;
|
|
foreach (ItemInfo tmp in this)
|
|
{
|
|
tmp.Changed -= tmp_Changed;
|
|
tmp.Deleted -= tmp_Deleted;
|
|
}
|
|
}
|
|
#endregion
|
|
#region Factory Methods
|
|
public static ItemInfoList _ItemInfoList = null;
|
|
/// <summary>
|
|
/// Return a list of all ItemInfo.
|
|
/// </summary>
|
|
public static ItemInfoList Get()
|
|
{
|
|
try
|
|
{
|
|
if (_ItemInfoList != null)
|
|
return _ItemInfoList;
|
|
ItemInfoList tmp = DataPortal.Fetch<ItemInfoList>();
|
|
ItemInfo.AddList(tmp);
|
|
tmp.AddEvents();
|
|
_ItemInfoList = tmp;
|
|
return tmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new DbCslaException("Error on ItemInfoList.Get", ex);
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Reset the list of all ItemInfo.
|
|
/// </summary>
|
|
public static void Reset()
|
|
{
|
|
_ItemInfoList = null;
|
|
}
|
|
// CSLATODO: Add alternative gets -
|
|
//public static ItemInfoList Get(<criteria>)
|
|
//{
|
|
// try
|
|
// {
|
|
// return DataPortal.Fetch<ItemInfoList>(new FilteredCriteria(<criteria>));
|
|
// }
|
|
// catch (Exception ex)
|
|
// {
|
|
// throw new DbCslaException("Error on ItemInfoList.Get", ex);
|
|
// }
|
|
//}
|
|
public static ItemInfoList GetNext(int? previousID)
|
|
{
|
|
try
|
|
{
|
|
ItemInfoList tmp = DataPortal.Fetch<ItemInfoList>(new PreviousIDCriteria(previousID));
|
|
ItemInfo.AddList(tmp);
|
|
tmp.AddEvents();
|
|
return tmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new DbCslaException("Error on ItemInfoList.GetNext", ex);
|
|
}
|
|
}
|
|
public static ItemInfoList GetByContentID(int contentID)
|
|
{
|
|
try
|
|
{
|
|
ItemInfoList tmp = DataPortal.Fetch<ItemInfoList>(new ContentIDCriteria(contentID));
|
|
ItemInfo.AddList(tmp);
|
|
tmp.AddEvents();
|
|
return tmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new DbCslaException("Error on ItemInfoList.GetByContentID", ex);
|
|
}
|
|
}
|
|
private ItemInfoList()
|
|
{ /* require use of factory methods */ }
|
|
#endregion
|
|
#region Data Access Portal
|
|
private void DataPortal_Fetch()
|
|
{
|
|
this.RaiseListChangedEvents = false;
|
|
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ItemInfoList.DataPortal_Fetch", GetHashCode());
|
|
try
|
|
{
|
|
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
|
|
{
|
|
using (SqlCommand cm = cn.CreateCommand())
|
|
{
|
|
cm.CommandType = CommandType.StoredProcedure;
|
|
cm.CommandText = "getItems";
|
|
cm.CommandTimeout = Database.DefaultTimeout;
|
|
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
|
|
{
|
|
IsReadOnly = false;
|
|
while (dr.Read()) this.Add(new ItemInfo(dr));
|
|
IsReadOnly = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfoList.DataPortal_Fetch", ex);
|
|
throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex);
|
|
}
|
|
this.RaiseListChangedEvents = true;
|
|
}
|
|
[Serializable()]
|
|
private class PreviousIDCriteria
|
|
{
|
|
public PreviousIDCriteria(int? previousID)
|
|
{
|
|
_PreviousID = previousID;
|
|
}
|
|
private int? _PreviousID;
|
|
public int? PreviousID
|
|
{
|
|
get { return _PreviousID; }
|
|
set { _PreviousID = value; }
|
|
}
|
|
}
|
|
private void DataPortal_Fetch(PreviousIDCriteria criteria)
|
|
{
|
|
this.RaiseListChangedEvents = false;
|
|
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ItemInfoList.DataPortal_FetchPreviousID", GetHashCode());
|
|
try
|
|
{
|
|
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
|
|
{
|
|
using (SqlCommand cm = cn.CreateCommand())
|
|
{
|
|
cm.CommandType = CommandType.StoredProcedure;
|
|
cm.CommandText = "getNextItems";
|
|
cm.Parameters.AddWithValue("@PreviousID", criteria.PreviousID);
|
|
cm.CommandTimeout = Database.DefaultTimeout;
|
|
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
|
|
{
|
|
IsReadOnly = false;
|
|
while (dr.Read()) this.Add(new ItemInfo(dr));
|
|
IsReadOnly = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfoList.DataPortal_FetchPreviousID", ex);
|
|
throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex);
|
|
}
|
|
this.RaiseListChangedEvents = true;
|
|
}
|
|
[Serializable()]
|
|
private class ContentIDCriteria
|
|
{
|
|
public ContentIDCriteria(int contentID)
|
|
{
|
|
_ContentID = contentID;
|
|
}
|
|
private int _ContentID;
|
|
public int ContentID
|
|
{
|
|
get { return _ContentID; }
|
|
set { _ContentID = value; }
|
|
}
|
|
}
|
|
private void DataPortal_Fetch(ContentIDCriteria criteria)
|
|
{
|
|
this.RaiseListChangedEvents = false;
|
|
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ItemInfoList.DataPortal_FetchContentID", GetHashCode());
|
|
try
|
|
{
|
|
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
|
|
{
|
|
using (SqlCommand cm = cn.CreateCommand())
|
|
{
|
|
cm.CommandType = CommandType.StoredProcedure;
|
|
cm.CommandText = "getItemsByContentID";
|
|
cm.Parameters.AddWithValue("@ContentID", criteria.ContentID);
|
|
cm.CommandTimeout = Database.DefaultTimeout;
|
|
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
|
|
{
|
|
IsReadOnly = false;
|
|
while (dr.Read()) this.Add(new ItemInfo(dr));
|
|
IsReadOnly = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfoList.DataPortal_FetchContentID", ex);
|
|
throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex);
|
|
}
|
|
this.RaiseListChangedEvents = true;
|
|
}
|
|
#endregion
|
|
#region ICustomTypeDescriptor impl
|
|
public String GetClassName()
|
|
{ return TypeDescriptor.GetClassName(this, true); }
|
|
public AttributeCollection GetAttributes()
|
|
{ return TypeDescriptor.GetAttributes(this, true); }
|
|
public String GetComponentName()
|
|
{ return TypeDescriptor.GetComponentName(this, true); }
|
|
public TypeConverter GetConverter()
|
|
{ return TypeDescriptor.GetConverter(this, true); }
|
|
public EventDescriptor GetDefaultEvent()
|
|
{ return TypeDescriptor.GetDefaultEvent(this, true); }
|
|
public PropertyDescriptor GetDefaultProperty()
|
|
{ return TypeDescriptor.GetDefaultProperty(this, true); }
|
|
public object GetEditor(Type editorBaseType)
|
|
{ return TypeDescriptor.GetEditor(this, editorBaseType, true); }
|
|
public EventDescriptorCollection GetEvents(Attribute[] attributes)
|
|
{ return TypeDescriptor.GetEvents(this, attributes, true); }
|
|
public EventDescriptorCollection GetEvents()
|
|
{ return TypeDescriptor.GetEvents(this, true); }
|
|
public object GetPropertyOwner(PropertyDescriptor pd)
|
|
{ return this; }
|
|
/// <summary>
|
|
/// Called to get the properties of this type. Returns properties with certain
|
|
/// attributes. this restriction is not implemented here.
|
|
/// </summary>
|
|
/// <param name="attributes"></param>
|
|
/// <returns></returns>
|
|
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
|
|
{ return GetProperties(); }
|
|
/// <summary>
|
|
/// Called to get the properties of this type.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public PropertyDescriptorCollection GetProperties()
|
|
{
|
|
// Create a collection object to hold property descriptors
|
|
PropertyDescriptorCollection pds = new PropertyDescriptorCollection(null);
|
|
// Iterate the list
|
|
for (int i = 0; i < this.Items.Count; i++)
|
|
{
|
|
// Create a property descriptor for the item and add to the property descriptor collection
|
|
ItemInfoListPropertyDescriptor pd = new ItemInfoListPropertyDescriptor(this, i);
|
|
pds.Add(pd);
|
|
}
|
|
// return the property descriptor collection
|
|
return pds;
|
|
}
|
|
#endregion
|
|
} // Class
|
|
#region Property Descriptor
|
|
/// <summary>
|
|
/// Summary description for CollectionPropertyDescriptor.
|
|
/// </summary>
|
|
public partial class ItemInfoListPropertyDescriptor : vlnListPropertyDescriptor
|
|
{
|
|
private ItemInfo Item { get { return (ItemInfo)_Item; } }
|
|
public ItemInfoListPropertyDescriptor(ItemInfoList collection, int index) : base(collection, index) {; }
|
|
}
|
|
#endregion
|
|
#region Converter
|
|
internal class ItemInfoListConverter : ExpandableObjectConverter
|
|
{
|
|
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
|
|
{
|
|
if (destType == typeof(string) && value is ItemInfoList)
|
|
{
|
|
// Return department and department role separated by comma.
|
|
return ((ItemInfoList)value).Items.Count.ToString() + " Items";
|
|
}
|
|
return base.ConvertTo(context, culture, value, destType);
|
|
}
|
|
}
|
|
#endregion
|
|
} // Namespace
|