From 14b9c97bb270bdf140972781c1e1969d0227811b Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sun, 26 Apr 2020 19:52:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 +- src/myx/base/config.hpp | 4 +-- src/myx/redis/base-inl.hpp | 24 +++++++-------- src/myx/redis/containers-inl.hpp | 14 ++++----- src/myx/redis/pubsub-inl.hpp | 53 +++++++++++++++----------------- src/myx/redis/pubsub.hpp | 11 +++++-- 6 files changed, 55 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 65f3340..a7996a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,7 @@ add_subdirectory(src/myx/redis) if(MYXLIB_BUILD_EXAMPLES OR MYXLIB_BUILD_EXAMPLES_HO) add_subdirectory(examples/filesystem) add_subdirectory(examples/qt) -# add_subdirectory(examples/redis) + add_subdirectory(examples/redis) endif() # Документация diff --git a/src/myx/base/config.hpp b/src/myx/base/config.hpp index aaf9a7f..fef432f 100644 --- a/src/myx/base/config.hpp +++ b/src/myx/base/config.hpp @@ -15,11 +15,9 @@ #else #define MYXLIB_API #endif -#define MYXLIB_INLINE inline // NOLINT +#define MYXLIB_INLINE #else -#ifndef MYXLIB_HEADER_ONLY #define MYXLIB_HEADER_ONLY -#endif #define MYXLIB_API #define MYXLIB_INLINE inline #endif // ifdef MYXLIB_BUILD_LIBRARIES diff --git a/src/myx/redis/base-inl.hpp b/src/myx/redis/base-inl.hpp index 5077829..9ec82ac 100644 --- a/src/myx/redis/base-inl.hpp +++ b/src/myx/redis/base-inl.hpp @@ -21,7 +21,7 @@ namespace redis { * \param port Номер порта сервера * \param parent Родительский объект */ -inline Base::Base( QObject* parent ) : +MYXLIB_INLINE Base::Base( QObject* parent ) : QObject { parent }, m_readTimer ( new QTimer( this ) ), m_writeTimer( new QTimer( this ) ) @@ -47,13 +47,13 @@ inline Base::Base( QObject* parent ) : } -inline int Base::rwTimeout() const +MYXLIB_INLINE int Base::rwTimeout() const { return( kRWTimeout ); } -inline QString Base::host() const +MYXLIB_INLINE QString Base::host() const { return( m_host ); } @@ -63,31 +63,31 @@ inline QString Base::host() const * \brief Задает адрес хоста * \param host Адрес */ -inline void Base::setHost( const QString& host ) +MYXLIB_INLINE void Base::setHost( const QString& host ) { m_host = host; } -inline quint16 Base::port() const +MYXLIB_INLINE quint16 Base::port() const { return( m_port ); } -inline void Base::setPort( quint16 port ) +MYXLIB_INLINE void Base::setPort( quint16 port ) { m_port = port; } -inline int Base::connectionFlags() const +MYXLIB_INLINE int Base::connectionFlags() const { return( m_connectionFlags ); } -inline void Base::setConnectionFlags( int connectionFlags ) +MYXLIB_INLINE void Base::setConnectionFlags( int connectionFlags ) { m_connectionFlags = connectionFlags; } @@ -97,7 +97,7 @@ inline void Base::setConnectionFlags( int connectionFlags ) * \brief Возвращает признак установленного соединения * \return Признак установленного соединения */ -inline bool Base::isConnected() const +MYXLIB_INLINE bool Base::isConnected() const { return( ( m_connectionFlags & kConnected ) != 0 ); } @@ -106,7 +106,7 @@ inline bool Base::isConnected() const /*! * \brief Добавляет к состоянию флаг Read */ -inline void Base::onReadyRead() +MYXLIB_INLINE void Base::onReadyRead() { if ( ( ( m_connectionFlags & kConnected ) != 0 ) && ( ( m_connectionFlags & kRead ) == 0 ) ) { @@ -120,7 +120,7 @@ inline void Base::onReadyRead() /*! * \brief Добавляет к состоянию флаг Read */ -inline void Base::onBytesWritten() +MYXLIB_INLINE void Base::onBytesWritten() { if ( ( ( m_connectionFlags & kConnected ) != 0 ) && ( ( m_connectionFlags & kWrite ) == 0 ) ) { @@ -134,7 +134,7 @@ inline void Base::onBytesWritten() /*! * \brief Выставляет флаг ошибки соединения */ -inline void Base::onSocketError() +MYXLIB_INLINE void Base::onSocketError() { Q_EMIT connectionStateChanged( m_connectionFlags = kError ); } diff --git a/src/myx/redis/containers-inl.hpp b/src/myx/redis/containers-inl.hpp index 951b819..7a91fe1 100644 --- a/src/myx/redis/containers-inl.hpp +++ b/src/myx/redis/containers-inl.hpp @@ -27,7 +27,7 @@ namespace C = constants; * \param value Значение для создани части команды * \return Часть команды */ -inline QByteArray part( const QVariant& value ) +MYXLIB_INLINE QByteArray part( const QVariant& value ) { auto bytes = value.toByteArray(); return( "$" + QByteArray::number( bytes.length() ) + C::Separator + bytes ); @@ -39,7 +39,7 @@ inline QByteArray part( const QVariant& value ) * \param parts Части для составления массива * \return RESP массив */ -inline QByteArray array( const QVariantList& parts ) +MYXLIB_INLINE QByteArray array( const QVariantList& parts ) { QByteArrayList data; std::transform( parts.cbegin(), parts.cend(), std::back_inserter( data ), @@ -55,7 +55,7 @@ inline QByteArray array( const QVariantList& parts ) * \param splitLength Длина разобранной части буффера * \return Массив частей-строк */ -inline QByteArrayList split( const QByteArray& buffer, int* splitLength ) +MYXLIB_INLINE QByteArrayList split( const QByteArray& buffer, int* splitLength ) { enum Token { @@ -192,7 +192,7 @@ inline QByteArrayList split( const QByteArray& buffer, int* splitLength ) * \param hash Таблица значений * \return Запакованное сообщение */ -inline QByteArray pack_hash( const QVariantHash& hash ) +MYXLIB_INLINE QByteArray pack_hash( const QVariantHash& hash ) { QVariantList parts; for ( auto iter = hash.cbegin(); iter != hash.cend(); ++iter ) @@ -208,7 +208,7 @@ inline QByteArray pack_hash( const QVariantHash& hash ) * \param message Сообщение * \return Таблица значений */ -inline QVariantHash unpack_hash( const QByteArray& message ) +MYXLIB_INLINE QVariantHash unpack_hash( const QByteArray& message ) { auto parts = split( message ); QVariantHash hash; @@ -225,7 +225,7 @@ inline QVariantHash unpack_hash( const QByteArray& message ) * \param hash Список значений * \return Запакованное сообщение */ -inline QByteArray pack_list( const QVariantList& list ) +MYXLIB_INLINE QByteArray pack_list( const QVariantList& list ) { return( array( list ) ); } @@ -236,7 +236,7 @@ inline QByteArray pack_list( const QVariantList& list ) * \param message Сообщение * \return Список значений */ -inline QVariantList unpack_list( const QByteArray& message ) +MYXLIB_INLINE QVariantList unpack_list( const QByteArray& message ) { auto data = split( message ); QVariantList list; diff --git a/src/myx/redis/pubsub-inl.hpp b/src/myx/redis/pubsub-inl.hpp index d8286a4..3bd42e1 100644 --- a/src/myx/redis/pubsub-inl.hpp +++ b/src/myx/redis/pubsub-inl.hpp @@ -19,13 +19,11 @@ namespace myx { namespace redis { -const QString PubSub::kKeySpacePrefix { QStringLiteral( "__key%1__:" ) }; - /*! * \brief Конструктор класса * \param parent Родительский объект для m_socket */ -inline PubSub::PubSub( QObject* parent ) : +MYXLIB_INLINE PubSub::PubSub( QObject* parent ) : Base { parent }, m_socket ( new QTcpSocket( this ) ), m_connectionTimer( new QTimer( this ) ) @@ -49,7 +47,7 @@ inline PubSub::PubSub( QObject* parent ) : } -inline int PubSub::connectionTimeout() const +MYXLIB_INLINE int PubSub::connectionTimeout() const { return( kConnectionTimeout ); } @@ -58,7 +56,7 @@ inline int PubSub::connectionTimeout() const /*! * \brief Инициирует работу с БД */ -inline void PubSub::start() +MYXLIB_INLINE void PubSub::start() { Q_EMIT disconnected(); Q_EMIT connectionStateChanged( connectionFlags() ); @@ -69,7 +67,7 @@ inline void PubSub::start() /*! * \brief Завершает работу с БД */ -inline void PubSub::stop() +MYXLIB_INLINE void PubSub::stop() { if ( m_socket->state() == QAbstractSocket::ConnectedState ) { @@ -88,7 +86,7 @@ inline void PubSub::stop() * \param subscriber Объект-подписчик * \param method Имя метода, вызываемого при изменении получении серверного сообщения */ -inline void PubSub::subscribe( const QString& channel, QObject* subscriber, const char* method ) +MYXLIB_INLINE void PubSub::subscribe( const QString& channel, QObject* subscriber, const char* method ) { if ( QThread::currentThread() != thread() ) { @@ -128,7 +126,7 @@ inline void PubSub::subscribe( const QString& channel, QObject* subscriber, cons * \param method Имя метода, вызываемого при изменении получении серверного сообщения * \param database Номер БД */ -inline void PubSub::subscribe( QString channel, QObject* subscriber, const char* method, int database ) +MYXLIB_INLINE void PubSub::subscribe( QString channel, QObject* subscriber, const char* method, int database ) { if ( QThread::currentThread() != thread() ) { @@ -138,7 +136,7 @@ inline void PubSub::subscribe( QString channel, QObject* subscriber, const char* auto iter = m_subscribers.find( channel ); if ( iter == m_subscribers.end() ) { - channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( C::KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); if ( m_socket->state() == QAbstractSocket::ConnectedState ) { m_socket->write( array( { "SUBSCRIBE", channel } ) ); @@ -168,7 +166,7 @@ inline void PubSub::subscribe( QString channel, QObject* subscriber, const char* * \param subscriber Объект-подписчик * \param method Имя метода, вызываемого при изменении получении серверного сообщения */ -inline void PubSub::psubscribe( const QString& channel, QObject* subscriber, const char* method ) +MYXLIB_INLINE void PubSub::psubscribe( const QString& channel, QObject* subscriber, const char* method ) { if ( QThread::currentThread() != thread() ) { @@ -208,7 +206,7 @@ inline void PubSub::psubscribe( const QString& channel, QObject* subscriber, con * \param method Имя метода, вызываемого при изменении получении серверного сообщения * \param database Номер БД (-1 для всех) */ -inline void PubSub::psubscribe( QString channel, QObject* subscriber, const char* method, int database ) +MYXLIB_INLINE void PubSub::psubscribe( QString channel, QObject* subscriber, const char* method, int database ) { if ( QThread::currentThread() != thread() ) { @@ -220,11 +218,11 @@ inline void PubSub::psubscribe( QString channel, QObject* subscriber, const char { if ( database == -1 ) { - channel.prepend( kKeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); + channel.prepend( C::KeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); } else { - channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( C::KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); } if ( m_socket->state() == QAbstractSocket::ConnectedState ) { @@ -256,7 +254,7 @@ inline void PubSub::psubscribe( QString channel, QObject* subscriber, const char * \param method Метод обработки данных * \param keyEvents Признак подписки на изменение данных */ -inline void PubSub::unsubscribe( const QString& channel, QObject* subscriber, const char* method ) +MYXLIB_INLINE void PubSub::unsubscribe( const QString& channel, QObject* subscriber, const char* method ) { if ( QThread::currentThread() != thread() ) { @@ -293,7 +291,7 @@ inline void PubSub::unsubscribe( const QString& channel, QObject* subscriber, co * \param method Метод обработки данных * \param keyEvents Признак подписки на изменение данных */ -inline void PubSub::unsubscribe( QString channel, QObject* subscriber, const char* method, int database ) +MYXLIB_INLINE void PubSub::unsubscribe( QString channel, QObject* subscriber, const char* method, int database ) { if ( QThread::currentThread() != thread() ) { @@ -302,11 +300,11 @@ inline void PubSub::unsubscribe( QString channel, QObject* subscriber, const cha } if ( database == -1 ) { - channel.prepend( kKeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); + channel.prepend( C::KeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); } else { - channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( C::KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); } auto iter = m_subscribers.find( channel ); if ( iter != m_subscribers.end() ) @@ -338,8 +336,8 @@ inline void PubSub::unsubscribe( QString channel, QObject* subscriber, const cha * \param method Метод обработки данных * \param keyEvents Признак подписки на изменение данных */ -inline void PubSub::punsubscribe( const QString& channel, QObject* subscriber, - const char* method ) +MYXLIB_INLINE void PubSub::punsubscribe( const QString& channel, QObject* subscriber, + const char* method ) { if ( QThread::currentThread() != thread() ) { @@ -376,8 +374,8 @@ inline void PubSub::punsubscribe( const QString& channel, QObject* subscriber, * \param method Метод обработки данных * \param keyEvents Признак подписки на изменение данных */ -inline void PubSub::punsubscribe( QString channel, QObject* subscriber, - const char* method, int database ) +MYXLIB_INLINE void PubSub::punsubscribe( QString channel, QObject* subscriber, + const char* method, int database ) { if ( QThread::currentThread() != thread() ) { @@ -386,11 +384,11 @@ inline void PubSub::punsubscribe( QString channel, QObject* subscriber, } if ( database == -1 ) { - channel.prepend( kKeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); + channel.prepend( C::KeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); } else { - channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( C::KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); } auto iter = m_psubscribers.find( channel ); if ( iter != m_psubscribers.end() ) @@ -419,7 +417,7 @@ inline void PubSub::punsubscribe( QString channel, QObject* subscriber, * \brief Разбирает поступившие от сервера уведомления и вызывает требуемые * метаметоды обработки */ -inline void PubSub::read() +MYXLIB_INLINE void PubSub::read() { int splitLength = 0; while ( m_socket->bytesAvailable() > 0 ) @@ -470,7 +468,7 @@ inline void PubSub::read() /*! * \brief Обработка изменения состояния сокета */ -inline void PubSub::onSocketStateChanged() +MYXLIB_INLINE void PubSub::onSocketStateChanged() { switch ( m_socket->state() ) { @@ -507,7 +505,7 @@ inline void PubSub::onSocketStateChanged() * \brief При удалении подписчика уничтожает все его подписки * \param subscriber Удаленный подписчик */ -inline void PubSub::onSubscriberDestroyed( QObject* subscriber ) +MYXLIB_INLINE void PubSub::onSubscriberDestroyed( QObject* subscriber ) { for ( auto i = m_subscribers.begin(); i != m_subscribers.end(); ) { @@ -569,7 +567,7 @@ inline void PubSub::onSubscriberDestroyed( QObject* subscriber ) * \brief Возвращает сокет * \return Сокет */ -inline QTcpSocket* PubSub::socket() const +MYXLIB_INLINE QTcpSocket* PubSub::socket() const { return( m_socket ); } @@ -578,5 +576,4 @@ inline QTcpSocket* PubSub::socket() const } // namespace myx - #endif // ifndef MYX_REDIS_PUBSUB_INL_HPP_ diff --git a/src/myx/redis/pubsub.hpp b/src/myx/redis/pubsub.hpp index 62fa738..bdff020 100644 --- a/src/myx/redis/pubsub.hpp +++ b/src/myx/redis/pubsub.hpp @@ -13,10 +13,18 @@ namespace myx { namespace redis { +namespace constants { + +/// @brief Приставка для наблюдения за данными +static const QString KeySpacePrefix { QStringLiteral( "__key%1__:" ) }; + +} // namespace constants + +namespace C = constants; + /*! * \brief Управляет подпиской и публикацией сообщений */ - class PubSub : public Base { Q_OBJECT @@ -52,7 +60,6 @@ public: private: using Sub = QHash< QString, std::vector< std::pair< QObject*, const char* > > >; - static const QString kKeySpacePrefix; //!< Приставка для наблюдения за данными static constexpr int kConnectionTimeout { 2000 }; //!< Таймаут на сетевые операции QTcpSocket* m_socket; QTimer* m_connectionTimer; //!< Таймер установления сетевого соединения