From ea58c525ebdf5cc43db8847dfc52eded9a51901f Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sun, 26 Apr 2020 18:56:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/myx/redis/base-inl.hpp | 39 +++++--------------------------- src/myx/redis/base.hpp | 4 +--- src/myx/redis/containers-inl.hpp | 24 +++++++++++++------- src/myx/redis/containers.hpp | 2 -- src/myx/redis/pubsub-inl.hpp | 32 +++++++++++++++----------- src/myx/redis/pubsub.hpp | 17 ++++++++------ 6 files changed, 52 insertions(+), 66 deletions(-) diff --git a/src/myx/redis/base-inl.hpp b/src/myx/redis/base-inl.hpp index b3a452b..5077829 100644 --- a/src/myx/redis/base-inl.hpp +++ b/src/myx/redis/base-inl.hpp @@ -15,8 +15,6 @@ namespace myx { namespace redis { -static const QByteArray Separator { "\r\n" }; //!< Строковый разделитель слов во фразе - /*! * \brief Создает объект класса * \param host Имя хоста сервера @@ -49,6 +47,12 @@ inline Base::Base( QObject* parent ) : } +inline int Base::rwTimeout() const +{ + return( kRWTimeout ); +} + + inline QString Base::host() const { return( m_host ); @@ -99,37 +103,6 @@ inline bool Base::isConnected() const } -/// *! -// * \brief Извлекает длину токена из буфера данных -// * \param pos Позиция в буфере -// * \param buffer Буфер данных -// */ -// inline int Base::fetchLength( QByteArray& buffer, int& pos ) -// { -// if ( ( buffer[pos] != '$' ) && ( buffer[pos] != '*' ) && ( buffer[pos] != ':' ) ) -// { -// buffer.clear(); -// pos = 0; -// return( -1 ); -// } -// pos++; -// QByteArray text; -// while ( pos < buffer.length() ) -// { -// if ( QChar( buffer[pos] ).isNumber() ) -// { -// text += buffer[pos++]; -// } -// else -// { -// pos += Separator.length(); -// return( text.toInt() ); -// } -// } -// return( -1 ); -// } // Base::fetchLength - - /*! * \brief Добавляет к состоянию флаг Read */ diff --git a/src/myx/redis/base.hpp b/src/myx/redis/base.hpp index 0f1b002..107d1b9 100644 --- a/src/myx/redis/base.hpp +++ b/src/myx/redis/base.hpp @@ -47,7 +47,7 @@ public: bool isConnected() const; private: - static constexpr int k_RwTimeout { 200 }; //!< Таймаут на операции чтения и записи + static constexpr int kRWTimeout { 200 }; //!< Таймаут на операции чтения и записи int m_connectionFlags { kDisconnected }; //!< Флаги состояния соединения quint16 m_port { 6379 }; //!< Номер порта подключения к БД QString m_host { QStringLiteral( "127.0.0.1" ) }; //!< Имя хоста подключения к БД @@ -56,7 +56,6 @@ private: protected: - int connectionTimeout() const; int rwTimeout() const; QString host() const; @@ -68,7 +67,6 @@ protected: int connectionFlags() const; void setConnectionFlags( int connectionFlags ); -// int fetchLength( QByteArray& buffer, int& pos ); Q_SLOT void onReadyRead(); Q_SLOT void onBytesWritten(); Q_SLOT void onSocketError(); diff --git a/src/myx/redis/containers-inl.hpp b/src/myx/redis/containers-inl.hpp index e6f0278..951b819 100644 --- a/src/myx/redis/containers-inl.hpp +++ b/src/myx/redis/containers-inl.hpp @@ -14,6 +14,14 @@ namespace myx { namespace redis { +namespace constants { + +static const QByteArray Separator { "\r\n" }; //!< Строковый разделитель слов во фразе + +} // namespace constants + +namespace C = constants; + /*! * \brief Создает часть команды * \param value Значение для создани части команды @@ -22,7 +30,7 @@ namespace redis { inline QByteArray part( const QVariant& value ) { auto bytes = value.toByteArray(); - return( "$" + QByteArray::number( bytes.length() ) + Separator + bytes ); + return( "$" + QByteArray::number( bytes.length() ) + C::Separator + bytes ); } @@ -37,7 +45,7 @@ inline QByteArray array( const QVariantList& parts ) std::transform( parts.cbegin(), parts.cend(), std::back_inserter( data ), []( const QVariant& iter ) { return( part( iter ) ); } ); data.prepend( "*" + QByteArray::number( data.size() ) ); - return( data.join( Separator ) + Separator ); + return( data.join( C::Separator ) + C::Separator ); } @@ -76,7 +84,7 @@ inline QByteArrayList split( const QByteArray& buffer, int* splitLength ) { *splitLength = 0; } - if ( !buffer.endsWith( Separator ) ) + if ( !buffer.endsWith( C::Separator ) ) { return {}; } @@ -96,7 +104,7 @@ inline QByteArrayList split( const QByteArray& buffer, int* splitLength ) return {}; } size = text.toInt(); - pos += Separator.length(); + pos += C::Separator.length(); } QByteArrayList parts; Token token { kUndefined }; @@ -131,7 +139,7 @@ inline QByteArrayList split( const QByteArray& buffer, int* splitLength ) { parts.push_back( partLength ); token = kUndefined; - pos += Separator.length(); + pos += C::Separator.length(); } break; case kFetchPart: @@ -147,17 +155,17 @@ inline QByteArrayList split( const QByteArray& buffer, int* splitLength ) if ( length < 0 ) { parts.push_back( "" ); - pos += Separator.length(); + pos += C::Separator.length(); } else { - pos += Separator.length(); + pos += C::Separator.length(); if ( pos + length > buffer.length() ) { return {}; } parts.push_back( buffer.mid( pos, length ) ); - pos += length + Separator.length(); + pos += length + C::Separator.length(); } token = kUndefined; } diff --git a/src/myx/redis/containers.hpp b/src/myx/redis/containers.hpp index bb0d2fe..fd462e7 100644 --- a/src/myx/redis/containers.hpp +++ b/src/myx/redis/containers.hpp @@ -12,8 +12,6 @@ namespace myx { namespace redis { -static const QByteArray Separator { "\r\n" }; //!< Строковый разделитель слов во фразе - QByteArray array( const QVariantList& parts ); QByteArrayList split( const QByteArray& buffer, int* splitLength = nullptr ); // QByteArray part( const QVariant& value ); diff --git a/src/myx/redis/pubsub-inl.hpp b/src/myx/redis/pubsub-inl.hpp index 4ee72b4..d8286a4 100644 --- a/src/myx/redis/pubsub-inl.hpp +++ b/src/myx/redis/pubsub-inl.hpp @@ -19,7 +19,7 @@ namespace myx { namespace redis { -const QString PubSub::k_KeySpacePrefix { QStringLiteral( "__key%1__:" ) }; +const QString PubSub::kKeySpacePrefix { QStringLiteral( "__key%1__:" ) }; /*! * \brief Конструктор класса @@ -49,6 +49,12 @@ inline PubSub::PubSub( QObject* parent ) : } +inline int PubSub::connectionTimeout() const +{ + return( kConnectionTimeout ); +} + + /*! * \brief Инициирует работу с БД */ @@ -107,7 +113,7 @@ inline void PubSub::subscribe( const QString& channel, QObject* subscriber, cons } ); if ( it == iter.value().end() ) { - iter.value().push_back( { subscriber, method } ); + iter.value().emplace_back( subscriber, method ); connect( subscriber, &QObject::destroyed, this, &PubSub::onSubscriberDestroyed, Qt::UniqueConnection ); } @@ -132,7 +138,7 @@ inline void PubSub::subscribe( QString channel, QObject* subscriber, const char* auto iter = m_subscribers.find( channel ); if ( iter == m_subscribers.end() ) { - channel.prepend( k_KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); if ( m_socket->state() == QAbstractSocket::ConnectedState ) { m_socket->write( array( { "SUBSCRIBE", channel } ) ); @@ -148,7 +154,7 @@ inline void PubSub::subscribe( QString channel, QObject* subscriber, const char* } ); if ( it == iter.value().end() ) { - iter.value().push_back( { subscriber, method } ); + iter.value().emplace_back( subscriber, method ); connect( subscriber, &QObject::destroyed, this, &PubSub::onSubscriberDestroyed, Qt::UniqueConnection ); } @@ -187,7 +193,7 @@ inline void PubSub::psubscribe( const QString& channel, QObject* subscriber, con } ); if ( it == iter.value().end() ) { - iter.value().push_back( { subscriber, method } ); + iter.value().emplace_back( subscriber, method ); connect( subscriber, &QObject::destroyed, this, &PubSub::onSubscriberDestroyed, Qt::UniqueConnection ); } @@ -214,11 +220,11 @@ inline void PubSub::psubscribe( QString channel, QObject* subscriber, const char { if ( database == -1 ) { - channel.prepend( k_KeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); + channel.prepend( kKeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); } else { - channel.prepend( k_KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); } if ( m_socket->state() == QAbstractSocket::ConnectedState ) { @@ -235,7 +241,7 @@ inline void PubSub::psubscribe( QString channel, QObject* subscriber, const char } ); if ( it == iter.value().end() ) { - iter.value().push_back( { subscriber, method } ); + iter.value().emplace_back( subscriber, method ); connect( subscriber, &QObject::destroyed, this, &PubSub::onSubscriberDestroyed, Qt::UniqueConnection ); } @@ -296,11 +302,11 @@ inline void PubSub::unsubscribe( QString channel, QObject* subscriber, const cha } if ( database == -1 ) { - channel.prepend( k_KeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); + channel.prepend( kKeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); } else { - channel.prepend( k_KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); } auto iter = m_subscribers.find( channel ); if ( iter != m_subscribers.end() ) @@ -380,11 +386,11 @@ inline void PubSub::punsubscribe( QString channel, QObject* subscriber, } if ( database == -1 ) { - channel.prepend( k_KeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); + channel.prepend( kKeySpacePrefix.arg( QStringLiteral( "*" ) ).toLocal8Bit() ); } else { - channel.prepend( k_KeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); + channel.prepend( kKeySpacePrefix.arg( "space@" + QString::number( database ) ).toLocal8Bit() ); } auto iter = m_psubscribers.find( channel ); if ( iter != m_psubscribers.end() ) @@ -501,7 +507,7 @@ inline void PubSub::onSocketStateChanged() * \brief При удалении подписчика уничтожает все его подписки * \param subscriber Удаленный подписчик */ -void PubSub::onSubscriberDestroyed( QObject* subscriber ) +inline void PubSub::onSubscriberDestroyed( QObject* subscriber ) { for ( auto i = m_subscribers.begin(); i != m_subscribers.end(); ) { diff --git a/src/myx/redis/pubsub.hpp b/src/myx/redis/pubsub.hpp index 7c3b2f3..62fa738 100644 --- a/src/myx/redis/pubsub.hpp +++ b/src/myx/redis/pubsub.hpp @@ -14,7 +14,7 @@ namespace myx { namespace redis { /*! - * \brief УПравляет подпиской и публикацией сообщений + * \brief Управляет подпиской и публикацией сообщений */ class PubSub : public Base @@ -24,6 +24,8 @@ class PubSub : public Base public: explicit PubSub( QObject* parent = nullptr ); QTcpSocket* socket() const; + int connectionTimeout() const; + Q_SLOT void start(); Q_SLOT void stop(); Q_INVOKABLE void subscribe( const QString& channel, QObject* subscriber, const char* method ); @@ -50,16 +52,17 @@ public: private: using Sub = QHash< QString, std::vector< std::pair< QObject*, const char* > > >; - static const QString k_KeySpacePrefix; //!< Приставка для наблюдения за данными + static const QString kKeySpacePrefix; //!< Приставка для наблюдения за данными + static constexpr int kConnectionTimeout { 2000 }; //!< Таймаут на сетевые операции QTcpSocket* m_socket; - QTimer* m_connectionTimer; //!< Таймер установления сетевого соединения - static constexpr int ConnectionTimeout { 2000 }; //!< Таймаут на сетевые операции + QTimer* m_connectionTimer; //!< Таймер установления сетевого соединения + /*! * \brief Таблица подписчиков */ - QByteArray m_buffer; //!< Буффер прочитанных данных - Sub m_subscribers; //!< Обработчики сообщений по каналу подписки - Sub m_psubscribers; //!< Обработчики сообщений по шаблону канала подписки + QByteArray m_buffer; //!< Буффер прочитанных данных + Sub m_subscribers; //!< Обработчики сообщений по каналу подписки + Sub m_psubscribers; //!< Обработчики сообщений по шаблону канала подписки Q_SLOT void read(); Q_SLOT void onSocketStateChanged();