VI.Controls/VI.Controls.Data/GenericRelationDataStore.cs
Decompiler Source FileVI.Controls.GenericRelationDataStoreDecompiled Source
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
GenericRelationDataStoreMethods
DB/Dialog object references
OIM key/entity markers
XObjectKeyAPI/entity calls
CreateNew PutValue CreateCol MetaData SqlFormatter StartUnitOfWork Comparison GetSingleProperty Source From MarkForDeletion PutValue CallMethodRegistrations / handlers
None extracted.
Complete Source
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