http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs deleted file mode 100644 index b42e03c..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs +++ /dev/null @@ -1,941 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Diagnostics.CodeAnalysis; - using System.Threading; - using Apache.Ignite.Core.Cache; - using Apache.Ignite.Core.Cache.Expiry; - using Apache.Ignite.Core.Cache.Query; - using Apache.Ignite.Core.Cache.Query.Continuous; - using Apache.Ignite.Core.Common; - using Apache.Ignite.Core.Impl.Cache.Query; - using Apache.Ignite.Core.Impl.Cache.Query.Continuous; - using Apache.Ignite.Core.Impl.Common; - using Apache.Ignite.Core.Impl.Portable; - using Apache.Ignite.Core.Impl.Portable.IO; - using Apache.Ignite.Core.Impl.Unmanaged; - using Apache.Ignite.Core.Portable; - using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils; - - /// <summary> - /// Native cache wrapper. - /// </summary> - [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")] - internal class CacheImpl<TK, TV> : PlatformTarget, ICache<TK, TV> - { - /** Duration: unchanged. */ - private const long DurUnchanged = -2; - - /** Duration: eternal. */ - private const long DurEternal = -1; - - /** Duration: zero. */ - private const long DurZero = 0; - - /** Ignite instance. */ - private readonly Ignite _ignite; - - /** Flag: skip store. */ - private readonly bool _flagSkipStore; - - /** Flag: keep portable. */ - private readonly bool _flagKeepPortable; - - /** Flag: async mode.*/ - private readonly bool _flagAsync; - - /** Flag: no-retries.*/ - private readonly bool _flagNoRetries; - - /** - * Result converter for async InvokeAll operation. - * In future result processing there is only one TResult generic argument, - * and we can't get the type of ICacheEntryProcessorResult at compile time from it. - * This field caches converter for the last InvokeAll operation to avoid using reflection. - */ - private readonly ThreadLocal<object> _invokeAllConverter = new ThreadLocal<object>(); - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="grid">Grid.</param> - /// <param name="target">Target.</param> - /// <param name="marsh">Marshaller.</param> - /// <param name="flagSkipStore">Skip store flag.</param> - /// <param name="flagKeepPortable">Keep portable flag.</param> - /// <param name="flagAsync">Async mode flag.</param> - /// <param name="flagNoRetries">No-retries mode flag.</param> - public CacheImpl(Ignite grid, IUnmanagedTarget target, PortableMarshaller marsh, - bool flagSkipStore, bool flagKeepPortable, bool flagAsync, bool flagNoRetries) : base(target, marsh) - { - _ignite = grid; - _flagSkipStore = flagSkipStore; - _flagKeepPortable = flagKeepPortable; - _flagAsync = flagAsync; - _flagNoRetries = flagNoRetries; - } - - /** <inheritDoc /> */ - public IIgnite Ignite - { - get - { - return _ignite; - } - } - - /** <inheritDoc /> */ - public bool IsAsync - { - get { return _flagAsync; } - } - - /** <inheritDoc /> */ - public IFuture GetFuture() - { - throw new NotSupportedException("GetFuture() should be called through CacheProxyImpl"); - } - - /** <inheritDoc /> */ - public IFuture<TResult> GetFuture<TResult>() - { - throw new NotSupportedException("GetFuture() should be called through CacheProxyImpl"); - } - - /// <summary> - /// Gets and resets future for previous asynchronous operation. - /// </summary> - /// <param name="lastAsyncOpId">The last async op id.</param> - /// <returns> - /// Future for previous asynchronous operation. - /// </returns> - /// <exception cref="System.InvalidOperationException">Asynchronous mode is disabled</exception> - internal IFuture<TResult> GetFuture<TResult>(int lastAsyncOpId) - { - if (!_flagAsync) - throw IgniteUtils.GetAsyncModeDisabledException(); - - var converter = GetFutureResultConverter<TResult>(lastAsyncOpId); - - _invokeAllConverter.Value = null; - - return GetFuture((futId, futTypeId) => UU.TargetListenFutureForOperation(Target, futId, futTypeId, lastAsyncOpId), - _flagKeepPortable, converter); - } - - /** <inheritDoc /> */ - public string Name - { - get { return DoInOp<string>((int)CacheOp.GetName); } - } - - /** <inheritDoc /> */ - - public bool IsEmpty() - { - return GetSize() == 0; - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithSkipStore() - { - if (_flagSkipStore) - return this; - - return new CacheImpl<TK, TV>(_ignite, UU.CacheWithSkipStore(Target), Marshaller, - true, _flagKeepPortable, _flagAsync, true); - } - - /// <summary> - /// Skip store flag getter. - /// </summary> - internal bool IsSkipStore { get { return _flagSkipStore; } } - - /** <inheritDoc /> */ - public ICache<TK1, TV1> WithKeepPortable<TK1, TV1>() - { - if (_flagKeepPortable) - { - var result = this as ICache<TK1, TV1>; - - if (result == null) - throw new InvalidOperationException( - "Can't change type of portable cache. WithKeepPortable has been called on an instance of " + - "portable cache with incompatible generic arguments."); - - return result; - } - - return new CacheImpl<TK1, TV1>(_ignite, UU.CacheWithKeepPortable(Target), Marshaller, - _flagSkipStore, true, _flagAsync, _flagNoRetries); - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithExpiryPolicy(IExpiryPolicy plc) - { - IgniteArgumentCheck.NotNull(plc, "plc"); - - long create = ConvertDuration(plc.GetExpiryForCreate()); - long update = ConvertDuration(plc.GetExpiryForUpdate()); - long access = ConvertDuration(plc.GetExpiryForAccess()); - - IUnmanagedTarget cache0 = UU.CacheWithExpiryPolicy(Target, create, update, access); - - return new CacheImpl<TK, TV>(_ignite, cache0, Marshaller, _flagSkipStore, _flagKeepPortable, _flagAsync, _flagNoRetries); - } - - /// <summary> - /// Convert TimeSpan to duration recognizable by Java. - /// </summary> - /// <param name="dur">.Net duration.</param> - /// <returns>Java duration in milliseconds.</returns> - private static long ConvertDuration(TimeSpan? dur) - { - if (dur.HasValue) - { - if (dur.Value == TimeSpan.MaxValue) - return DurEternal; - - long dur0 = (long)dur.Value.TotalMilliseconds; - - return dur0 > 0 ? dur0 : DurZero; - } - - return DurUnchanged; - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithAsync() - { - return _flagAsync ? this : new CacheImpl<TK, TV>(_ignite, UU.CacheWithAsync(Target), Marshaller, - _flagSkipStore, _flagKeepPortable, true, _flagNoRetries); - } - - /** <inheritDoc /> */ - public bool IsKeepPortable - { - get { return _flagKeepPortable; } - } - - /** <inheritDoc /> */ - public void LoadCache(ICacheEntryFilter<TK, TV> p, params object[] args) - { - LoadCache0(p, args, (int)CacheOp.LoadCache); - } - - /** <inheritDoc /> */ - public void LocalLoadCache(ICacheEntryFilter<TK, TV> p, params object[] args) - { - LoadCache0(p, args, (int)CacheOp.LocLoadCache); - } - - /// <summary> - /// Loads the cache. - /// </summary> - private void LoadCache0(ICacheEntryFilter<TK, TV> p, object[] args, int opId) - { - DoOutOp(opId, writer => - { - if (p != null) - { - var p0 = new CacheEntryFilterHolder(p, (k, v) => p.Invoke(new CacheEntry<TK, TV>((TK)k, (TV)v)), - Marshaller, IsKeepPortable); - writer.WriteObject(p0); - writer.WriteLong(p0.Handle); - } - else - writer.WriteObject<CacheEntryFilterHolder>(null); - - writer.WriteObjectArray(args); - }); - } - - /** <inheritDoc /> */ - public bool ContainsKey(TK key) - { - IgniteArgumentCheck.NotNull(key, "key"); - - return DoOutOp((int)CacheOp.ContainsKey, key) == True; - } - - /** <inheritDoc /> */ - public bool ContainsKeys(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - return DoOutOp((int)CacheOp.ContainsKeys, writer => WriteEnumerable(writer, keys)) == True; - } - - /** <inheritDoc /> */ - public TV LocalPeek(TK key, params CachePeekMode[] modes) - { - IgniteArgumentCheck.NotNull(key, "key"); - - return DoOutInOp<TV>((int)CacheOp.Peek, writer => - { - writer.Write(key); - writer.WriteInt(EncodePeekModes(modes)); - }); - } - - /** <inheritDoc /> */ - public TV Get(TK key) - { - IgniteArgumentCheck.NotNull(key, "key"); - - return DoOutInOp<TK, TV>((int)CacheOp.Get, key); - } - - /** <inheritDoc /> */ - public IDictionary<TK, TV> GetAll(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - return DoOutInOp((int)CacheOp.GetAll, - writer => WriteEnumerable(writer, keys), - input => - { - var reader = Marshaller.StartUnmarshal(input, _flagKeepPortable); - - return ReadGetAllDictionary(reader); - }); - } - - /** <inheritdoc /> */ - public void Put(TK key, TV val) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(val, "val"); - - DoOutOp((int)CacheOp.Put, key, val); - } - - /** <inheritDoc /> */ - public TV GetAndPut(TK key, TV val) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(val, "val"); - - return DoOutInOp<TK, TV, TV>((int)CacheOp.GetAndPut, key, val); - } - - /** <inheritDoc /> */ - public TV GetAndReplace(TK key, TV val) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(val, "val"); - - return DoOutInOp<TK, TV, TV>((int)CacheOp.GetAndReplace, key, val); - } - - /** <inheritDoc /> */ - public TV GetAndRemove(TK key) - { - IgniteArgumentCheck.NotNull(key, "key"); - - return DoOutInOp<TK, TV>((int)CacheOp.GetAndRemove, key); - } - - /** <inheritdoc /> */ - public bool PutIfAbsent(TK key, TV val) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(val, "val"); - - return DoOutOp((int) CacheOp.PutIfAbsent, key, val) == True; - } - - /** <inheritdoc /> */ - public TV GetAndPutIfAbsent(TK key, TV val) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(val, "val"); - - return DoOutInOp<TK, TV, TV>((int)CacheOp.GetAndPutIfAbsent, key, val); - } - - /** <inheritdoc /> */ - public bool Replace(TK key, TV val) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(val, "val"); - - return DoOutOp((int)CacheOp.Replace2, key, val) == True; - } - - /** <inheritdoc /> */ - public bool Replace(TK key, TV oldVal, TV newVal) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(oldVal, "oldVal"); - - IgniteArgumentCheck.NotNull(newVal, "newVal"); - - return DoOutOp((int)CacheOp.Replace3, key, oldVal, newVal) == True; - } - - /** <inheritdoc /> */ - public void PutAll(IDictionary<TK, TV> vals) - { - IgniteArgumentCheck.NotNull(vals, "vals"); - - DoOutOp((int) CacheOp.PutAll, writer => WriteDictionary(writer, vals)); - } - - /** <inheritdoc /> */ - public void LocalEvict(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - DoOutOp((int) CacheOp.LocEvict, writer => WriteEnumerable(writer, keys)); - } - - /** <inheritdoc /> */ - public void Clear() - { - UU.CacheClear(Target); - } - - /** <inheritdoc /> */ - public void Clear(TK key) - { - IgniteArgumentCheck.NotNull(key, "key"); - - DoOutOp((int)CacheOp.Clear, key); - } - - /** <inheritdoc /> */ - public void ClearAll(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - DoOutOp((int)CacheOp.ClearAll, writer => WriteEnumerable(writer, keys)); - } - - /** <inheritdoc /> */ - public void LocalClear(TK key) - { - IgniteArgumentCheck.NotNull(key, "key"); - - DoOutOp((int) CacheOp.LocalClear, key); - } - - /** <inheritdoc /> */ - public void LocalClearAll(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - DoOutOp((int)CacheOp.LocalClearAll, writer => WriteEnumerable(writer, keys)); - } - - /** <inheritdoc /> */ - public bool Remove(TK key) - { - IgniteArgumentCheck.NotNull(key, "key"); - - return DoOutOp((int)CacheOp.RemoveObj, key) == True; - } - - /** <inheritDoc /> */ - public bool Remove(TK key, TV val) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(val, "val"); - - return DoOutOp((int)CacheOp.RemoveBool, key, val) == True; - } - - /** <inheritDoc /> */ - public void RemoveAll(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - DoOutOp((int)CacheOp.RemoveAll, writer => WriteEnumerable(writer, keys)); - } - - /** <inheritDoc /> */ - public void RemoveAll() - { - UU.CacheRemoveAll(Target); - } - - /** <inheritDoc /> */ - public int GetLocalSize(params CachePeekMode[] modes) - { - return Size0(true, modes); - } - - /** <inheritDoc /> */ - public int GetSize(params CachePeekMode[] modes) - { - return Size0(false, modes); - } - - /// <summary> - /// Internal size routine. - /// </summary> - /// <param name="loc">Local flag.</param> - /// <param name="modes">peek modes</param> - /// <returns>Size.</returns> - private int Size0(bool loc, params CachePeekMode[] modes) - { - int modes0 = EncodePeekModes(modes); - - return UU.CacheSize(Target, modes0, loc); - } - - /** <inheritDoc /> */ - public void LocalPromote(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - DoOutOp((int)CacheOp.LocPromote, writer => WriteEnumerable(writer, keys)); - } - - /** <inheritdoc /> */ - public TR Invoke<TR, TA>(TK key, ICacheEntryProcessor<TK, TV, TA, TR> processor, TA arg) - { - IgniteArgumentCheck.NotNull(key, "key"); - - IgniteArgumentCheck.NotNull(processor, "processor"); - - var holder = new CacheEntryProcessorHolder(processor, arg, - (e, a) => processor.Process((IMutableCacheEntry<TK, TV>)e, (TA)a), typeof(TK), typeof(TV)); - - return DoOutInOp((int)CacheOp.Invoke, writer => - { - writer.Write(key); - writer.Write(holder); - }, - input => GetResultOrThrow<TR>(Unmarshal<object>(input))); - } - - /** <inheritdoc /> */ - public IDictionary<TK, ICacheEntryProcessorResult<TR>> InvokeAll<TR, TA>(IEnumerable<TK> keys, - ICacheEntryProcessor<TK, TV, TA, TR> processor, TA arg) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - IgniteArgumentCheck.NotNull(processor, "processor"); - - var holder = new CacheEntryProcessorHolder(processor, arg, - (e, a) => processor.Process((IMutableCacheEntry<TK, TV>)e, (TA)a), typeof(TK), typeof(TV)); - - return DoOutInOp((int)CacheOp.InvokeAll, writer => - { - WriteEnumerable(writer, keys); - writer.Write(holder); - }, - input => - { - if (IsAsync) - _invokeAllConverter.Value = (Func<PortableReaderImpl, IDictionary<TK, ICacheEntryProcessorResult<TR>>>) - (reader => ReadInvokeAllResults<TR>(reader.Stream)); - - return ReadInvokeAllResults<TR>(input); - }); - } - - /** <inheritdoc /> */ - public ICacheLock Lock(TK key) - { - IgniteArgumentCheck.NotNull(key, "key"); - - return DoOutInOp((int)CacheOp.Lock, writer => - { - writer.Write(key); - }, input => new CacheLock(input.ReadInt(), Target)); - } - - /** <inheritdoc /> */ - public ICacheLock LockAll(IEnumerable<TK> keys) - { - IgniteArgumentCheck.NotNull(keys, "keys"); - - return DoOutInOp((int)CacheOp.LockAll, writer => - { - WriteEnumerable(writer, keys); - }, input => new CacheLock(input.ReadInt(), Target)); - } - - /** <inheritdoc /> */ - public bool IsLocalLocked(TK key, bool byCurrentThread) - { - IgniteArgumentCheck.NotNull(key, "key"); - - return DoOutOp((int)CacheOp.IsLocalLocked, writer => - { - writer.Write(key); - writer.WriteBoolean(byCurrentThread); - }) == True; - } - - /** <inheritDoc /> */ - public ICacheMetrics GetMetrics() - { - return DoInOp((int)CacheOp.Metrics, stream => - { - IPortableRawReader reader = Marshaller.StartUnmarshal(stream, false); - - return new CacheMetricsImpl(reader); - }); - } - - /** <inheritDoc /> */ - public IFuture Rebalance() - { - return GetFuture<object>((futId, futTyp) => UU.CacheRebalance(Target, futId)); - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithNoRetries() - { - if (_flagNoRetries) - return this; - - return new CacheImpl<TK, TV>(_ignite, UU.CacheWithNoRetries(Target), Marshaller, - _flagSkipStore, _flagKeepPortable, _flagAsync, true); - } - - /// <summary> - /// Gets a value indicating whether this instance is in no-retries mode. - /// </summary> - internal bool IsNoRetries - { - get { return _flagNoRetries; } - } - - #region Queries - - /** <inheritDoc /> */ - public IQueryCursor<IList> QueryFields(SqlFieldsQuery qry) - { - IgniteArgumentCheck.NotNull(qry, "qry"); - - if (string.IsNullOrEmpty(qry.Sql)) - throw new ArgumentException("Sql cannot be null or empty"); - - IUnmanagedTarget cursor; - - using (var stream = IgniteManager.Memory.Allocate().Stream()) - { - var writer = Marshaller.StartMarshal(stream); - - writer.WriteBoolean(qry.Local); - writer.WriteString(qry.Sql); - writer.WriteInt(qry.PageSize); - - WriteQueryArgs(writer, qry.Arguments); - - FinishMarshal(writer); - - cursor = UU.CacheOutOpQueryCursor(Target, (int) CacheOp.QrySqlFields, stream.SynchronizeOutput()); - } - - return new FieldsQueryCursor(cursor, Marshaller, _flagKeepPortable); - } - - /** <inheritDoc /> */ - public IQueryCursor<ICacheEntry<TK, TV>> Query(QueryBase qry) - { - IgniteArgumentCheck.NotNull(qry, "qry"); - - IUnmanagedTarget cursor; - - using (var stream = IgniteManager.Memory.Allocate().Stream()) - { - var writer = Marshaller.StartMarshal(stream); - - qry.Write(writer, IsKeepPortable); - - FinishMarshal(writer); - - cursor = UU.CacheOutOpQueryCursor(Target, (int)qry.OpId, stream.SynchronizeOutput()); - } - - return new QueryCursor<TK, TV>(cursor, Marshaller, _flagKeepPortable); - } - - /// <summary> - /// Write query arguments. - /// </summary> - /// <param name="writer">Writer.</param> - /// <param name="args">Arguments.</param> - private static void WriteQueryArgs(PortableWriterImpl writer, object[] args) - { - if (args == null) - writer.WriteInt(0); - else - { - writer.WriteInt(args.Length); - - foreach (var arg in args) - writer.WriteObject(arg); - } - } - - /** <inheritdoc /> */ - public IContinuousQueryHandle QueryContinuous(ContinuousQuery<TK, TV> qry) - { - IgniteArgumentCheck.NotNull(qry, "qry"); - - return QueryContinuousImpl(qry, null); - } - - /** <inheritdoc /> */ - public IContinuousQueryHandle<ICacheEntry<TK, TV>> QueryContinuous(ContinuousQuery<TK, TV> qry, QueryBase initialQry) - { - IgniteArgumentCheck.NotNull(qry, "qry"); - IgniteArgumentCheck.NotNull(initialQry, "initialQry"); - - return QueryContinuousImpl(qry, initialQry); - } - - /// <summary> - /// QueryContinuous implementation. - /// </summary> - private IContinuousQueryHandle<ICacheEntry<TK, TV>> QueryContinuousImpl(ContinuousQuery<TK, TV> qry, - QueryBase initialQry) - { - qry.Validate(); - - var hnd = new ContinuousQueryHandleImpl<TK, TV>(qry, Marshaller, _flagKeepPortable); - - using (var stream = IgniteManager.Memory.Allocate().Stream()) - { - var writer = Marshaller.StartMarshal(stream); - - hnd.Start(_ignite, writer, () => - { - if (initialQry != null) - { - writer.WriteInt((int) initialQry.OpId); - - initialQry.Write(writer, IsKeepPortable); - } - else - writer.WriteInt(-1); // no initial query - - FinishMarshal(writer); - - // ReSharper disable once AccessToDisposedClosure - return UU.CacheOutOpContinuousQuery(Target, (int)CacheOp.QryContinuous, stream.SynchronizeOutput()); - }, qry); - } - - return hnd; - } - - #endregion - - #region Enumerable support - - /** <inheritdoc /> */ - public IEnumerable<ICacheEntry<TK, TV>> GetLocalEntries(CachePeekMode[] peekModes) - { - return new CacheEnumerable<TK, TV>(this, EncodePeekModes(peekModes)); - } - - /** <inheritdoc /> */ - public IEnumerator<ICacheEntry<TK, TV>> GetEnumerator() - { - return new CacheEnumeratorProxy<TK, TV>(this, false, 0); - } - - /** <inheritdoc /> */ - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - /// <summary> - /// Create real cache enumerator. - /// </summary> - /// <param name="loc">Local flag.</param> - /// <param name="peekModes">Peek modes for local enumerator.</param> - /// <returns>Cache enumerator.</returns> - internal CacheEnumerator<TK, TV> CreateEnumerator(bool loc, int peekModes) - { - if (loc) - return new CacheEnumerator<TK, TV>(UU.CacheLocalIterator(Target, peekModes), Marshaller, _flagKeepPortable); - - return new CacheEnumerator<TK, TV>(UU.CacheIterator(Target), Marshaller, _flagKeepPortable); - } - - #endregion - - /** <inheritDoc /> */ - protected override T Unmarshal<T>(IPortableStream stream) - { - return Marshaller.Unmarshal<T>(stream, _flagKeepPortable); - } - - /// <summary> - /// Encodes the peek modes into a single int value. - /// </summary> - private static int EncodePeekModes(CachePeekMode[] modes) - { - int modesEncoded = 0; - - if (modes != null) - { - foreach (var mode in modes) - modesEncoded |= (int) mode; - } - - return modesEncoded; - } - - /// <summary> - /// Unwraps an exception from PortableResultHolder, if any. Otherwise does the cast. - /// </summary> - /// <typeparam name="T">Result type.</typeparam> - /// <param name="obj">Object.</param> - /// <returns>Result.</returns> - private static T GetResultOrThrow<T>(object obj) - { - var holder = obj as PortableResultWrapper; - - if (holder != null) - { - var err = holder.Result as Exception; - - if (err != null) - throw err as CacheEntryProcessorException ?? new CacheEntryProcessorException(err); - } - - return obj == null ? default(T) : (T) obj; - } - - /// <summary> - /// Reads results of InvokeAll operation. - /// </summary> - /// <typeparam name="T">The type of the result.</typeparam> - /// <param name="inStream">Stream.</param> - /// <returns>Results of InvokeAll operation.</returns> - private IDictionary<TK, ICacheEntryProcessorResult<T>> ReadInvokeAllResults<T>(IPortableStream inStream) - { - var count = inStream.ReadInt(); - - if (count == -1) - return null; - - var results = new Dictionary<TK, ICacheEntryProcessorResult<T>>(count); - - for (var i = 0; i < count; i++) - { - var key = Unmarshal<TK>(inStream); - - var hasError = inStream.ReadBool(); - - results[key] = hasError - ? new CacheEntryProcessorResult<T>(ReadException(inStream)) - : new CacheEntryProcessorResult<T>(Unmarshal<T>(inStream)); - } - - return results; - } - - /// <summary> - /// Reads the exception, either in portable wrapper form, or as a pair of strings. - /// </summary> - /// <param name="inStream">The stream.</param> - /// <returns>Exception.</returns> - private CacheEntryProcessorException ReadException(IPortableStream inStream) - { - var item = Unmarshal<object>(inStream); - - var clsName = item as string; - - if (clsName == null) - return new CacheEntryProcessorException((Exception) ((PortableResultWrapper) item).Result); - - var msg = Unmarshal<string>(inStream); - - return new CacheEntryProcessorException(ExceptionUtils.GetException(clsName, msg)); - } - - /// <summary> - /// Read dictionary returned by GET_ALL operation. - /// </summary> - /// <param name="reader">Reader.</param> - /// <returns>Dictionary.</returns> - private static IDictionary<TK, TV> ReadGetAllDictionary(PortableReaderImpl reader) - { - IPortableStream stream = reader.Stream; - - if (stream.ReadBool()) - { - int size = stream.ReadInt(); - - IDictionary<TK, TV> res = new Dictionary<TK, TV>(size); - - for (int i = 0; i < size; i++) - { - TK key = reader.ReadObject<TK>(); - TV val = reader.ReadObject<TV>(); - - res[key] = val; - } - - return res; - } - return null; - } - - /// <summary> - /// Gets the future result converter based on the last operation id. - /// </summary> - /// <typeparam name="TResult">The type of the future result.</typeparam> - /// <param name="lastAsyncOpId">The last op id.</param> - /// <returns>Future result converter.</returns> - private Func<PortableReaderImpl, TResult> GetFutureResultConverter<TResult>(int lastAsyncOpId) - { - if (lastAsyncOpId == (int) CacheOp.GetAll) - return reader => (TResult)ReadGetAllDictionary(reader); - - if (lastAsyncOpId == (int)CacheOp.Invoke) - return reader => - { - var hasError = reader.ReadBoolean(); - - if (hasError) - throw ReadException(reader.Stream); - - return reader.ReadObject<TResult>(); - }; - - if (lastAsyncOpId == (int) CacheOp.InvokeAll) - return _invokeAllConverter.Value as Func<PortableReaderImpl, TResult>; - - return null; - } - } -}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheLock.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheLock.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheLock.cs deleted file mode 100644 index ceb3b05..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheLock.cs +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache -{ - using System; - using System.Diagnostics; - using System.Threading; - using Apache.Ignite.Core.Cache; - using Apache.Ignite.Core.Impl.Unmanaged; - using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils; - - /// <summary> - /// Cache lock implementation. - /// </summary> - internal class CacheLock : ICacheLock - { - /** Unique lock ID.*/ - private readonly long _id; - - /** Cache. */ - private readonly IUnmanagedTarget _cache; - - /** State (-1 for disposed, >=0 for number of currently executing methods). */ - private int _state; - - /** Current number of lock contenders. */ - private int _counter; - - /// <summary> - /// Initializes a new instance of the <see cref="CacheLock"/> class. - /// </summary> - /// <param name="id">Lock id.</param> - /// <param name="cache">Cache.</param> - public CacheLock(long id, IUnmanagedTarget cache) - { - Debug.Assert(cache != null); - - _id = id; - _cache = cache; - } - - /** <inheritDoc /> */ - public void Enter() - { - lock (this) - { - ThrowIfDisposed(); - - _state++; - } - - var res = false; - - try - { - UU.CacheEnterLock(_cache, _id); - - res = true; - } - finally - { - lock (this) - { - if (res) - _counter++; - - _state--; - } - } - } - - /** <inheritDoc /> */ - public bool TryEnter() - { - return TryEnter(TimeSpan.FromMilliseconds(-1)); - } - - /** <inheritDoc /> */ - public bool TryEnter(TimeSpan timeout) - { - lock (this) - { - ThrowIfDisposed(); - - _state++; - } - - var res = false; - - try - { - return res = UU.CacheTryEnterLock(_cache, _id, (long)timeout.TotalMilliseconds); - } - finally - { - lock (this) - { - if (res) - _counter++; - - _state--; - } - } - } - - /** <inheritDoc /> */ - public void Exit() - { - lock (this) - { - ThrowIfDisposed(); - - UU.CacheExitLock(_cache, _id); - - _counter--; - } - } - - /** <inheritDoc /> */ - public void Dispose() - { - lock (this) - { - ThrowIfDisposed(); - - if (_state > 0 || _counter > 0) - throw new SynchronizationLockException( - "The lock is being disposed while still being used. " + - "It either is being held by a thread and/or has active waiters waiting to acquire the lock."); - - UU.CacheCloseLock(_cache, _id); - - _state = -1; - - GC.SuppressFinalize(this); - } - } - - /// <summary> - /// Finalizes an instance of the <see cref="CacheLock"/> class. - /// </summary> - ~CacheLock() - { - UU.CacheCloseLock(_cache, _id); - } - - /// <summary> - /// Throws <see cref="ObjectDisposedException"/> if this instance has been disposed. - /// </summary> - private void ThrowIfDisposed() - { - if (_state < 0) - throw new ObjectDisposedException("CacheLock", "CacheLock has been disposed."); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheMetricsImpl.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheMetricsImpl.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheMetricsImpl.cs deleted file mode 100644 index b5982f6..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheMetricsImpl.cs +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache -{ - using Apache.Ignite.Core.Cache; - using Apache.Ignite.Core.Portable; - - /// <summary> - /// Cache metrics used to obtain statistics on cache. - /// </summary> - internal class CacheMetricsImpl : ICacheMetrics - { - /// <summary> - /// Initializes a new instance of the <see cref="CacheMetricsImpl"/> class. - /// </summary> - /// <param name="reader">The reader.</param> - public CacheMetricsImpl(IPortableRawReader reader) - { - CacheGets = reader.ReadLong(); - CachePuts = reader.ReadLong(); - CacheHits = reader.ReadLong(); - CacheMisses = reader.ReadLong(); - CacheTxCommits = reader.ReadLong(); - CacheTxRollbacks = reader.ReadLong(); - CacheEvictions = reader.ReadLong(); - CacheRemovals = reader.ReadLong(); - AveragePutTime = reader.ReadFloat(); - AverageGetTime = reader.ReadFloat(); - AverageRemoveTime = reader.ReadFloat(); - AverageTxCommitTime = reader.ReadFloat(); - AverageTxRollbackTime = reader.ReadFloat(); - CacheName = reader.ReadString(); - OverflowSize = reader.ReadLong(); - OffHeapEntriesCount = reader.ReadLong(); - OffHeapAllocatedSize = reader.ReadLong(); - Size = reader.ReadInt(); - KeySize = reader.ReadInt(); - IsEmpty = reader.ReadBoolean(); - DhtEvictQueueCurrentSize = reader.ReadInt(); - TxThreadMapSize = reader.ReadInt(); - TxXidMapSize = reader.ReadInt(); - TxCommitQueueSize = reader.ReadInt(); - TxPrepareQueueSize = reader.ReadInt(); - TxStartVersionCountsSize = reader.ReadInt(); - TxCommittedVersionsSize = reader.ReadInt(); - TxRolledbackVersionsSize = reader.ReadInt(); - TxDhtThreadMapSize = reader.ReadInt(); - TxDhtXidMapSize = reader.ReadInt(); - TxDhtCommitQueueSize = reader.ReadInt(); - TxDhtPrepareQueueSize = reader.ReadInt(); - TxDhtStartVersionCountsSize = reader.ReadInt(); - TxDhtCommittedVersionsSize = reader.ReadInt(); - TxDhtRolledbackVersionsSize = reader.ReadInt(); - IsWriteBehindEnabled = reader.ReadBoolean(); - WriteBehindFlushSize = reader.ReadInt(); - WriteBehindFlushThreadCount = reader.ReadInt(); - WriteBehindFlushFrequency = reader.ReadLong(); - WriteBehindStoreBatchSize = reader.ReadInt(); - WriteBehindTotalCriticalOverflowCount = reader.ReadInt(); - WriteBehindCriticalOverflowCount = reader.ReadInt(); - WriteBehindErrorRetryCount = reader.ReadInt(); - WriteBehindBufferSize = reader.ReadInt(); - KeyType = reader.ReadString(); - ValueType = reader.ReadString(); - IsStoreByValue = reader.ReadBoolean(); - IsStatisticsEnabled = reader.ReadBoolean(); - IsManagementEnabled = reader.ReadBoolean(); - IsReadThrough = reader.ReadBoolean(); - IsWriteThrough = reader.ReadBoolean(); - CacheHitPercentage = reader.ReadFloat(); - CacheMissPercentage = reader.ReadFloat(); - } - - /** <inheritdoc /> */ - public long CacheHits { get; private set; } - - /** <inheritdoc /> */ - public float CacheHitPercentage { get; private set; } - - /** <inheritdoc /> */ - public long CacheMisses { get; private set; } - - /** <inheritdoc /> */ - public float CacheMissPercentage { get; private set; } - - /** <inheritdoc /> */ - public long CacheGets { get; private set; } - - /** <inheritdoc /> */ - public long CachePuts { get; private set; } - - /** <inheritdoc /> */ - public long CacheRemovals { get; private set; } - - /** <inheritdoc /> */ - public long CacheEvictions { get; private set; } - - /** <inheritdoc /> */ - public float AverageGetTime { get; private set; } - - /** <inheritdoc /> */ - public float AveragePutTime { get; private set; } - - /** <inheritdoc /> */ - public float AverageRemoveTime { get; private set; } - - /** <inheritdoc /> */ - public float AverageTxCommitTime { get; private set; } - - /** <inheritdoc /> */ - public float AverageTxRollbackTime { get; private set; } - - /** <inheritdoc /> */ - public long CacheTxCommits { get; private set; } - - /** <inheritdoc /> */ - public long CacheTxRollbacks { get; private set; } - - /** <inheritdoc /> */ - public string CacheName { get; private set; } - - /** <inheritdoc /> */ - public long OverflowSize { get; private set; } - - /** <inheritdoc /> */ - public long OffHeapEntriesCount { get; private set; } - - /** <inheritdoc /> */ - public long OffHeapAllocatedSize { get; private set; } - - /** <inheritdoc /> */ - public int Size { get; private set; } - - /** <inheritdoc /> */ - public int KeySize { get; private set; } - - /** <inheritdoc /> */ - public bool IsEmpty { get; private set; } - - /** <inheritdoc /> */ - public int DhtEvictQueueCurrentSize { get; private set; } - - /** <inheritdoc /> */ - public int TxThreadMapSize { get; private set; } - - /** <inheritdoc /> */ - public int TxXidMapSize { get; private set; } - - /** <inheritdoc /> */ - public int TxCommitQueueSize { get; private set; } - - /** <inheritdoc /> */ - public int TxPrepareQueueSize { get; private set; } - - /** <inheritdoc /> */ - public int TxStartVersionCountsSize { get; private set; } - - /** <inheritdoc /> */ - public int TxCommittedVersionsSize { get; private set; } - - /** <inheritdoc /> */ - public int TxRolledbackVersionsSize { get; private set; } - - /** <inheritdoc /> */ - public int TxDhtThreadMapSize { get; private set; } - - /** <inheritdoc /> */ - public int TxDhtXidMapSize { get; private set; } - - /** <inheritdoc /> */ - public int TxDhtCommitQueueSize { get; private set; } - - /** <inheritdoc /> */ - public int TxDhtPrepareQueueSize { get; private set; } - - /** <inheritdoc /> */ - public int TxDhtStartVersionCountsSize { get; private set; } - - /** <inheritdoc /> */ - public int TxDhtCommittedVersionsSize { get; private set; } - - /** <inheritdoc /> */ - public int TxDhtRolledbackVersionsSize { get; private set; } - - /** <inheritdoc /> */ - public bool IsWriteBehindEnabled { get; private set; } - - /** <inheritdoc /> */ - public int WriteBehindFlushSize { get; private set; } - - /** <inheritdoc /> */ - public int WriteBehindFlushThreadCount { get; private set; } - - /** <inheritdoc /> */ - public long WriteBehindFlushFrequency { get; private set; } - - /** <inheritdoc /> */ - public int WriteBehindStoreBatchSize { get; private set; } - - /** <inheritdoc /> */ - public int WriteBehindTotalCriticalOverflowCount { get; private set; } - - /** <inheritdoc /> */ - public int WriteBehindCriticalOverflowCount { get; private set; } - - /** <inheritdoc /> */ - public int WriteBehindErrorRetryCount { get; private set; } - - /** <inheritdoc /> */ - public int WriteBehindBufferSize { get; private set; } - - /** <inheritdoc /> */ - public string KeyType { get; private set; } - - /** <inheritdoc /> */ - public string ValueType { get; private set; } - - /** <inheritdoc /> */ - public bool IsStoreByValue { get; private set; } - - /** <inheritdoc /> */ - public bool IsStatisticsEnabled { get; private set; } - - /** <inheritdoc /> */ - public bool IsManagementEnabled { get; private set; } - - /** <inheritdoc /> */ - public bool IsReadThrough { get; private set; } - - /** <inheritdoc /> */ - public bool IsWriteThrough { get; private set; } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheOp.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheOp.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheOp.cs deleted file mode 100644 index 3eb63ca..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheOp.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache -{ - /// <summary> - /// Cache opcodes. - /// </summary> - internal enum CacheOp - { - Clear = 1, - ClearAll = 2, - ContainsKey = 3, - ContainsKeys = 4, - Get = 5, - GetAll = 6, - GetAndPut = 7, - GetAndPutIfAbsent = 8, - GetAndRemove = 9, - GetAndReplace = 10, - GetName = 11, - Invoke = 12, - InvokeAll = 13, - IsLocalLocked = 14, - LoadCache = 15, - LocEvict = 16, - LocLoadCache = 17, - LocPromote = 18, - LocalClear = 20, - LocalClearAll = 21, - Lock = 22, - LockAll = 23, - Metrics = 24, - Peek = 25, - Put = 26, - PutAll = 27, - PutIfAbsent = 28, - QryContinuous = 29, - QryScan = 30, - QrySql = 31, - QrySqlFields = 32, - QryTxt = 33, - RemoveAll = 34, - RemoveBool = 35, - RemoveObj = 36, - Replace2 = 37, - Replace3 = 38 - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheProxyImpl.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheProxyImpl.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheProxyImpl.cs deleted file mode 100644 index bfd7866..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/CacheProxyImpl.cs +++ /dev/null @@ -1,500 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache -{ - using System.Collections; - using System.Collections.Generic; - using System.Diagnostics; - using System.Diagnostics.CodeAnalysis; - using System.Threading; - using Apache.Ignite.Core.Cache; - using Apache.Ignite.Core.Cache.Expiry; - using Apache.Ignite.Core.Cache.Query; - using Apache.Ignite.Core.Cache.Query.Continuous; - using Apache.Ignite.Core.Common; - - /// <summary> - /// Cache proxy. - /// </summary> - [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")] - internal class CacheProxyImpl<TK, TV> : ICache<TK, TV> - { - /** wrapped cache instance */ - private readonly CacheImpl<TK, TV> _cache; - - /** */ - private readonly ThreadLocal<int> _lastAsyncOp = new ThreadLocal<int>(() => PlatformTarget.OpNone); - - /// <summary> - /// Initializes a new instance of the <see cref="CacheProxyImpl{K, V}"/> class. - /// </summary> - /// <param name="cache">The cache to wrap.</param> - public CacheProxyImpl(CacheImpl<TK, TV> cache) - { - Debug.Assert(cache != null); - - _cache = cache; - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithSkipStore() - { - return _cache.IsSkipStore ? this : new CacheProxyImpl<TK, TV>((CacheImpl<TK, TV>)_cache.WithSkipStore()); - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithExpiryPolicy(IExpiryPolicy plc) - { - return new CacheProxyImpl<TK, TV>((CacheImpl<TK, TV>)_cache.WithExpiryPolicy(plc)); - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithAsync() - { - return IsAsync ? this : new CacheProxyImpl<TK, TV>((CacheImpl<TK, TV>) _cache.WithAsync()); - } - - /** <inheritDoc /> */ - public bool IsAsync - { - get { return _cache.IsAsync; } - } - - /** <inheritDoc /> */ - public IFuture GetFuture() - { - return GetFuture<object>(); - } - - /** <inheritDoc /> */ - public IFuture<TResult> GetFuture<TResult>() - { - var fut = _cache.GetFuture<TResult>(_lastAsyncOp.Value); - - ClearLastAsyncOp(); - - return fut; - } - - /** <inheritDoc /> */ - public IEnumerator<ICacheEntry<TK, TV>> GetEnumerator() - { - return _cache.GetEnumerator(); - } - - /** <inheritDoc /> */ - IEnumerator IEnumerable.GetEnumerator() - { - return ((IEnumerable) _cache).GetEnumerator(); - } - - /** <inheritDoc /> */ - public string Name - { - get { return _cache.Name; } - } - - /** <inheritDoc /> */ - public IIgnite Ignite - { - get { return _cache.Ignite; } - } - - /** <inheritDoc /> */ - - public bool IsEmpty() - { - return _cache.IsEmpty(); - } - - /** <inheritDoc /> */ - public bool IsKeepPortable - { - get { return _cache.IsKeepPortable; } - } - - /// <summary> - /// Skip store flag. - /// </summary> - internal bool SkipStore - { - get { return _cache.IsSkipStore; } - } - - /** <inheritDoc /> */ - public ICache<TK1, TV1> WithKeepPortable<TK1, TV1>() - { - return new CacheProxyImpl<TK1, TV1>((CacheImpl<TK1, TV1>) _cache.WithKeepPortable<TK1, TV1>()); - } - - /** <inheritDoc /> */ - public void LoadCache(ICacheEntryFilter<TK, TV> p, params object[] args) - { - _cache.LoadCache(p, args); - - SetLastAsyncOp(CacheOp.LoadCache); - } - - /** <inheritDoc /> */ - public void LocalLoadCache(ICacheEntryFilter<TK, TV> p, params object[] args) - { - _cache.LocalLoadCache(p, args); - - SetLastAsyncOp(CacheOp.LocLoadCache); - } - - /** <inheritDoc /> */ - public bool ContainsKey(TK key) - { - var result = _cache.ContainsKey(key); - - SetLastAsyncOp(CacheOp.ContainsKey); - - return result; - } - - /** <inheritDoc /> */ - public bool ContainsKeys(IEnumerable<TK> keys) - { - var result = _cache.ContainsKeys(keys); - - SetLastAsyncOp(CacheOp.ContainsKeys); - - return result; - } - - /** <inheritDoc /> */ - public TV LocalPeek(TK key, params CachePeekMode[] modes) - { - return _cache.LocalPeek(key, modes); - } - - /** <inheritDoc /> */ - public TV Get(TK key) - { - var result = _cache.Get(key); - - SetLastAsyncOp(CacheOp.Get); - - return result; - } - - /** <inheritDoc /> */ - public IDictionary<TK, TV> GetAll(IEnumerable<TK> keys) - { - var result = _cache.GetAll(keys); - - SetLastAsyncOp(CacheOp.GetAll); - - return result; - } - - /** <inheritDoc /> */ - public void Put(TK key, TV val) - { - _cache.Put(key, val); - - SetLastAsyncOp(CacheOp.Put); - } - - /** <inheritDoc /> */ - public TV GetAndPut(TK key, TV val) - { - var result = _cache.GetAndPut(key, val); - - SetLastAsyncOp(CacheOp.GetAndPut); - - return result; - } - - /** <inheritDoc /> */ - public TV GetAndReplace(TK key, TV val) - { - var result = _cache.GetAndReplace(key, val); - - SetLastAsyncOp(CacheOp.GetAndReplace); - - return result; - } - - /** <inheritDoc /> */ - public TV GetAndRemove(TK key) - { - var result = _cache.GetAndRemove(key); - - SetLastAsyncOp(CacheOp.GetAndRemove); - - return result; - } - - /** <inheritDoc /> */ - public bool PutIfAbsent(TK key, TV val) - { - var result = _cache.PutIfAbsent(key, val); - - SetLastAsyncOp(CacheOp.PutIfAbsent); - - return result; - } - - /** <inheritDoc /> */ - public TV GetAndPutIfAbsent(TK key, TV val) - { - var result = _cache.GetAndPutIfAbsent(key, val); - - SetLastAsyncOp(CacheOp.GetAndPutIfAbsent); - - return result; - } - - /** <inheritDoc /> */ - public bool Replace(TK key, TV val) - { - var result = _cache.Replace(key, val); - - SetLastAsyncOp(CacheOp.Replace2); - - return result; - } - - /** <inheritDoc /> */ - public bool Replace(TK key, TV oldVal, TV newVal) - { - var result = _cache.Replace(key, oldVal, newVal); - - SetLastAsyncOp(CacheOp.Replace3); - - return result; - } - - /** <inheritDoc /> */ - public void PutAll(IDictionary<TK, TV> vals) - { - _cache.PutAll(vals); - - SetLastAsyncOp(CacheOp.PutAll); - } - - /** <inheritDoc /> */ - public void LocalEvict(IEnumerable<TK> keys) - { - _cache.LocalEvict(keys); - } - - /** <inheritDoc /> */ - public void Clear() - { - _cache.Clear(); - - ClearLastAsyncOp(); - } - - /** <inheritDoc /> */ - public void Clear(TK key) - { - _cache.Clear(key); - - SetLastAsyncOp(CacheOp.Clear); - } - - /** <inheritDoc /> */ - public void ClearAll(IEnumerable<TK> keys) - { - _cache.ClearAll(keys); - - SetLastAsyncOp(CacheOp.ClearAll); - } - - /** <inheritDoc /> */ - public void LocalClear(TK key) - { - _cache.LocalClear(key); - } - - /** <inheritDoc /> */ - public void LocalClearAll(IEnumerable<TK> keys) - { - _cache.LocalClearAll(keys); - } - - /** <inheritDoc /> */ - public bool Remove(TK key) - { - var result = _cache.Remove(key); - - SetLastAsyncOp(CacheOp.RemoveObj); - - return result; - } - - /** <inheritDoc /> */ - public bool Remove(TK key, TV val) - { - var result = _cache.Remove(key, val); - - SetLastAsyncOp(CacheOp.RemoveBool); - - return result; - } - - /** <inheritDoc /> */ - public void RemoveAll(IEnumerable<TK> keys) - { - _cache.RemoveAll(keys); - - SetLastAsyncOp(CacheOp.RemoveAll); - } - - /** <inheritDoc /> */ - public void RemoveAll() - { - _cache.RemoveAll(); - - ClearLastAsyncOp(); - } - - /** <inheritDoc /> */ - public int GetLocalSize(params CachePeekMode[] modes) - { - return _cache.GetLocalSize(modes); - } - - /** <inheritDoc /> */ - public int GetSize(params CachePeekMode[] modes) - { - var result = _cache.GetSize(modes); - - ClearLastAsyncOp(); - - return result; - } - - /** <inheritDoc /> */ - public void LocalPromote(IEnumerable<TK> keys) - { - _cache.LocalPromote(keys); - } - - /** <inheritDoc /> */ - public IQueryCursor<ICacheEntry<TK, TV>> Query(QueryBase qry) - { - return _cache.Query(qry); - } - - /** <inheritDoc /> */ - public IQueryCursor<IList> QueryFields(SqlFieldsQuery qry) - { - return _cache.QueryFields(qry); - } - - /** <inheritDoc /> */ - public IContinuousQueryHandle QueryContinuous(ContinuousQuery<TK, TV> qry) - { - return _cache.QueryContinuous(qry); - } - - /** <inheritDoc /> */ - public IContinuousQueryHandle<ICacheEntry<TK, TV>> QueryContinuous(ContinuousQuery<TK, TV> qry, QueryBase initialQry) - { - return _cache.QueryContinuous(qry, initialQry); - } - - /** <inheritDoc /> */ - public IEnumerable<ICacheEntry<TK, TV>> GetLocalEntries(params CachePeekMode[] peekModes) - { - return _cache.GetLocalEntries(peekModes); - } - - /** <inheritDoc /> */ - public TR Invoke<TR, TA>(TK key, ICacheEntryProcessor<TK, TV, TA, TR> processor, TA arg) - { - var result = _cache.Invoke(key, processor, arg); - - SetLastAsyncOp(CacheOp.Invoke); - - return result; - } - - /** <inheritDoc /> */ - public IDictionary<TK, ICacheEntryProcessorResult<TR>> InvokeAll<TR, TA>(IEnumerable<TK> keys, - ICacheEntryProcessor<TK, TV, TA, TR> processor, TA arg) - { - var result = _cache.InvokeAll(keys, processor, arg); - - SetLastAsyncOp(CacheOp.InvokeAll); - - return result; - } - - /** <inheritDoc /> */ - public ICacheLock Lock(TK key) - { - return _cache.Lock(key); - } - - /** <inheritDoc /> */ - public ICacheLock LockAll(IEnumerable<TK> keys) - { - return _cache.LockAll(keys); - } - - /** <inheritDoc /> */ - public bool IsLocalLocked(TK key, bool byCurrentThread) - { - return _cache.IsLocalLocked(key, byCurrentThread); - } - - /** <inheritDoc /> */ - public ICacheMetrics GetMetrics() - { - return _cache.GetMetrics(); - } - - /** <inheritDoc /> */ - public IFuture Rebalance() - { - return _cache.Rebalance(); - } - - /** <inheritDoc /> */ - public ICache<TK, TV> WithNoRetries() - { - return _cache.IsNoRetries ? this : new CacheProxyImpl<TK, TV>((CacheImpl<TK, TV>) _cache.WithNoRetries()); - } - - /// <summary> - /// Sets the last asynchronous op id. - /// </summary> - /// <param name="opId">The op identifier.</param> - private void SetLastAsyncOp(CacheOp opId) - { - if (IsAsync) - _lastAsyncOp.Value = (int) opId; - } - - /// <summary> - /// Clears the last asynchronous op id. - /// This should be called in the end of each method that supports async and does not call SetLastAsyncOp. - /// </summary> - private void ClearLastAsyncOp() - { - if (IsAsync) - _lastAsyncOp.Value = PlatformTarget.OpNone; - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryCreateEvent.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryCreateEvent.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryCreateEvent.cs deleted file mode 100644 index 8d9dfef..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryCreateEvent.cs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache.Event -{ - using Apache.Ignite.Core.Cache.Event; - - /// <summary> - /// Cache entry create event. - /// </summary> - internal class CacheEntryCreateEvent<TK, TV> : ICacheEntryEvent<TK, TV> - { - /** Key.*/ - private readonly TK _key; - - /** Value.*/ - private readonly TV _val; - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="key">Key.</param> - /// <param name="val">Value.</param> - public CacheEntryCreateEvent(TK key, TV val) - { - _key = key; - _val = val; - } - - /** <inheritdoc /> */ - public TK Key - { - get { return _key; } - } - - /** <inheritdoc /> */ - public TV Value - { - get { return _val; } - } - - /** <inheritdoc /> */ - public TV OldValue - { - get { return default(TV); } - } - - /** <inheritdoc /> */ - public bool HasOldValue - { - get { return false; } - } - - /** <inheritdoc /> */ - public CacheEntryEventType EventType - { - get { return CacheEntryEventType.Created; } - } - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryRemoveEvent.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryRemoveEvent.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryRemoveEvent.cs deleted file mode 100644 index a44a800..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryRemoveEvent.cs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache.Event -{ - using Apache.Ignite.Core.Cache.Event; - - /// <summary> - /// Cache entry remove event. - /// </summary> - internal class CacheEntryRemoveEvent<TK, TV> : ICacheEntryEvent<TK, TV> - { - /** Key.*/ - private readonly TK _key; - - /** Old value.*/ - private readonly TV _oldVal; - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="key">Key.</param> - /// <param name="oldVal">Old value.</param> - public CacheEntryRemoveEvent(TK key, TV oldVal) - { - _key = key; - _oldVal = oldVal; - } - - /** <inheritdoc /> */ - public TK Key - { - get { return _key; } - } - - /** <inheritdoc /> */ - public TV Value - { - get { return default(TV); } - } - - /** <inheritdoc /> */ - public TV OldValue - { - get { return _oldVal; } - } - - /** <inheritdoc /> */ - public bool HasOldValue - { - get { return true; } - } - - /** <inheritdoc /> */ - public CacheEntryEventType EventType - { - get { return CacheEntryEventType.Removed; } - } - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryUpdateEvent.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryUpdateEvent.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryUpdateEvent.cs deleted file mode 100644 index e6fb927..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Event/CacheEntryUpdateEvent.cs +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache.Event -{ - using Apache.Ignite.Core.Cache.Event; - - /// <summary> - /// Cache entry update event. - /// </summary> - internal class CacheEntryUpdateEvent<TK, TV> : ICacheEntryEvent<TK, TV> - { - /** Key.*/ - private readonly TK _key; - - /** Value.*/ - private readonly TV _val; - - /** Old value.*/ - private readonly TV _oldVal; - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="key">Key.</param> - /// <param name="oldVal">Old value.</param> - /// <param name="val">Value.</param> - public CacheEntryUpdateEvent(TK key, TV oldVal, TV val) - { - _key = key; - _oldVal = oldVal; - _val = val; - } - - /** <inheritdoc /> */ - public TK Key - { - get { return _key; } - } - - /** <inheritdoc /> */ - public TV Value - { - get { return _val; } - } - - /** <inheritdoc /> */ - public TV OldValue - { - get { return _oldVal; } - } - - /** <inheritdoc /> */ - public bool HasOldValue - { - get { return true; } - } - - /** <inheritdoc /> */ - public CacheEntryEventType EventType - { - get { return CacheEntryEventType.Updated; } - } - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/MutableCacheEntry.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/MutableCacheEntry.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/MutableCacheEntry.cs deleted file mode 100644 index 2c69043..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/MutableCacheEntry.cs +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache -{ - using System; - using Apache.Ignite.Core.Cache; - using Apache.Ignite.Core.Impl.Common; - - /// <summary> - /// Represents a cache entry. - /// </summary> - internal class MutableCacheEntry<TK, TV> : IMutableCacheEntry<TK, TV>, IMutableCacheEntryInternal - { - // Entry value - private TV _value; - - /// <summary> - /// Initializes a new instance of the <see cref="MutableCacheEntry{K, V}"/> class. - /// </summary> - /// <param name="key">The key.</param> - public MutableCacheEntry(TK key) - { - Key = key; - } - - /// <summary> - /// Initializes a new instance of the <see cref="MutableCacheEntry{K, V}"/> class. - /// </summary> - /// <param name="key">The key.</param> - /// <param name="value">The value.</param> - public MutableCacheEntry(TK key, TV value) - { - Key = key; - _value = value; - Exists = true; - } - - /** <inheritdoc /> */ - public TK Key { get; private set; } - - /** <inheritdoc /> */ - object IMutableCacheEntryInternal.Key - { - get { return Key; } - } - - /** <inheritdoc /> */ - public TV Value - { - get { return _value; } - set - { - _value = value; - Exists = true; - State = MutableCacheEntryState.ValueSet; - } - } - - /** <inheritdoc /> */ - object IMutableCacheEntryInternal.Value - { - get { return Value; } - } - - /** <inheritdoc /> */ - public bool Exists { get; private set; } - - /** <inheritdoc /> */ - public void Remove() - { - Value = default(TV); - Exists = false; - State = MutableCacheEntryState.Removed; - } - - /** <inheritdoc /> */ - public MutableCacheEntryState State { get; private set; } - } - - /// <summary> - /// Internal non-generic representation of a mutable cache entry. - /// </summary> - internal interface IMutableCacheEntryInternal - { - /// <summary> - /// Gets the key. - /// </summary> - object Key { get; } - - /// <summary> - /// Gets the value. - /// </summary> - object Value { get; } - - /// <summary> - /// Gets a value indicating whether cache entry exists. - /// </summary> - bool Exists { get; } - - /// <summary> - /// Gets the state indicating user operation on this instance. - /// </summary> - MutableCacheEntryState State { get; } - } - - /// <summary> - /// Mutable cache entry factory. - /// </summary> - internal static class MutableCacheEntry - { - private static readonly CopyOnWriteConcurrentDictionary<Tuple<Type, Type>, Func<object, object, bool, IMutableCacheEntryInternal>> - Ctors = new CopyOnWriteConcurrentDictionary<Tuple<Type, Type>, Func<object, object, bool, IMutableCacheEntryInternal>>(); - - public static Func<object, object, bool, IMutableCacheEntryInternal> GetCtor(Type keyType, Type valType) - { - Func<object, object, bool, IMutableCacheEntryInternal> result; - var funcKey = new Tuple<Type, Type>(keyType, valType); - - return Ctors.TryGetValue(funcKey, out result) - ? result - : Ctors.GetOrAdd(funcKey, x => - { - var entryType = typeof (MutableCacheEntry<,>).MakeGenericType(keyType, valType); - - var oneArg = DelegateConverter.CompileCtor<Func<object, IMutableCacheEntryInternal>>(entryType, - new[] {keyType}, false); - - var twoArg = - DelegateConverter.CompileCtor<Func<object, object, IMutableCacheEntryInternal>>(entryType, - new[] {keyType, valType}, false); - - return (k, v, exists) => exists ? twoArg(k, v) : oneArg(k); - }); - } - } - - /// <summary> - /// Represents result of user operation on a mutable cache entry. - /// </summary> - internal enum MutableCacheEntryState : byte - { - Intact = 0, - ValueSet = 1, - Removed = 2, - ErrPortable = 3, - ErrString = 4 - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/f0bac562/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs b/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs deleted file mode 100644 index 0f4b5a3..0000000 --- a/modules/platform/src/main/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace Apache.Ignite.Core.Impl.Cache.Query -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Diagnostics.CodeAnalysis; - using Apache.Ignite.Core.Cache.Query; - using Apache.Ignite.Core.Impl.Portable; - using Apache.Ignite.Core.Impl.Portable.IO; - using Apache.Ignite.Core.Impl.Unmanaged; - using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils; - - /// <summary> - /// Abstract query cursor implementation. - /// </summary> - internal abstract class AbstractQueryCursor<T> : PlatformDisposableTarget, IQueryCursor<T>, IEnumerator<T> - { - /** */ - private const int OpGetAll = 1; - - /** */ - private const int OpGetBatch = 2; - - /** Position before head. */ - private const int BatchPosBeforeHead = -1; - - /** Keep portable flag. */ - private readonly bool _keepPortable; - - /** Wherther "GetAll" was called. */ - private bool _getAllCalled; - - /** Whether "GetEnumerator" was called. */ - private bool _iterCalled; - - /** Batch with entries. */ - private T[] _batch; - - /** Current position in batch. */ - private int _batchPos = BatchPosBeforeHead; - - /// <summary> - /// Constructor. - /// </summary> - /// <param name="target">Target.</param> - /// <param name="marsh">Marshaller.</param> - /// <param name="keepPortable">Keep portable flag.</param> - protected AbstractQueryCursor(IUnmanagedTarget target, PortableMarshaller marsh, bool keepPortable) : - base(target, marsh) - { - _keepPortable = keepPortable; - } - - #region Public methods - - /** <inheritdoc /> */ - public IList<T> GetAll() - { - ThrowIfDisposed(); - - if (_iterCalled) - throw new InvalidOperationException("Failed to get all entries because GetEnumerator() " + - "method has already been called."); - - if (_getAllCalled) - throw new InvalidOperationException("Failed to get all entries because GetAll() " + - "method has already been called."); - - var res = DoInOp<IList<T>>(OpGetAll, ConvertGetAll); - - _getAllCalled = true; - - return res; - } - - /** <inheritdoc /> */ - protected override void Dispose(bool disposing) - { - try - { - UU.QueryCursorClose(Target); - } - finally - { - base.Dispose(disposing); - } - } - - #endregion - - #region Public IEnumerable methods - - /** <inheritdoc /> */ - [SuppressMessage("ReSharper", "PossibleNullReferenceException")] - public IEnumerator<T> GetEnumerator() - { - ThrowIfDisposed(); - - if (_iterCalled) - throw new InvalidOperationException("Failed to get enumerator entries because " + - "GetEnumeartor() method has already been called."); - - if (_getAllCalled) - throw new InvalidOperationException("Failed to get enumerator entries because " + - "GetAll() method has already been called."); - - UU.QueryCursorIterator(Target); - - _iterCalled = true; - - return this; - } - - /** <inheritdoc /> */ - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - #endregion - - #region Public IEnumerator methods - - /** <inheritdoc /> */ - public T Current - { - get - { - ThrowIfDisposed(); - - if (_batchPos == BatchPosBeforeHead) - throw new InvalidOperationException("MoveNext has not been called."); - - if (_batch == null) - throw new InvalidOperationException("Previous call to MoveNext returned false."); - - return _batch[_batchPos]; - } - } - - /** <inheritdoc /> */ - object IEnumerator.Current - { - get { return Current; } - } - - /** <inheritdoc /> */ - public bool MoveNext() - { - ThrowIfDisposed(); - - if (_batch == null) - { - if (_batchPos == BatchPosBeforeHead) - // Standing before head, let's get batch and advance position. - RequestBatch(); - } - else - { - _batchPos++; - - if (_batch.Length == _batchPos) - // Reached batch end => request another. - RequestBatch(); - } - - return _batch != null; - } - - /** <inheritdoc /> */ - public void Reset() - { - throw new NotSupportedException("Reset is not supported."); - } - - #endregion - - #region Non-public methods - - /// <summary> - /// Read entry from the reader. - /// </summary> - /// <param name="reader">Reader.</param> - /// <returns>Entry.</returns> - protected abstract T Read(PortableReaderImpl reader); - - /** <inheritdoc /> */ - protected override T1 Unmarshal<T1>(IPortableStream stream) - { - return Marshaller.Unmarshal<T1>(stream, _keepPortable); - } - - /// <summary> - /// Request next batch. - /// </summary> - private void RequestBatch() - { - _batch = DoInOp<T[]>(OpGetBatch, ConvertGetBatch); - - _batchPos = 0; - } - - /// <summary> - /// Converter for GET_ALL operation. - /// </summary> - /// <param name="stream">Portable stream.</param> - /// <returns>Result.</returns> - private IList<T> ConvertGetAll(IPortableStream stream) - { - var reader = Marshaller.StartUnmarshal(stream, _keepPortable); - - var size = reader.ReadInt(); - - var res = new List<T>(size); - - for (var i = 0; i < size; i++) - res.Add(Read(reader)); - - return res; - } - - /// <summary> - /// Converter for GET_BATCH operation. - /// </summary> - /// <param name="stream">Portable stream.</param> - /// <returns>Result.</returns> - private T[] ConvertGetBatch(IPortableStream stream) - { - var reader = Marshaller.StartUnmarshal(stream, _keepPortable); - - var size = reader.ReadInt(); - - if (size == 0) - return null; - - var res = new T[size]; - - for (var i = 0; i < size; i++) - res[i] = Read(reader); - - return res; - } - - #endregion - - } -}
