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; } }
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 }
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 }