Exemple #1
0
        private void registerThisWorker()
        {
            ensureSession();

            var table = this.GetType().AssemblyQualifiedName;

            var value  = "{0}::{1}".Args(m_Round, AgniSystem.HostName);//round must be the first - it ensures different sorting every time when round changes
            var descr  = "{0} {1}".Args(GetType().Name, value);
            var script = new LockTransaction(descr, WORKSET_NS, 0, 0.0d,
                                             LockOp.SelectVarValue("Workers", table, Name, ignoreThisSession: true, abortIfNotFound: false, selectMany: true),
                                             LockOp.AnywayContinueAfter(LockOp.DeleteVar(table, Name), resetAbort: true),
                                             LockOp.Assert(LockOp.SetVar(table, Name, value, allowDuplicates: true))
                                             );
            var result = AgniSystem.LockManager.ExecuteLockTransaction(m_Session, script);

            if (result.ErrorCause != LockErrorCause.Unspecified)
            {
                //todo che delat?
                //Interumentatiopn + logging
                //Log()
            }

            var vars = result["Workers"] as SrvVar[];

            if (vars != null)
            {
                var values = new List <string>(vars.Select(v => v.Value.AsString()));
                values.Add(value);                            //add myself
                values.Sort(StringComparer.InvariantCulture); //must have pre-determined order

                m_WorkerCount = values.Count;
                m_MyIndex     = values.IndexOf(value);//my index in the set
            }
            else
            {
                m_WorkerCount = 1;
                m_MyIndex     = 0;
            }
        }
Exemple #2
0
        public void MDS_Entry_Review_ClosePeriod()
        {
            //note, this is FACILITY-level lock (unlike MDSs that are patient-level)
            var monthCloseStart = new LockTransaction("Month End Close@'Cherry Grove'", "Clinical2", 0, 0.5d,
                                                      LockOp.Assert(LockOp.Not(LockOp.Exists("MDS-Entry", "CGROVE-35"))),
                                                      LockOp.Assert(LockOp.Not(LockOp.Exists("MDS-Review", "CGROVE-35"))),
                                                      LockOp.Assert(LockOp.SetVar("Month-End", "CGROVE-35", null))
                                                      );

            var monthCloseUnlock = new LockTransaction("Month End Close@'Cherry Grove' is done", "Clinical2", 0, 0.5d,
                                                       LockOp.AnywayContinueAfter(LockOp.DeleteVar("Month-End", "CGROVE-35"))
                                                       );


            var mdsEnter = new LockTransaction("MDS Entry for Zak Pak@'Cherry Grove'", "Clinical2", 0, 0.5d,
                                               LockOp.Assert(LockOp.Not(LockOp.Exists("Month-End", "CGROVE-35"))),
                                               LockOp.Assert(LockOp.Not(LockOp.Exists("MDS-Review", "CGROVE-35", "R-45899"))),
                                               LockOp.Assert(LockOp.SetVar("MDS-Entry", "CGROVE-35", "R-45899", allowDuplicates: true))
                                               );

            var mdsReview = new LockTransaction("MDS Review for Zak Pak@'Cherry Grove'", "Clinical2", 0, 0.5d,
                                                LockOp.Assert(LockOp.Not(LockOp.Exists("Month-End", "CGROVE-35"))),
                                                LockOp.Assert(LockOp.Not(LockOp.Exists("MDS-Entry", "CGROVE-35", "R-45899"))),
                                                LockOp.Assert(LockOp.SetVar("MDS-Review", "CGROVE-35", "R-45899", allowDuplicates: true))
                                                );

            var mdsReviewUnlock = new LockTransaction("MDS Review for Zak Pak@'Cherry Grove' is done", "Clinical2", 0, 0.5d,
                                                      LockOp.AnywayContinueAfter(LockOp.DeleteVar("MDS-Review", "CGROVE-35", "R-45899"))
                                                      );

            var financialUser1 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "Financial User 1", 1000);
            var financialUser2 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "Financial User 2", 1000);


            var result = m_Server.ExecuteLockTransaction(financialUser1, monthCloseStart);

            Aver.IsTrue(LockStatus.TransactionOK == result.Status);//Month end started OK

            result = m_Server.ExecuteLockTransaction(financialUser2, monthCloseStart);
            Aver.IsTrue(LockStatus.TransactionError == result.Status);//Month end start FAILED, as NOTHER user is already locking
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("2:/AssertOp/", result.FailedStatement);


            var user1 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 1", 1000);
            var user2 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 2", 1000);
            var user3 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 3", 1000);
            var user4 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 4", 1000);


            result = m_Server.ExecuteLockTransaction(user1, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionError == result.Status); //Cant start MDS entry while closing period
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("0:/AssertOp/", result.FailedStatement);

            result = m_Server.ExecuteLockTransaction(user1, monthCloseUnlock);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status); //mds user can not Delete month close as he did not create it
                                                                    //the OK is returned because of 'AnywayContinueAfter' instead of 'Assert'

            result = m_Server.ExecuteLockTransaction(user1, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionError == result.Status); //STILL Cant start MDS entry while closing period
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("0:/AssertOp/", result.FailedStatement);

            result = m_Server.ExecuteLockTransaction(financialUser1, monthCloseUnlock);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status);//Now it got deleted


            result = m_Server.ExecuteLockTransaction(user1, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status);//and now , the MDS can start!!!

            result = m_Server.ExecuteLockTransaction(financialUser2, monthCloseStart);
            Aver.IsTrue(LockStatus.TransactionError == result.Status);//Now we cant start month end as someone is entering MDS
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("0:/AssertOp/", result.FailedStatement);


            result = m_Server.ExecuteLockTransaction(user2, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status);

            result = m_Server.ExecuteLockTransaction(user3, mdsReview);
            Aver.IsTrue(LockStatus.TransactionError == result.Status); //Cant start review because someone else is entering
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("1:/AssertOp/", result.FailedStatement);


            //User 1 ends session, this rolls back everything
            Aver.IsTrue(m_Server.EndLockSession(user1.ID));

            //still user 2 is present
            result = m_Server.ExecuteLockTransaction(user3, mdsReview);
            Aver.IsTrue(LockStatus.TransactionError == result.Status); //Cant start review because someone else is entering
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("1:/AssertOp/", result.FailedStatement);


            //User 2 ends session, this rolls back everything
            Aver.IsTrue(m_Server.EndLockSession(user2.ID));


            //No more entering people REVIEW succeeds
            result = m_Server.ExecuteLockTransaction(user3, mdsReview);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status); //Now the review has started!!!!


            result = m_Server.ExecuteLockTransaction(financialUser2, monthCloseStart);
            Aver.IsTrue(LockStatus.TransactionError == result.Status); //Now we cant start month end as someone is REVIEWING MDS
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("1:/AssertOp/", result.FailedStatement);

            //but enter fails because review conflicts with it
            result = m_Server.ExecuteLockTransaction(user4, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionError == result.Status); //Cant start ENTER because someone else is reviewing
            Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause);
            Aver.AreEqual("1:/AssertOp/", result.FailedStatement);

            //Review is done
            result = m_Server.ExecuteLockTransaction(user3, mdsReviewUnlock);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status); //Now the review has ended!!!!

            //so enter now succeeds just fine
            result = m_Server.ExecuteLockTransaction(user4, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status); //Can ENTER because review is over
        }
Exemple #3
0
        public void MDS_Entry_Review()
        {
            var mdsEnter = new LockTransaction("MDS Entry for Zak Pak@'Cherry Grove'", "Clinical", 0, 0.5d,
                                               LockOp.Assert(LockOp.Not(LockOp.Exists("Month-End", "CGROVE-35"))),
                                               LockOp.Assert(LockOp.Not(LockOp.Exists("MDS-Review", "CGROVE-35", "R-45899"))),
                                               LockOp.Assert(LockOp.SetVar("MDS-Entry", "CGROVE-35", "R-45899", allowDuplicates: true))
                                               );

            var mdsReview = new LockTransaction("MDS Review for Zak Pak@'Cherry Grove'", "Clinical", 0, 0.5d,
                                                LockOp.Assert(LockOp.Not(LockOp.Exists("Month-End", "CGROVE-35"))),
                                                LockOp.Assert(LockOp.Not(LockOp.Exists("MDS-Entry", "CGROVE-35", "R-45899"))),
                                                LockOp.Assert(LockOp.SetVar("MDS-Review", "CGROVE-35", "R-45899", allowDuplicates: false))
                                                );

            var mdsReviewUnlock = new LockTransaction("MDS Review for Zak Pak@'Cherry Grove' is done", "Clinical", 0, 0.5d,
                                                      LockOp.AnywayContinueAfter(LockOp.DeleteVar("MDS-Review", "CGROVE-35", "R-45899"))
                                                      );

            var user1 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 1", 1000);
            var user2 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 2", 1000);
            var user3 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 3", 1000);
            var user4 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "User 4", 1000);

            var result = m_Server.ExecuteLockTransaction(user1, mdsEnter);

            Aver.IsTrue(LockStatus.TransactionOK == result.Status);

            result = m_Server.ExecuteLockTransaction(user2, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status);

            result = m_Server.ExecuteLockTransaction(user3, mdsReview);
            Aver.IsTrue(LockStatus.TransactionError == result.Status);//Cant start review because someone else is entering
            Aver.AreEqual("1:/AssertOp/", result.FailedStatement);


            //User 1 ends session, this rolls back everything
            Aver.IsTrue(m_Server.EndLockSession(user1.ID));

            //still user 2 is present
            result = m_Server.ExecuteLockTransaction(user3, mdsReview);
            Aver.IsTrue(LockStatus.TransactionError == result.Status);//Cant start review because someone else is entering
            Aver.AreEqual("1:/AssertOp/", result.FailedStatement);


            //User 2 ends session, this rolls back everything
            Aver.IsTrue(m_Server.EndLockSession(user2.ID));


            //No more entering people REVIEW succeeds
            result = m_Server.ExecuteLockTransaction(user3, mdsReview);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status);//Now the review has started!!!!

            //but enter fails because review conflicts with it
            result = m_Server.ExecuteLockTransaction(user4, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionError == result.Status);//Cant start ENTER because someone else is reviewing
            Aver.AreEqual("1:/AssertOp/", result.FailedStatement);

            //Review is done
            result = m_Server.ExecuteLockTransaction(user3, mdsReviewUnlock);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status);//Now the review has ended!!!!

            //so enter now succeeds just fine
            result = m_Server.ExecuteLockTransaction(user4, mdsEnter);
            Aver.IsTrue(LockStatus.TransactionOK == result.Status);//Can ENTER because review is over
        }