Exemple #1
0
        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);
            }
        }
Exemple #2
0
 internal EvalContext(ServerLockSession session, Namespace ns, LockTransaction tran)
 {
     Session     = session;
     Namespace   = ns;
     Transaction = tran;
 }
Exemple #3
0
        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());
        }
Exemple #4
0
 public LockTransactionResult ExecuteLockTransaction(LockSessionData session, LockTransaction transaction)
 => Service.Locker.ExecuteLockTransaction(session, transaction);
Exemple #5
0
        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);
        }