private LockTransactionResult executeLockTransaction(LockSessionData session, LockTransaction transaction) { if (!Running) { return(LockTransactionResult.CallFailed); } Interlocked.Increment(ref m_CurrentServerCalls); if (session == null || transaction == null) { throw new LockingException(StringConsts.ARGUMENT_ERROR + GetType().Name + ".ExecuteLockTransaction(session|transaction==null)"); } var isPing = transaction.Statements == null; if (!isPing && transaction.Namespace.IsNullOrWhiteSpace()) { throw new LockingException(StringConsts.ARGUMENT_ERROR + GetType().Name + ".ExecuteLockTransaction(transaction.Namespace==null|empty)"); } var currentTrustLevel = CurrentTrustLevel; var appRunTimeSec = (uint)(DateTime.UtcNow - m_StartTimeUTC).TotalSeconds; //insufficient runtime period length or trust level if (transaction.MinimumRequiredRuntimeSec > appRunTimeSec || transaction.MinimumRequiredTrustLevel > currentTrustLevel) { return(new LockTransactionResult(transaction.ID, AgniSystem.HostName, LockStatus.TransactionError, LockErrorCause.MinimumRequirements, null, appRunTimeSec, currentTrustLevel, null)); } var sid = session.ID.ToString(); var ss = m_Sessions.GetOrRegister(sid, (sd) => new ServerLockSession(sd), session); lock (ss) { if (ss.Disposed) { return(new LockTransactionResult(transaction.ID, AgniSystem.HostName, LockStatus.TransactionError, LockErrorCause.SessionExpired, null, appRunTimeSec, currentTrustLevel, null)); } ss.m_LastInteractionUTC = App.TimeSource.UTCNow; if (isPing)//ping just touches session above { return(new LockTransactionResult(transaction.ID, AgniSystem.HostName, LockStatus.TransactionOK, LockErrorCause.Unspecified, null, appRunTimeSec, currentTrustLevel, null)); } var ns = m_Namespaces.GetOrRegister <object>(transaction.Namespace, (_) => new Namespace(transaction.Namespace), null); var ectx = new EvalContext(ss, ns, transaction); prepareTransaction(ectx); //prepare is not under the lock LockTransactionResult result; lock (ns) //execute is UNDER THE LOCK result = executeTransaction(ectx, appRunTimeSec, currentTrustLevel); return(result); } }
internal EvalContext(ServerLockSession session, Namespace ns, LockTransaction tran) { Session = session; Namespace = ns; Transaction = tran; }
public void T25() { var set1 = new LockTransaction("Testing 101", "B", 0, 0.0d, LockOp.Assert(LockOp.SetVar("Doctor", "Sbaitso", "data{ age=23}", "Description 1", allowDuplicates: true)) ); var set2 = new LockTransaction("Testing 101", "B", 0, 0.0d, LockOp.Assert(LockOp.SetVar("Doctor", "Sbaitso", "data{ score=3489}", "Description 1", allowDuplicates: true)), LockOp.Assert(LockOp.SetVar("Doctor", "Lector", "zhaba", "Description 3", allowDuplicates: true)) ); var sessionSetter1 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "My session", 1000); var sessionSetter2 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "My session", 1000); var sessionGetter = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "My session", 1000); var result = m_Server.ExecuteLockTransaction(sessionSetter1, set1); Aver.IsTrue(LockStatus.TransactionOK == result.Status); result = m_Server.ExecuteLockTransaction(sessionSetter2, set2); Aver.IsTrue(LockStatus.TransactionOK == result.Status); var get = new LockTransaction("Testing 101", "B", 0, 0.0d, LockOp.SelectVarValue("A", "Doctor", "Sbaitso", selectMany: true) ); result = m_Server.ExecuteLockTransaction(sessionGetter, get); Aver.IsTrue(LockStatus.TransactionOK == result.Status); var v = result["A"] as Agni.Locking.Server.Variable[]; Aver.IsNotNull(v); Aver.AreEqual(2, v.Length); Console.WriteLine(v[0].Value); Aver.AreEqual(23, v[0].Value.AsLaconicConfig().AttrByName("age").ValueAsInt()); Aver.AreEqual(3489, v[1].Value.AsLaconicConfig().AttrByName("score").ValueAsInt()); var del1 = new LockTransaction("Testing 101", "B", 0, 0.0d, LockOp.Assert(LockOp.DeleteVar("Doctor", "Sbaitso", "data{ age=12111113}")) ); result = m_Server.ExecuteLockTransaction(sessionSetter1, del1); Aver.IsTrue(LockStatus.TransactionError == result.Status); //because DATA does not match Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause); result = m_Server.ExecuteLockTransaction(sessionGetter, get); Aver.IsTrue(LockStatus.TransactionOK == result.Status); v = result["A"] as Agni.Locking.Server.Variable[]; Aver.IsNotNull(v); Aver.AreEqual(2, v.Length); Console.WriteLine(v[0].Value); Aver.AreEqual(23, v[0].Value.AsLaconicConfig().AttrByName("age").ValueAsInt()); Aver.AreEqual(3489, v[1].Value.AsLaconicConfig().AttrByName("score").ValueAsInt()); del1 = new LockTransaction("Testing 101", "B", 0, 0.0d, LockOp.Assert(LockOp.DeleteVar("Doctor", "Sbaitso", null)) ); //Reexecute delet from setter2, it shpould only remove what he has set keeping setters'1 data result = m_Server.ExecuteLockTransaction(sessionSetter2, del1); Aver.IsTrue(LockStatus.TransactionOK == result.Status); result = m_Server.ExecuteLockTransaction(sessionGetter, get); Aver.IsTrue(LockStatus.TransactionOK == result.Status); //Setters'1 data is still here, but setter's2 is gone v = result["A"] as Agni.Locking.Server.Variable[]; Aver.IsNotNull(v); Aver.AreEqual(1, v.Length); Console.WriteLine(v[0].Value); Aver.AreEqual(23, v[0].Value.AsLaconicConfig().AttrByName("age").ValueAsInt()); }
public LockTransactionResult ExecuteLockTransaction(LockSessionData session, LockTransaction transaction) => Service.Locker.ExecuteLockTransaction(session, transaction);
public void T19() { var set1 = new LockTransaction("Testing 101", "A", 0, 0.0d, LockOp.Assert(LockOp.SetVar("Patient", "Barkhan1", null, "Oleg Petrovich Barkharev")) ); var set2 = new LockTransaction("Testing 101", "A", 0, 0.0d, LockOp.Assert(LockOp.SetVar("Patient", "buloch1970", null, "S***n Genadievich Bulochkin")) ); var session1 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "My session", 1000); var session2 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "My session", 1000); var session3 = new Agni.Locking.Server.LockSessionData(new LockSessionID(null), "My session", 1000); //1st user var result = m_Server.ExecuteLockTransaction(session1, set1); Aver.IsTrue(LockStatus.TransactionOK == result.Status); //2nd user result = m_Server.ExecuteLockTransaction(session2, set2); Aver.IsTrue(LockStatus.TransactionOK == result.Status); var exists = new LockTransaction("Testing 101", "A", 0, 0.0d, LockOp.Assert( LockOp.And ( LockOp.Exists("Patient", "Barkhan1"), LockOp.Exists("Patient", "buloch1970") ) )); //3rd user sees what the first two have set result = m_Server.ExecuteLockTransaction(session3, exists); Aver.IsTrue(LockStatus.TransactionOK == result.Status); var delete = new LockTransaction("Testing 101", "A", 0, 0.0d, LockOp.Assert( LockOp.DeleteVar("Patient", "Barkhan1", null) )); //2nd user wants to delete what the 1st set, CANT result = m_Server.ExecuteLockTransaction(session2, delete); Aver.IsTrue(LockStatus.TransactionError == result.Status); Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause); //3rd user wants to delete what the 1st set, CANT result = m_Server.ExecuteLockTransaction(session3, delete); Aver.IsTrue(LockStatus.TransactionError == result.Status); Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause); //3rd user still sees the two original records result = m_Server.ExecuteLockTransaction(session3, exists); Aver.IsTrue(LockStatus.TransactionOK == result.Status); //1st user deletes what the 1st set, CAN result = m_Server.ExecuteLockTransaction(session1, delete); Aver.IsTrue(LockStatus.TransactionOK == result.Status); //3rd user does not see the two original records anymore result = m_Server.ExecuteLockTransaction(session3, exists); Aver.IsTrue(LockStatus.TransactionError == result.Status); Aver.IsTrue(LockErrorCause.Statement == result.ErrorCause); //3rd does not see the first, but still sees the second result = m_Server.ExecuteLockTransaction(session3, new LockTransaction("Testing 101", "A", 0, 0.0d, LockOp.Assert( LockOp.And ( LockOp.Not(LockOp.Exists("Patient", "Barkhan1")), LockOp.Exists("Patient", "buloch1970") ) ))); Aver.IsTrue(LockStatus.TransactionOK == result.Status); }