// Constructors

        /// <summary>
        /// Initializes a new instance of this class.
        /// </summary>
        /// <param name="source">The <see cref="UnaryProvider.Source"/> property value.</param>
        /// <param name="lockMode">The mode of the lock to be acquired.</param>
        /// <param name="lockBehavior">The behavior of the lock.</param>
        public LockProvider(CompilableProvider source, LockMode lockMode, LockBehavior lockBehavior) :
            base(ProviderType.Lock, source)
        {
            LockMode     = () => lockMode;
            LockBehavior = () => lockBehavior;
            Initialize();
        }
Esempio n. 2
0
 /// <inheritdoc/>
 public void Lock(LockMode lockMode, LockBehavior lockBehavior)
 {
     using (new ParameterContext().Activate()) {
         keyParameter.Value = Key.Value;
         object key = new Triplet <TypeInfo, LockMode, LockBehavior>(TypeInfo, lockMode, lockBehavior);
         Func <object, object> generator = tripletObj => {
             var       triplet = (Triplet <TypeInfo, LockMode, LockBehavior>)tripletObj;
             IndexInfo index   = triplet.First.Indexes.PrimaryIndex;
             var       query   = index.GetQuery()
                                 .Seek(() => keyParameter.Value)
                                 .Lock(() => triplet.Second, () => triplet.Third)
                                 .Select();
             return(Session.Compile(query));
         };
         var source    = (ExecutableProvider)Session.StorageNode.InternalQueryCache.GetOrAdd(key, generator);
         var recordSet = source.GetRecordSet(Session);
         recordSet.FirstOrDefault();
     }
 }
Esempio n. 3
0
        /// <inheritdoc/>
        public void Lock(LockMode lockMode, LockBehavior lockBehavior)
        {
            var parameterContext = new ParameterContext();

            parameterContext.SetValue(keyParameter, Key.Value);
            object key = new Triplet <TypeInfo, LockMode, LockBehavior>(TypeInfo, lockMode, lockBehavior);
            Func <object, object> generator = tripletObj => {
                var triplet = (Triplet <TypeInfo, LockMode, LockBehavior>)tripletObj;
                var index   = triplet.First.Indexes.PrimaryIndex;
                var query   = index.GetQuery()
                              .Seek(context => context.GetValue(keyParameter))
                              .Lock(() => triplet.Second, () => triplet.Third)
                              .Select();
                return(Session.Compile(query));
            };
            var source = (ExecutableProvider)Session.StorageNode.InternalQueryCache.GetOrAdd(key, generator);

            using var recordSetReader = source.GetRecordSetReader(Session, parameterContext);
            recordSetReader.MoveNext();
        }
Esempio n. 4
0
        private Exception ExecuteConcurrentQueries(LockMode lockMode0, LockBehavior lockBehavior0,
                                                   LockMode lockMode1, LockBehavior lockBehavior1)
        {
            var       key = Session.Query.All <Customer>().First().Key;
            Exception firstThreadException = null;
            Exception result      = null;
            var       firstEvent  = new ManualResetEvent(false);
            var       secondEvent = new ManualResetEvent(false);
            var       firstThread = new Thread(() => {
                try {
                    using (var session = Domain.OpenSession())
                        using (session.OpenTransaction()) {
                            _ = session.Query.All <Customer>().Where(c => c.Key == key).Lock(lockMode0, lockBehavior0).ToList();
                            _ = secondEvent.Set();
                            _ = firstEvent.WaitOne();
                        }
                }
                catch (Exception e) {
                    firstThreadException = e;
                    _ = secondEvent.Set();
                    return;
                }
            });

            firstThread.Start();
            _ = secondEvent.WaitOne();
            if (firstThreadException != null)
            {
                throw firstThreadException;
            }

            result = ExecuteQueryAtSeparateThread(s => s.Query.All <Customer>()
                                                  .Where(c => c.Key == key).Lock(lockMode1, lockBehavior1));
            _ = firstEvent.Set();
            firstThread.Join();
            return(result);
        }
Esempio n. 5
0
 public static CompilableProvider Lock(this CompilableProvider source,
                                       LockMode lockMode, LockBehavior lockBehavior)
 {
     return(new LockProvider(source, lockMode, lockBehavior));
 }
Esempio n. 6
0
        /// <summary>
        /// Applies locks to the specified source queryable.
        /// </summary>
        /// <typeparam name="TSource">The type of the source element.</typeparam>
        /// <param name="source">The source sequence.</param>
        /// <param name="lockMode">The lock mode.</param>
        /// <param name="lockBehavior">The lock behavior.</param>
        /// <returns>The same sequence, but with "apply lock" hint.</returns>
        public static IQueryable <TSource> Lock <TSource>(this IQueryable <TSource> source, LockMode lockMode, LockBehavior lockBehavior)
        {
            ArgumentValidator.EnsureArgumentNotNull(source, "source");
            ArgumentValidator.EnsureArgumentNotNull(lockMode, "lockMode");
            ArgumentValidator.EnsureArgumentNotNull(lockBehavior, "lockBehavior");
            var errorMessage = Strings.ExLockDoesNotSupportQueryProviderOfTypeX;
            var providerType = source.Provider.GetType();

            if (providerType != WellKnownOrmTypes.QueryProvider)
            {
                throw new NotSupportedException(String.Format(errorMessage, providerType));
            }

            var genericMethod = WellKnownMembers.Queryable.ExtensionLock.MakeGenericMethod(new[] { typeof(TSource) });
            var expression    = Expression.Call(null, genericMethod, new[] { source.Expression, Expression.Constant(lockMode), Expression.Constant(lockBehavior) });

            return(source.Provider.CreateQuery <TSource>(expression));
        }