コード例 #1
0
ファイル: CacheStore.cs プロジェクト: zhiqinghuang/ignite
        /// <summary>
        /// Invokes a store operation.
        /// </summary>
        /// <param name="input">Input stream.</param>
        /// <param name="cb">Callback.</param>
        /// <param name="grid">Grid.</param>
        /// <returns>Invocation result.</returns>
        /// <exception cref="IgniteException">Invalid operation type:  + opType</exception>
        public int Invoke(IPortableStream input, IUnmanagedTarget cb, Ignite grid)
        {
            IPortableReader reader = grid.Marshaller.StartUnmarshal(input,
                                                                    _convertPortable ? PortableMode.Deserialize : PortableMode.ForcePortable);

            IPortableRawReader rawReader = reader.RawReader();

            int opType = rawReader.ReadByte();

            // Setup cache sessoin for this invocation.
            long sesId = rawReader.ReadLong();

            CacheStoreSession ses = grid.HandleRegistry.Get <CacheStoreSession>(sesId, true);

            ses.CacheName = rawReader.ReadString();

            _sesProxy.SetSession(ses);

            try
            {
                // Perform operation.
                switch (opType)
                {
                case OpLoadCache:
                    _store.LoadCache((k, v) => WriteObjects(cb, grid, k, v), rawReader.ReadObjectArray <object>());

                    break;

                case OpLoad:
                    object val = _store.Load(rawReader.ReadObject <object>());

                    if (val != null)
                    {
                        WriteObjects(cb, grid, val);
                    }

                    break;

                case OpLoadAll:
                    var keys = rawReader.ReadCollection();

                    var result = _store.LoadAll(keys);

                    foreach (DictionaryEntry entry in result)
                    {
                        WriteObjects(cb, grid, entry.Key, entry.Value);
                    }

                    break;

                case OpPut:
                    _store.Write(rawReader.ReadObject <object>(), rawReader.ReadObject <object>());

                    break;

                case OpPutAll:
                    _store.WriteAll(rawReader.ReadDictionary());

                    break;

                case OpRmv:
                    _store.Delete(rawReader.ReadObject <object>());

                    break;

                case OpRmvAll:
                    _store.DeleteAll(rawReader.ReadCollection());

                    break;

                case OpSesEnd:
                    grid.HandleRegistry.Release(sesId);

                    _store.SessionEnd(rawReader.ReadBoolean());

                    break;

                default:
                    throw new IgniteException("Invalid operation type: " + opType);
                }

                return(0);
            }
            finally
            {
                _sesProxy.ClearSession();
            }
        }