Дополнительные проверки
This commit is contained in:
		@@ -136,10 +136,13 @@ class ClientPrivate : public QObject
 | 
				
			|||||||
	Lexer              m_lexer;
 | 
						Lexer              m_lexer;
 | 
				
			||||||
	Parser             m_parser;
 | 
						Parser             m_parser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Q_SLOT void sendReply( myx::redis::Reply& reply )
 | 
						Q_SLOT void sendReply( const myx::redis::Reply& reply )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( !m_queue.isEmpty() )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Q_EMIT m_queue.dequeue()->reply( reply );
 | 
								Q_EMIT m_queue.dequeue()->reply( reply );
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}; // class ClientPrivate
 | 
					}; // class ClientPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace redis
 | 
					} // namespace redis
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,6 @@ public:
 | 
				
			|||||||
	Lexer( Lexer&& ) = delete;
 | 
						Lexer( Lexer&& ) = delete;
 | 
				
			||||||
	Lexer& operator=( Lexer&& ) = delete;
 | 
						Lexer& operator=( Lexer&& ) = delete;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	~Lexer() override = default;
 | 
						~Lexer() override = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Q_SIGNAL void character( char );
 | 
						Q_SIGNAL void character( char );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,16 +7,19 @@
 | 
				
			|||||||
#include <myx/redis/parser.hpp>
 | 
					#include <myx/redis/parser.hpp>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace myx {
 | 
					namespace myx {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace redis {
 | 
					namespace redis {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MYXLIB_INLINE Parser::Parser( Lexer* lexer, QObject* parent ) :
 | 
					MYXLIB_INLINE Parser::Parser( Lexer* lexer, QObject* parent ) :
 | 
				
			||||||
	QObject( parent )
 | 
						QObject( parent ),
 | 
				
			||||||
 | 
						m_lexer( lexer )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	connect( lexer, &Lexer::character, this, &Parser::readCharacter );
 | 
						connect( m_lexer, &Lexer::character, this, &Parser::readCharacter );
 | 
				
			||||||
	connect( lexer, &Lexer::unsafeString, this, &Parser::readUnsafeString );
 | 
						connect( m_lexer, &Lexer::unsafeString, this, &Parser::readUnsafeString );
 | 
				
			||||||
	connect( lexer, &Lexer::safeString, this, &Parser::readSafeString );
 | 
						connect( m_lexer, &Lexer::safeString, this, &Parser::readSafeString );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -66,23 +69,33 @@ MYXLIB_INLINE void Parser::descend()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	while ( true )
 | 
						while ( true )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if ( ( tos().m_reply.type() == Reply::kMultiBulk ) &&
 | 
							auto& task = tos();
 | 
				
			||||||
		     ( tos().m_reply.value().toList().count() < tos().m_count ) )
 | 
							if ( task.m_reply.value().isNull() )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								task.m_reply.value().setValue( QList< QVariant >() );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ( ( task.m_reply.type() == Reply::kMultiBulk ) &&
 | 
				
			||||||
 | 
							     ( task.m_reply.value().toList().count() < task.m_count ) )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ( m_stack.count() == 1 )
 | 
							if ( m_stack.count() == 1 )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			auto r = m_stack.takeLast().m_reply;
 | 
								Q_EMIT reply( m_stack.takeLast().m_reply );
 | 
				
			||||||
			Q_EMIT reply( r );
 | 
					 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto r = m_stack.takeLast().m_reply;
 | 
							auto r = m_stack.takeLast().m_reply;
 | 
				
			||||||
		tos().m_reply.value().toList().append( QVariant::fromValue( r ) );
 | 
					
 | 
				
			||||||
 | 
							Task t = m_stack.takeLast();
 | 
				
			||||||
 | 
							auto l = t.m_reply.value().toList();
 | 
				
			||||||
 | 
							l.append( QVariant::fromValue( r ) );
 | 
				
			||||||
 | 
							t.m_reply.value().setValue( l );
 | 
				
			||||||
 | 
							m_stack.append( t );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // Parser::descend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace redis
 | 
					} // namespace redis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	~Parser() override = default;
 | 
						~Parser() override = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Q_SIGNAL void reply( myx::redis::Reply& );
 | 
						Q_SIGNAL void reply( const myx::redis::Reply& );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	Q_SLOT void readCharacter( char );
 | 
						Q_SLOT void readCharacter( char );
 | 
				
			||||||
@@ -52,6 +52,7 @@ private:
 | 
				
			|||||||
		int   m_count;
 | 
							int   m_count;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Lexer*        m_lexer;
 | 
				
			||||||
	QList< Task > m_stack;
 | 
						QList< Task > m_stack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Task& tos() { return( m_stack.last() ); }
 | 
						Task& tos() { return( m_stack.last() ); }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,7 +62,7 @@ public:
 | 
				
			|||||||
	 * @brief Emitted when a reply is received
 | 
						 * @brief Emitted when a reply is received
 | 
				
			||||||
	 * @param reply the reply received
 | 
						 * @param reply the reply received
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	Q_SIGNAL void reply( myx::redis::Reply& reply );
 | 
						Q_SIGNAL void reply( const myx::redis::Reply& reply );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user