Пример #1
0
        /// <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();
            }
        }
Пример #2
0
        /// <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();
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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!");
            }
        }
Пример #5
0
        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;
        }