blob: 4efefd70c7b643ec695b7fc2db9239203dc8b91d [file] [log] [blame]
/*
* 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.
*/
#ifndef _IGNITE_IMPL_THIN_CACHE_CACHE_CLIENT_IMPL
#define _IGNITE_IMPL_THIN_CACHE_CACHE_CLIENT_IMPL
#include <stdint.h>
#include <string>
#include <ignite/thin/cache/query/query_sql_fields.h>
#include "impl/data_router.h"
#include "impl/transactions/transactions_impl.h"
#include "impl/cache/query/query_fields_cursor_impl.h"
namespace ignite
{
namespace impl
{
namespace thin
{
/* Forward declaration. */
class Readable;
/* Forward declaration. */
class Writable;
/* Forward declaration. */
class WritableKey;
namespace cache
{
/**
* Ignite client class implementation.
*
* This is an entry point for Thin C++ Ignite client. Its main
* purpose is to establish connection to the remote server node.
*/
class CacheClientImpl
{
public:
/**
* Constructor.
*
* @param router Data router instance.
* @param name Cache name.
* @param id Cache ID.
*/
CacheClientImpl(
const SP_DataRouter& router,
const transactions::SP_TransactionsImpl& tx,
const std::string& name,
int32_t id);
/**
* Destructor.
*/
~CacheClientImpl();
/**
* Put value to cache.
*
* @param key Key.
* @param value Value.
*/
void Put(const WritableKey& key, const Writable& value);
/**
* Stores given key-value pairs in cache.
* If write-through is enabled, the stored values will be persisted to store.
*
* @param pairs Writable key-value pair sequence.
*/
void PutAll(const Writable& pairs);
/**
* Get value from cache.
*
* @param key Key.
* @param value Value.
*/
void Get(const WritableKey& key, Readable& value);
/**
* Retrieves values mapped to the specified keys from cache.
* If some value is not present in cache, then it will be looked up from swap storage. If
* it's not present in swap, or if swap is disabled, and if read-through is allowed, value
* will be loaded from persistent store.
*
* @param keys Writable key sequence.
* @param pairs Readable key-value pair sequence.
*/
void GetAll(const Writable& keys, Readable& pairs);
/**
* Stores given key-value pair in cache only if there is a previous mapping for it.
* If cache previously contained value for the given key, then this value is returned.
* In case of PARTITIONED or REPLICATED caches, the value will be loaded from the primary node,
* which in its turn may load the value from the swap storage, and consecutively, if it's not
* in swap, rom the underlying persistent storage.
* If write-through is enabled, the stored value will be persisted to store.
*
* @param key Key to store in cache.
* @param value Value to be associated with the given key.
* @return True if the value was replaced.
*/
bool Replace(const WritableKey& key, const Writable& value);
/**
* Check if the cache contains a value for the specified key.
*
* @param key Key whose presence in this cache is to be tested.
* @return @c true if the cache contains specified key.
*/
bool ContainsKey(const WritableKey& key);
/**
* Check if cache contains mapping for these keys.
*
* @param keys Keys.
* @return True if cache contains mapping for all these keys.
*/
bool ContainsKeys(const Writable& keys);
/**
* Gets the number of all entries cached across all nodes.
* @note This operation is distributed and will query all
* participating nodes for their cache sizes.
*
* @param peekModes Peek modes mask.
* @return Cache size across all nodes.
*/
int64_t GetSize(int32_t peekModes);
/**
* Removes given key mapping from cache. If cache previously contained value for the given key,
* then this value is returned. In case of PARTITIONED or REPLICATED caches, the value will be
* loaded from the primary node, which in its turn may load the value from the disk-based swap
* storage, and consecutively, if it's not in swap, from the underlying persistent storage.
* If the returned value is not needed, method removex() should always be used instead of this
* one to avoid the overhead associated with returning of the previous value.
* If write-through is enabled, the value will be removed from store.
*
* @param key Key whose mapping is to be removed from cache.
* @return False if there was no matching key.
*/
bool Remove(const WritableKey& key);
/**
* Removes given key mapping from cache if one exists and value is equal to the passed in value.
* If write-through is enabled, the value will be removed from store.
*
* @param key Key whose mapping is to be removed from cache.
* @param val Value to match against currently cached value.
* @return True if entry was removed, false otherwise.
*/
bool Remove(const WritableKey& key, const Writable& val);
/**
* Removes given key mappings from cache.
* If write-through is enabled, the value will be removed from store.
*
* @param keys Keys whose mappings are to be removed from cache.
*/
void RemoveAll(const Writable& keys);
/**
* Removes all mappings from cache.
* If write-through is enabled, the value will be removed from store.
*/
void RemoveAll();
/**
* Clear entry from the cache and swap storage, without notifying listeners or CacheWriters.
* Entry is cleared only if it is not currently locked, and is not participating in a transaction.
*
* @param key Key to clear.
*/
void Clear(const WritableKey& key);
/**
* Clear cache.
*/
void Clear();
/**
* Clear entries from the cache and swap storage, without notifying listeners or CacheWriters.
* Entry is cleared only if it is not currently locked, and is not participating in a transaction.
*
* @param keys Keys to clear.
*/
void ClearAll(const Writable& keys);
/**
* Peeks at in-memory cached value using default optional
* peek mode. This method will not load value from any
* persistent store or from a remote node.
*
* Use for testing purposes only.
*
* @param key Key whose presence in this cache is to be tested.
* @param value Value.
*/
void LocalPeek(const WritableKey& key, Readable& value);
/**
* Stores given key-value pair in cache only if the previous value is equal to the old value passed
* as argument.
*
* @param key Key to store in cache.
* @param oldVal Old value to match.
* @param newVal Value to be associated with the given key.
* @return True if replace happened, false otherwise.
*/
bool Replace(const WritableKey& key, const Writable& oldVal, const Writable& newVal);
/**
* Associates the specified value with the specified key in this cache, returning an existing value
* if one existed.
*
* @param key Key with which the specified value is to be associated.
* @param valIn Value to be associated with the specified key.
* @param valOut The value associated with the key at the start of the operation or null if none
* was associated.
*/
void GetAndPut(const WritableKey& key, const Writable& valIn, Readable& valOut);
/**
* Atomically removes the entry for a key only if currently mapped to some value.
*
* @param key Key with which the specified value is to be associated.
* @param valOut The value associated with the key at the start of the operation or null if none
* was associated.
*/
void GetAndRemove(const WritableKey& key, Readable& valOut);
/**
* Atomically replaces the value for a given key if and only if there is a value currently mapped by
* the key.
*
* @param key Key with which the specified value is to be associated.
* @param valIn Value to be associated with the specified key.
* @param valOut The value associated with the key at the start of the operation or null if none was
* associated.
*/
void GetAndReplace(const WritableKey& key, const Writable& valIn, Readable& valOut);
/**
* Atomically associates the specified key with the given value if it is not already associated with
* a value.
*
* @param key Key with which the specified value is to be associated.
* @param val Value to be associated with the specified key.
* @return True if a value was set.
*/
bool PutIfAbsent(const WritableKey& key, const Writable& val);
/**
* Stores given key-value pair in cache only if cache had no previous mapping for it.
*
* If cache previously contained value for the given key, then this value is returned.
*
* In case of PARTITIONED or REPLICATED caches, the value will be loaded from the primary node,
* which in its turn may load the value from the swap storage, and consecutively, if it's not in
* swap, from the underlying persistent storage.
*
* If the returned value is not needed, method putxIfAbsent() should be used instead of this one to
* avoid the overhead associated with returning of the previous value.
*
* If write-through is enabled, the stored value will be persisted to store.
*
* @param key Key to store in cache.
* @param valIn Value to be associated with the given key.
* @param valOut Previously contained value regardless of whether put happened or not (null if there
* was no previous value).
*/
void GetAndPutIfAbsent(const WritableKey& key, const Writable& valIn, Readable& valOut);
/**
* Perform SQL fields query.
*
* @param qry Query.
* @return Query cursor.
*/
query::SP_QueryFieldsCursorImpl Query(const ignite::thin::cache::query::SqlFieldsQuery &qry);
private:
/**
* Synchronously send request message and receive response.
*
* @param key Key.
* @param req Request message.
* @param rsp Response message.
* @throw IgniteError on error.
*/
template<typename ReqT, typename RspT>
void SyncCacheKeyMessage(const WritableKey& key, const ReqT& req, RspT& rsp);
/**
* Synchronously send message and receive response.
*
* @param req Request message.
* @param rsp Response message.
* @return Channel that was used for request.
* @throw IgniteError on error.
*/
template<typename ReqT, typename RspT>
SP_DataChannel SyncMessage(const ReqT& req, RspT& rsp);
/**
* Synchronously send request message and receive response taking in account that it can be
* transactional.
*
* @param key Key.
* @param req Request message.
* @param rsp Response message.
* @throw IgniteError on error.
*/
template<typename ReqT, typename RspT>
void TransactionalSyncCacheKeyMessage(const WritableKey& key, ReqT& req, RspT& rsp);
/**
* Synchronously send message and receive response taking in account that it can be transactional.
*
* @param req Request message.
* @param rsp Response message.
* @return Channel that was used for request.
* @throw IgniteError on error.
*/
template<typename ReqT, typename RspT>
void TransactionalSyncMessage(ReqT& req, RspT& rsp);
/***
* Check whether request is transactional and process it if it is.
* @tparam ReqT Request type.
* @tparam RspT Response type.
* @param req Request.
* @param rsp Response.
* @return @c true if processed and false otherwise.
*/
template<typename ReqT, typename RspT>
bool TryProcessTransactional(ReqT& req, RspT& rsp);
/** Data router. */
SP_DataRouter router;
/** Transactions. */
transactions::SP_TransactionsImpl tx;
/** Cache name. */
std::string name;
/** Cache ID. */
int32_t id;
/** Binary flag. */
bool binary;
};
typedef common::concurrent::SharedPointer<CacheClientImpl> SP_CacheClientImpl;
}
}
}
}
#endif // _IGNITE_IMPL_THIN_CACHE_CACHE_CLIENT_IMPL