myxlib/src/myx/redis/client.hpp

158 lines
6.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef MYX_REDIS_CLIENT_HPP_
#define MYX_REDIS_CLIENT_HPP_
#pragma once
#include <myx/redis/base.hpp>
#include <QVariant>
#include <QJsonArray>
#include <QJsonObject>
#include <unordered_set>
// QT_FORWARD_DECLARE_CLASS( QTcpSocket )
namespace myx {
namespace redis {
/*!
* \brief Реализует клиентскую часть в соответствии с RESP
*/
class Client : public Base
{
Q_OBJECT
public:
Client( int database = 0, QObject* parent = nullptr );
virtual ~Client();
int database() const;
int exists( const QStringList& keys );
void select( int database );
bool flushdb();
bool del( const QStringList& keys );
bool expire( const QString& key, int secs );
bool pexpire( const QString& key, int msecs );
bool persist( const QString& key );
bool publish( const QString& channel, const QByteArray& message );
static bool publish( const QString& channel, const QByteArray& message,
const QString& host, quint16 port = 6379 );
bool set( const QString& key, const QVariant& value );
static bool set( const QString& key, const QVariant& value,
int database, const QString& host = "127.0.0.1", quint16 port = 6379 );
QByteArray scriptLoad( const QByteArray& script );
QByteArray get( const QString& key );
template< typename T >
T get( const QString& key );
static QByteArray get( const QString& key, int database,
const QString& host = "127.0.0.1", quint16 port = 6379 );
template< typename T >
static T get( const QString& key, int database,
const QString& host = "127.0.0.1", quint16 port = 6379 );
bool hdel( const QString& redisKey, const QStringList& hashKeys );
bool hset( const QString& key, const QString& field, const QVariant& value );
bool hmset( const QString& key, const QVariantHash& hash );
static bool hmset( const QString& key, const QVariantHash& hash, int database,
const QString& host = "127.0.0.1", quint16 port = 6379 );
QVariantHash hgetall( const QString& key );
static QVariantHash hgetall( const QString& key, int database,
const QString& host = "127.0.0.1", quint16 port = 6379 );
QByteArray hget( const QString& redisKey, const QString& hashKey );
static QByteArray hget( const QString& redisKey, const QString& hashKey,
int database, const QString& host = "127.0.0.1", quint16 port = 6379 );
bool rpush( const QString& key, const QVariantList& values );
bool lpush( const QString& key, const QVariantList& values );
bool lset( const QString& key, int index, const QVariant& value );
bool lrem( const QString& key, const QVariant& value, int count = 1 );
bool ltrim( const QString& key, int from, int to );
int llen( const QString& key );
QVariantList lrange( const QString& key, int from, int to );
template< typename T >
std::vector< T > lrange( const QString& key );
static QByteArrayList lrange( const QString& key, int from, int to, int database,
const QString& host = "127.0.0.1", quint16 port = 6379 );
template< typename T >
static std::vector< T > lrange( const QString& key, int from, int to, int database,
const QString& host = "127.0.0.1", quint16 port = 6379 );
bool sadd( const QString& key, const QVariantList& values );
bool srem( const QString& key, const QVariantList& values );
bool sismember( const QString& key, const QVariant& value );
static bool sismember( const QString& key, const QVariant& value, int database,
const QString& host = "127.0.0.1", quint16 port = 6379 );
int scard( const QString& key );
QVariantList smembers( const QString& key );
template< typename T >
std::vector< T > smembers( const QString& key );
QByteArray rpop( const QString& key );
QByteArray lindex( const QString& key, int index );
QStringList keys( const QString& pattern = {} );
static QStringList keys( const QString& pattern, int database,
const QString& host, quint16 port = 6379 );
template< typename T >
T evalSha( const QByteArray& sha, const QVariantList& keys, const QVariantList& argv );
template< typename T >
static T evalSha( const QByteArray& sha, const QVariantList& keys, const QVariantList& argv,
int database, const QString& host, quint16 port = 6379 );
QByteArrayList evalSha( const QByteArray& sha, const QVariantList& keys,
const QVariantList& argv );
static QByteArrayList evalSha( const QByteArray& sha, const QVariantList& keys,
const QVariantList& argv,
int database, const QString& host, quint16 port = 6379 );
private:
/*!
* \brief Класс для синхронизации порядка чтения/записи в poolSocket;
*/
struct Session
{
Session( uint& count );
~Session();
private:
uint& _count; //!< Счетчик открытых сессий
};
int _database; //!< Номер БД в redis
uint _sessionCount { 0 }; //!< Счетчик открытых сессий
std::vector< QTcpSocket* > _session; //!< Сокеты для синхронных сессий чтения/записи
/*!
* \brief Содержит TCP соединения, связанные с БД, отличной от текущей
*/
std::unordered_set< QTcpSocket* > _outOfDatabase;
static bool setupSocket( QTcpSocket* socket, int database, const QString& host, quint16 port );
static bool select( QTcpSocket* socket, int database );
QTcpSocket* session( int timeout );
}; // class Client
template<>
QVariant Client::evalSha< QVariant >( const QByteArray& sha, const QVariantList& keys,
const QVariantList& argv );
template<>
QVariantList Client::evalSha< QVariantList >( const QByteArray& sha, const QVariantList& keys,
const QVariantList& argv );
template<>
QVariantHash Client::evalSha< QVariantHash >( const QByteArray& sha, const QVariantList& keys,
const QVariantList& argv );
template<>
QJsonArray Client::evalSha< QJsonArray >( const QByteArray& sha, const QVariantList& keys,
const QVariantList& argv );
template<>
QJsonArray Client::evalSha< QJsonArray >( const QByteArray& sha, const QVariantList& keys,
const QVariantList& argv,
int database, const QString& host, quint16 port );
template<>
std::vector< QJsonObject > Client::lrange< QJsonObject >( const QString & key, int from, int to,
int database, const QString & host, quint16 );
} // namespace redis
} // namespace myx
#ifdef MYXLIB_HEADER_ONLY
#include "client-inl.hpp"
#endif
// #include "client_redis.tcc"
#endif // ifndef MYX_REDIS_CLIENT_HPP_