/// <summary> /// Saves all changed User Defaults. /// </summary> public static void SaveChangedUserDefaults() { SUserDefaultsTable UserDefaultsDataTableChanges; UserDefaultsDataTableChanges = UUserDefaultsDataTable.GetChangesTyped(); if (UserDefaultsDataTableChanges != null) { // MessageBox.Show('Changed/added User Defaults: ' + UserDefaultsDataTableChanges.Rows.Count.ToString); TRemote.MSysMan.Maintenance.UserDefaults.WebConnectors.SaveUserDefaults(Ict.Petra.Shared.UserInfo.GUserInfo.UserID, ref UserDefaultsDataTableChanges); // TODO 1 oChristianK cUserDefaults / ModificationID : Copy the ModificationID into the Client's DataTable so that the PetraClient's ModificationID's of UserDefaults are the same than the ones of the PetraServer. UUserDefaultsDataTable.AcceptChanges(); } }
/// <summary> /// Saves all changed User Defaults. /// </summary> public static void SaveChangedUserDefaults() { SUserDefaultsTable UserDefaultsDataTableChanges; UserDefaultsDataTableChanges = UUserDefaultsDataTable.GetChangesTyped(); if (UserDefaultsDataTableChanges != null) { // MessageBox.Show('Changed/added User Defaults: ' + UserDefaultsDataTableChanges.Rows.Count.ToString); TRemote.MSysMan.Common.WebConnectors.SaveUserDefaults(Ict.Petra.Shared.UserInfo.GUserInfo.UserID, ref UserDefaultsDataTableChanges); // We need to take over the changed modification ID's, otherwise this method will only succeed with ONE change and then fail // See Mantis item #5574 UUserDefaultsDataTable.Merge(UserDefaultsDataTableChanges); UUserDefaultsDataTable.AcceptChanges(); } }
public static Boolean LoadUserDefaultsTable(String AUserName, out SUserDefaultsTable AUserDefaultsDataTable, TDataBase ADataBase = null) { Boolean ReturnValue = false; TDataBase db = DBAccess.Connect("LoadUserDefaultsTable", ADataBase); TDBTransaction ReadTransaction = null; bool NewTransaction = false; try { ReadTransaction = db.GetNewOrExistingTransaction(IsolationLevel.ReadCommitted, out NewTransaction); if (SUserDefaultsAccess.CountViaSUser(AUserName, ReadTransaction) != 0) { AUserDefaultsDataTable = SUserDefaultsAccess.LoadViaSUser(AUserName, null, ReadTransaction, StringHelper.InitStrArr(new string[] { "ORDER BY", SUserDefaultsTable.GetDefaultCodeDBName() }), 0, 0); AUserDefaultsDataTable.AcceptChanges(); } else { AUserDefaultsDataTable = new SUserDefaultsTable(); } ReturnValue = true; } finally { if (NewTransaction && (ReadTransaction != null)) { ReadTransaction.Rollback(); TLogging.LogAtLevel(9, "TUserDefaults.LoadUserDefaultsTable: rolled back own transaction."); } } if (ADataBase == null) { db.CloseDBConnection(); } return(ReturnValue); }
public static void SaveUserDefaultsTable(String AUserName, ref SUserDefaultsTable AUserDefaultsDataTable, TDBTransaction AWriteTransaction, Boolean ASendUpdateInfoToClient) { Boolean NewTransaction = false; Boolean SubmissionOK = false; TDBTransaction WriteTransaction; Int32 SavingAttempts = 0; SUserDefaultsTable ChangedUserDefaultsDT; SUserDefaultsTable ChangedUserDefaults2DT; SUserDefaultsTable RefreshedUserDefaultsDataTable = null; if ((AUserDefaultsDataTable != null) && (AUserDefaultsDataTable.Rows.Count > 0)) { ChangedUserDefaultsDT = AUserDefaultsDataTable.GetChangesTyped(); if ((ChangedUserDefaultsDT != null) && (ChangedUserDefaultsDT.Rows.Count > 0)) { if (TLogging.DebugLevel >= 8) { TLogging.Log( "TUserDefaults.SaveUserDefaultsTable: Saving " + (ChangedUserDefaultsDT.Rows.Count).ToString() + " User Defaults..."); TLogging.Log("TUserDefaults.SaveUserDefaultsTable: Row[0] --- UserId: " + ChangedUserDefaultsDT[0].UserId + "; DefaultCode: " + ChangedUserDefaultsDT[0].DefaultCode + "; DefaultValue: " + ChangedUserDefaultsDT[0].DefaultValue); } if (AWriteTransaction == null) { WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.ReadCommitted, TEnforceIsolationLevel.eilMinimum, out NewTransaction); } else { WriteTransaction = AWriteTransaction; } try { do { try { SUserDefaultsAccess.SubmitChanges(AUserDefaultsDataTable, WriteTransaction); SubmissionOK = true; SavingAttempts = SavingAttempts + 1; } catch (EDBConcurrencyException) { TLogging.LogAtLevel( 8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: EDBConcurrencyException occured --> refreshing cached UserDefaults with UserDefaults from the DB!"); // The same user has saved the same UserDefault after we have read it in // (this can only happen if the same user is logged in twice). // > Read in the UserDefaults for this user again and merge them // into the ones that are to be submitted, notify the Client to // reload the UserDefaults and start submitting again! ReloadUserDefaults(UserInfo.GUserInfo.UserID, false, out RefreshedUserDefaultsDataTable); DataUtilities.CopyModificationIDsOver(ChangedUserDefaultsDT, RefreshedUserDefaultsDataTable); DataUtilities.CopyModificationIDsOver(AUserDefaultsDataTable, ChangedUserDefaultsDT); SavingAttempts = SavingAttempts + 1; ASendUpdateInfoToClient = true; } catch (Exception Exp) { if (TLogging.DL >= 8) { TLogging.Log("TMaintenanceUserDefaults.SaveUserDefaultsTable: Exception occured: " + Exp.ToString()); } throw; } } while (!((SavingAttempts > 1) || SubmissionOK)); TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: after saving."); TLogging.LogAtLevel( 8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: ChangedUserDefaultsDT.Rows.Count: " + ChangedUserDefaultsDT.Rows.Count.ToString()); ChangedUserDefaults2DT = AUserDefaultsDataTable.GetChangesTyped(); // Tell the Client the updated UserDefaults (needed for the ModificationIDs) if (ASendUpdateInfoToClient) { TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: ASendUpdateInfoToClient = true"); UpdateUserDefaultsOnClient(AUserName, ChangedUserDefaults2DT); } else { foreach (DataRow ChangedUDDR in ChangedUserDefaults2DT.Rows) { // If a new UserDefault has been INSERTed into the DB Table, inform other Clients about that if (ChangedUDDR.RowState == DataRowState.Added) { TLogging.LogAtLevel( 8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: new UserDefault has been INSERTed - inform other Clients.."); ASendUpdateInfoToClient = true; break; } } if (ASendUpdateInfoToClient) { // CopyModificationIDsOver(ChangedUserDefaultsDT, AUserDefaultsDataTable); TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: informing other Clients!"); UpdateUserDefaultsOnClient(AUserName, ChangedUserDefaults2DT); } } // We have no unsaved changes anymore AUserDefaultsDataTable.AcceptChanges(); TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: after AcceptChanges."); if (NewTransaction) { DBAccess.GDBAccessObj.CommitTransaction(); } TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: committed own transaction."); } catch (Exception Exp) { TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: Exception occured: " + Exp.ToString()); if (NewTransaction) { DBAccess.GDBAccessObj.RollbackTransaction(); TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: rolled back own transaction."); } throw; } TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: Done!"); } else { // nothing to save! TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: nothing to save: no changes!"); } } else { // nothing to save! TLogging.LogAtLevel(8, "TMaintenanceUserDefaults.SaveUserDefaultsTable: nothing to save: no UserDefaults in memory!"); } }
public static Boolean LoadUserDefaultsTable(String AUserName, Boolean AMergeChangesToServerSideCache, out SUserDefaultsTable AUserDefaultsDataTable) { Boolean ReturnValue; TDBTransaction ReadTransaction; Boolean NewTransaction = false; Boolean ReaderLockWasHeld; Boolean WriteLockTakenOut; LockCookie UpgradeLockCookie = new LockCookie(); TLogging.LogAtLevel(9, "TUserDefaults.LoadUserDefaultsTable called in the AppDomain " + Thread.GetDomain().FriendlyName + '.'); WriteLockTakenOut = false; ReaderLockWasHeld = false; try { try { try { ReadTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.ReadCommitted, TEnforceIsolationLevel.eilMinimum, out NewTransaction); if (SUserDefaultsAccess.CountViaSUser(AUserName, ReadTransaction) != 0) { AUserDefaultsDataTable = SUserDefaultsAccess.LoadViaSUser(AUserName, null, ReadTransaction, StringHelper.InitStrArr(new string[] { "ORDER BY", SUserDefaultsTable.GetDefaultCodeDBName() }), 0, 0); AUserDefaultsDataTable.AcceptChanges(); } else { AUserDefaultsDataTable = new SUserDefaultsTable(); } } finally { if (NewTransaction) { DBAccess.GDBAccessObj.CommitTransaction(); TLogging.LogAtLevel(9, "TUserDefaults.LoadUserDefaultsTable: committed own transaction."); } } if ((AUserName == UserInfo.GUserInfo.UserID) && (AMergeChangesToServerSideCache)) { /* * The UserDefaults were (re)loaded for the current user --> update * internal cache (modified UserDefaults in the cache will be replaced * with values from the DB, deleted UserDefaults in the cache will be * recreated from the DB, added UserDefaults in the cache will be * unaffected). */ MergeChanges(UUserDefaultsDT, AUserDefaultsDataTable); UUserDefaultsDT.AcceptChanges(); } ReturnValue = true; } finally { if (WriteLockTakenOut) { if (!ReaderLockWasHeld) { // Other threads are now free to obtain a read lock on the cache table. UReadWriteLock.ReleaseWriterLock(); TLogging.LogAtLevel(7, "TUserDefaults.LoadUserDefaultsTable released the WriterLock."); } else { TLogging.LogAtLevel(7, "TUserDefaults.ReloadUserDefaults waiting for downgrading to a ReaderLock..."); // Downgrade from a WriterLock to a ReaderLock again! UReadWriteLock.DowngradeFromWriterLock(ref UpgradeLockCookie); TLogging.LogAtLevel(7, "TUserDefaults.ReloadUserDefaults downgraded to a ReaderLock."); } } } } catch (Exception) { throw; } return ReturnValue; }