Back to OIM Explorer

VI.Controls/VI.Controls.Data/GenericRelationDataStore.cs

Decompiler Source FileVI.Controls.GenericRelationDataStoreDecompiled Source

1 extracted method/event/call references in GenericRelationDataStore.

Source: F:\Claude\.tmp\oim-decompiled-full\1170_One_Identity_Manager_VI.Controls.dll\VI.Controls.Data\GenericRelationDataStore.cs

Source size: 17.178 characters

Interpretation

  • Decompiled source file. Use method/event registrations and call-site extraction to connect back to DialogMethod, QBMEvent, and API layers.

Relations

  • CallMethod: AssignDirect at line 411

Typed Edges

  • No typed edges extracted for this source.

References

  • No direct source references extracted.

Referenced By

  • No direct source references extracted.

C# source-derived context

Generated by pattern extraction from the decompiled C# source and decompile index. This is factual source evidence, not inferred behavior.

writes entity values references DB/Dialog objects

Summary: classes GenericRelationDataStore; methods OnLoadDeferredOperationDictionary, OnSetState, OnSaveChanges, OnGetSettings, OnGetHistoryChangeInfos, OnGetOriginInformation; references DynamicGroup, ESet; markers writes entity values, references DB/Dialog objects

Classes

GenericRelationDataStore

DB/Dialog object references

OIM key/entity markers

XObjectKey

API/entity calls

CreateNew PutValue CreateCol MetaData SqlFormatter StartUnitOfWork Comparison GetSingleProperty Source From MarkForDeletion PutValue CallMethod

Registrations / handlers

None extracted.

Complete Source

C#480 lines
1using System;2using System.Collections;3using System.Collections.Generic;4using VI.Base;5using VI.Controls.Base;6using VI.DB;7using VI.DB.Entities;8using VI.DB.History;9using VI.DB.MetaData;10using VI.DB.Sync;11using VI.MVC.TimeTraceSupport;1213namespace VI.Controls.Data;1415public class GenericRelationDataStore : MemberRelationDataStoreBase16{17	private readonly MultiMemberRelation m_GenericRelation;1819	private readonly IColDef m_MembersColumn;2021	private readonly IColDef m_BaseColumn;2223	public override string RelationCaption24	{25		get26		{27			if (string.IsNullOrEmpty(base.RelationCaption))28			{29				return base.DbObject.Connection.Tables[m_GenericRelation.MembersTableName].Display;30			}31			return base.RelationCaption;32		}33		set34		{35			base.RelationCaption = value;36		}37	}3839	public override bool HasDeletionInformation => m_BaseColumn.TableDef.Columns.Contains("xmarkedfordeletion");4041	protected override string EffectiveMemberClause => m_GenericRelation.EffectiveMemberClause;4243	protected override string EffectiveNotMemberClause => m_GenericRelation.EffectiveNotMemberClause;4445	protected override string MNTableName => m_GenericRelation.MNTableName;4647	protected override bool RelationNeedsSavedBaseObject => true;4849	public GenericRelationDataStore(IConnection connection, IRelationImageStore imageStore, IListLimitFilter listLimitFilter, MultiMemberRelation genericRelation, HierarchyHistoryLoadOption historyLoadOption = null)50		: base(connection, genericRelation?.MembersTableName ?? "", imageStore, listLimitFilter, historyLoadOption)51	{52		//IL_002e: Unknown result type (might be due to invalid IL or missing references)53		//IL_008e: Unknown result type (might be due to invalid IL or missing references)54		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)55		m_GenericRelation = genericRelation ?? throw new ArgumentNullException("genericRelation");56		m_MembersColumn = connection.Tables[genericRelation.MNTableName][genericRelation.MNMembersColumnName];57		m_BaseColumn = connection.Tables[genericRelation.MNTableName][genericRelation.MNBaseColumnName];58		if (m_MembersColumn == null)59		{60			throw new ArgumentNullException("MNMembersColumnName");61		}62		if (m_BaseColumn == null)63		{64			throw new ArgumentNullException("MNBaseColumnName");65		}66	}6768	protected override void OnLoadDeferredOperationDictionary(IMetaTable mnTableDef, string sourcePkColumn, string sourcePk)69	{70	}7172	protected override void OnSetState()73	{74		//IL_049f: Unknown result type (might be due to invalid IL or missing references)75		//IL_04a4: Unknown result type (might be due to invalid IL or missing references)76		//IL_04ad: Unknown result type (might be due to invalid IL or missing references)77		//IL_04b2: Unknown result type (might be due to invalid IL or missing references)78		if (base.DbObject == null)79		{80			return;81		}82		string columnname = (m_BaseColumn.IsFK ? ((System.Collections.Generic.IReadOnlyList<IColDef>)base.DbObject.TableDef.PrimaryKeyColumns)[0].Columnname : "xobjectkey");83		List<string> val = new List<string>();84		int num = 0;85		System.Collections.Generic.IEnumerator<ISingleDbObject> enumerator = GetDbObjects().GetEnumerator();86		try87		{88			while (((System.Collections.IEnumerator)enumerator).MoveNext())89			{90				ISingleDbObject current = enumerator.Current;91				num++;92				if (m_BaseColumn.IsFK)93				{94					val.Add(current[columnname].New.String);95					continue;96				}97				val.Add(current[columnname].New.String);98				if (((System.Collections.Generic.ICollection<ITableDef>)current.TableDef.ProxiedTables).Count <= 0)99				{100					continue;101				}102				DbObjectKey dbObjectKey = new DbObjectKey(current);103				System.Collections.Generic.IEnumerator<ITableDef> enumerator2 = ((System.Collections.Generic.IEnumerable<ITableDef>)current.TableDef.ProxiedTables).GetEnumerator();104				try105				{106					while (((System.Collections.IEnumerator)enumerator2).MoveNext())107					{108						ITableDef current2 = enumerator2.Current;109						val.Add(new DbObjectKey(current2.Tablename, dbObjectKey.Keys).ToXmlString());110					}111				}112				finally113				{114					((System.IDisposable)enumerator2)?.Dispose();115				}116			}117		}118		finally119		{120			((System.IDisposable)enumerator)?.Dispose();121		}122		string[] array = val.ToArray();123		ISqlFormatter sqlFormatter = base.DbObject.Connection.SqlFormatter;124		Dictionary<string, MNLoadMemberInfo> val2 = new Dictionary<string, MNLoadMemberInfo>((IEqualityComparer<string>)(object)StringComparer.OrdinalIgnoreCase);125		IColDbObject colDbObject2;126		if (base.IsHistoryMode)127		{128			IColDbObject colDbObject = new HistoryColDbObject(base.Connection, m_BaseColumn.TableDef.Tablename, DbVal.ToUniversalTime(base.HistoryLoadOption.Date, TimeZoneInfo.Local));129			colDbObject2 = colDbObject;130		}131		else132		{133			colDbObject2 = base.Connection.CreateCol(m_BaseColumn.TableDef.Tablename);134		}135		IColDbObject colDbObject3 = colDbObject2;136		bool flag = colDbObject3.Prototype.Columns.Contains("xorigin");137		bool flag2 = colDbObject3.Prototype.Columns.Contains("xisineffect");138		bool flag3 = colDbObject3.Prototype.Columns.Contains("xmarkedfordeletion");139		if (base.IsHistoryMode)140		{141			colDbObject3.Prototype[m_BaseColumn.Columnname].NewValue = array[0];142		}143		else144		{145			string text;146			if (array.Length <= 1)147			{148				text = sqlFormatter.Comparison(m_BaseColumn.Columnname, array[0], ValType.String, CompareOperator.Equal, FormatterOptions.None);149			}150			else151			{152				string columnname2 = m_BaseColumn.Columnname;153				object[] values = array;154				text = sqlFormatter.InClause(columnname2, ValType.String, FormatterOptions.NonUnicodeLiterals, values);155			}156			string whereClause = text;157			colDbObject3.Prototype.WhereClause = whereClause;158		}159		colDbObject3.Prototype[m_BaseColumn.Columnname].IsDisplayItem = true;160		colDbObject3.Prototype[m_MembersColumn.Columnname].IsDisplayItem = true;161		if (flag)162		{163			colDbObject3.Prototype["xorigin"].IsDisplayItem = true;164		}165		if (flag2)166		{167			colDbObject3.Prototype["xisineffect"].IsDisplayItem = true;168		}169		if (flag3)170		{171			colDbObject3.Prototype["xmarkedfordeletion"].IsDisplayItem = true;172		}173		colDbObject3.Load(CollectionLoadType.Slim);174		if (base.IsHistoryMode)175		{176			LoadHistoryData(colDbObject3 as HistoryColDbObject, base.HistoryLoadOption);177		}178		if (((System.Collections.Generic.IReadOnlyCollection<IColElem>)colDbObject3).Count == 0)179		{180			return;181		}182		int column = colDbObject3.ColumnIndex(m_MembersColumn.Columnname);183		System.Collections.Generic.IEnumerator<IColElem> enumerator3 = ((System.Collections.Generic.IEnumerable<IColElem>)colDbObject3).GetEnumerator();184		try185		{186			MNLoadMemberInfo mNLoadMemberInfo = default(MNLoadMemberInfo);187			while (((System.Collections.IEnumerator)enumerator3).MoveNext())188			{189				IColElem current3 = enumerator3.Current;190				string text2 = current3[column].ToString();191				if (!m_MembersColumn.IsFK)192				{193					text2 = new DbObjectKey(text2).KeyWithoutTable;194				}195				if (!val2.TryGetValue(text2, ref mNLoadMemberInfo))196				{197					mNLoadMemberInfo = (val2[text2] = new MNLoadMemberInfo());198				}199				int num2 = ((!flag) ? 1 : DbVal.ConvertTo<int>(current3["xorigin"]));200				if (num2 == 0 && base.IsHistoryMode)201				{202					num2 = 1;203				}204				if ((num2 & 1) > 0)205				{206					mNLoadMemberInfo.DirectAssignmentCounter++;207				}208				if ((num2 & 2) > 0)209				{210					mNLoadMemberInfo.IndirectAssignmentCounter++;211				}212				if ((num2 & 4) > 0)213				{214					mNLoadMemberInfo.DynamicGroupAssignmentCounter++;215				}216				if (base.IsHistoryMode || !flag2 || DbVal.ConvertTo<int>(current3["xisineffect"]) > 0)217				{218					mNLoadMemberInfo.EffectiveAssignmentCounter++;219				}220				if (flag3)221				{222					int num3 = DbVal.ConvertTo<int>(current3["xmarkedfordeletion"]);223					if ((num3 & 2) > 0)224					{225						mNLoadMemberInfo.OutstandingCounter++;226					}227					if ((num3 & 1) > 0)228					{229						mNLoadMemberInfo.MarkedForDeletionCounter++;230					}231				}232			}233		}234		finally235		{236			((System.IDisposable)enumerator3)?.Dispose();237		}238		Enumerator<string, MNLoadMemberInfo> enumerator4 = val2.GetEnumerator();239		try240		{241			while (enumerator4.MoveNext())242			{243				KeyValuePair<string, MNLoadMemberInfo> current4 = enumerator4.Current;244				DataEntry dataEntry = base.BaseDictionary[current4.Key];245				if (dataEntry != null)246				{247					MNLoadMemberInfo value = current4.Value;248					int directAssignmentCounter = value.DirectAssignmentCounter;249					if (directAssignmentCounter == num)250					{251						dataEntry.SetState(2, DataEntryState.Set);252					}253					else254					{255						dataEntry.SetState(2, (directAssignmentCounter > 0) ? DataEntryState.TriState : DataEntryState.None);256					}257					directAssignmentCounter = value.IndirectAssignmentCounter;258					if (directAssignmentCounter == num)259					{260						dataEntry.SetState(4, DataEntryState.Set);261					}262					else263					{264						dataEntry.SetState(4, (directAssignmentCounter > 0) ? DataEntryState.TriState : DataEntryState.None);265					}266					directAssignmentCounter = value.DynamicGroupAssignmentCounter;267					if (directAssignmentCounter == num)268					{269						dataEntry.SetState(8, DataEntryState.Set);270					}271					else272					{273						dataEntry.SetState(8, (directAssignmentCounter > 0) ? DataEntryState.TriState : DataEntryState.None);274					}275					directAssignmentCounter = value.EffectiveAssignmentCounter;276					if (directAssignmentCounter == num)277					{278						dataEntry.SetState(16, DataEntryState.Set);279					}280					else281					{282						dataEntry.SetState(16, (directAssignmentCounter > 0) ? DataEntryState.TriState : DataEntryState.None);283					}284					directAssignmentCounter = value.OutstandingCounter;285					if (directAssignmentCounter == num)286					{287						dataEntry.SetState(32, DataEntryState.Set);288					}289					else290					{291						dataEntry.SetState(32, (directAssignmentCounter > 0) ? DataEntryState.TriState : DataEntryState.None);292					}293					directAssignmentCounter = value.MarkedForDeletionCounter;294					if (directAssignmentCounter == num)295					{296						dataEntry.SetState(64, DataEntryState.Set);297					}298					else299					{300						dataEntry.SetState(64, (directAssignmentCounter > 0) ? DataEntryState.TriState : DataEntryState.None);301					}302					if (value.OutstandingCounter > 0 || value.MarkedForDeletionCounter > 0)303					{304						dataEntry.Enabled = false;305					}306				}307			}308		}309		finally310		{311			((System.IDisposable)enumerator4/*cast due to .constrained prefix*/).Dispose();312		}313		if (!base.HandleCutNode)314		{315			return;316		}317		System.Collections.Generic.IEnumerator<DataEntry> enumerator5 = base.BaseDictionary.GetEnumerator();318		try319		{320			while (((System.Collections.IEnumerator)enumerator5).MoveNext())321			{322				DataEntry current5 = enumerator5.Current;323				if ((bool)current5.GetRaw("IsCutNode", DataEntryValueKind.Raw))324				{325					current5.SetState(1, DataEntryState.Set);326				}327			}328		}329		finally330		{331			((System.IDisposable)enumerator5)?.Dispose();332		}333	}334335	protected override void OnSaveChanges(DataEntry[] entriesToSave, IProcessContext processContext)336	{337		ISession session = base.Connection.Session;338		IMetaTable table = session.MetaData().GetTable(m_GenericRelation.MNTableName);339		ISqlFormatter sqlFormatter = session.SqlFormatter();340		using IUnitOfWork unitOfWork = session.StartUnitOfWork(processContext?.ID);341		foreach (DataEntry dataEntry in entriesToSave)342		{343			DataEntryState curMemberState = MemberRelationDataStoreBase.GetCurMemberState(dataEntry);344			bool flag = false;345			switch (dataEntry.GetState(2))346			{347			case DataEntryState.None:348				if (curMemberState != DataEntryState.Set)349				{350					continue;351				}352				break;353			case DataEntryState.Set:354				if (curMemberState != DataEntryState.None)355				{356					continue;357				}358				flag = true;359				break;360			case DataEntryState.TriState:361				if (curMemberState != DataEntryState.None)362				{363					if (curMemberState != DataEntryState.Set)364					{365						continue;366					}367				}368				else369				{370					flag = true;371				}372				break;373			}374			string value;375			if (m_MembersColumn.IsFK)376			{377				value = dataEntry.Key;378			}379			else380			{381				string whereclause = base.Connection.SqlFormatter.Comparison(((System.Collections.Generic.IReadOnlyList<IColDef>)base.Connection.Tables[m_GenericRelation.MembersTableName].PrimaryKeyColumns)[0].Columnname, dataEntry.Key, ValType.String, CompareOperator.Equal, FormatterOptions.None);382				value = base.Connection.GetSingleProperty(m_GenericRelation.MembersTableName, "XObjectKey", whereclause).String;383			}384			System.Collections.Generic.IEnumerator<ISingleDbObject> enumerator = GetDbObjects().GetEnumerator();385			try386			{387				while (((System.Collections.IEnumerator)enumerator).MoveNext())388				{389					ISingleDbObject current = enumerator.Current;390					string value2 = ((!m_BaseColumn.IsFK) ? base.Connection.GetSingleProperty(current.Tablename, "XObjectKey", current.PKWhereClause).String : current[((System.Collections.Generic.IReadOnlyList<IColDef>)current.TableDef.PrimaryKeyColumns)[0].Columnname].NewValue.ToString());391					IEntityCollection collection = session.Source().GetCollection(Query.From(table.Tablename).Where(sqlFormatter.AndRelation(sqlFormatter.UidComparison(m_BaseColumn.Columnname, value2), sqlFormatter.UidComparison(m_MembersColumn.Columnname, value))).SelectNone(), EntityCollectionLoadType.Bulk);392					IEntity entity = null;393					if (flag && ((System.Collections.Generic.IReadOnlyCollection<IEntity>)collection).Count == 1)394					{395						entity = ((System.Collections.Generic.IReadOnlyList<IEntity>)collection)[0].Create(session);396						entity.MarkForDeletion();397					}398					else if (!flag)399					{400						if (((System.Collections.Generic.IReadOnlyCollection<IEntity>)collection).Count == 0)401						{402							entity = session.Source().CreateNew(table.Tablename);403							entity.PutValue(m_BaseColumn.Columnname, value2);404							entity.PutValue(m_MembersColumn.Columnname, value);405						}406						else407						{408							entity = ((System.Collections.Generic.IReadOnlyList<IEntity>)collection)[0].Create(session);409							if (table.Columns.IsAvailable("xorigin"))410							{411								entity.CallMethod("AssignDirect");412							}413						}414					}415					if (entity != null)416					{417						unitOfWork.Put(entity);418					}419				}420			}421			finally422			{423				((System.IDisposable)enumerator)?.Dispose();424			}425			if (flag)426			{427				dataEntry.SetState(2, DataEntryState.None, resetChangeLevel: true);428			}429			else430			{431				dataEntry.SetState(2, DataEntryState.Set, resetChangeLevel: true);432			}433		}434		unitOfWork.Commit();435	}436437	protected override void OnGetSettings(System.Collections.Generic.IList<KeyValuePair<string, string>> settings)438	{439		//IL_0020: Unknown result type (might be due to invalid IL or missing references)440		//IL_0045: Unknown result type (might be due to invalid IL or missing references)441		//IL_006a: Unknown result type (might be due to invalid IL or missing references)442		((System.Collections.Generic.ICollection<KeyValuePair<string, string>>)settings).Add(new KeyValuePair<string, string>(LanguageManager.Instance["Ctrl_RelationControl_DefMode_MNTable"], m_MembersColumn.TableDef.Tablename));443		((System.Collections.Generic.ICollection<KeyValuePair<string, string>>)settings).Add(new KeyValuePair<string, string>(LanguageManager.Instance["Ctrl_RelationControl_DefMode_MNMemberTable"], m_GenericRelation.MembersTableName));444		((System.Collections.Generic.ICollection<KeyValuePair<string, string>>)settings).Add(new KeyValuePair<string, string>(LanguageManager.Instance["Ctrl_RelationControl_DefMode_MNMemberColumn"], m_MembersColumn.Columnname));445	}446447	protected override DocumentHistoryInfo[] OnGetHistoryChangeInfos(System.DateTime startTime, System.DateTime endTime)448	{449		if (base.DbObject == null)450		{451			return null;452		}453		string columnname = (m_BaseColumn.IsFK ? ((System.Collections.Generic.IReadOnlyList<IColDef>)base.DbObject.TableDef.PrimaryKeyColumns)[0].Columnname : "xobjectkey");454		string newValue = base.DbObject[columnname].New.String;455		HistoryColDbObject historyColDbObject = new HistoryColDbObject(base.Connection, m_BaseColumn.TableDef.Tablename, startTime);456		historyColDbObject.Prototype[m_BaseColumn.Columnname].NewValue = newValue;457		historyColDbObject.Load();458		List<DocumentHistoryInfo> val = new List<DocumentHistoryInfo>();459		System.Collections.Generic.IEnumerator<IObjectChangeInfo> enumerator = historyColDbObject.GetChangeInfos().GetEnumerator();460		try461		{462			while (((System.Collections.IEnumerator)enumerator).MoveNext())463			{464				IObjectChangeInfo current = enumerator.Current;465				val.Add((DocumentHistoryInfo)new ColDbObjectDocumentHistoryInfo(historyColDbObject, current));466			}467		}468		finally469		{470			((System.IDisposable)enumerator)?.Dispose();471		}472		return val.ToArray();473	}474475	protected override OriginInformation OnGetOriginInformation()476	{477		return new OriginInformation(m_BaseColumn.MetaColumn.Table);478	}479}480