110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2018 MariaDB Corporation Ab
 | 
						|
 *
 | 
						|
 * Use of this software is governed by the Business Source License included
 | 
						|
 * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | 
						|
 *
 | 
						|
 * Change Date: 2025-10-29
 | 
						|
 *
 | 
						|
 * On the date above, in accordance with the Business Source License, use
 | 
						|
 * of this software will be governed by version 2 or later of the General
 | 
						|
 * Public License.
 | 
						|
 */
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include <maxscale/ccdefs.hh>
 | 
						|
 | 
						|
#include <memory>
 | 
						|
#include <list>
 | 
						|
#include <string>
 | 
						|
 | 
						|
#include <maxscale/buffer.hh>
 | 
						|
 | 
						|
namespace maxscale
 | 
						|
{
 | 
						|
 | 
						|
class SessionCommand;
 | 
						|
typedef std::shared_ptr<SessionCommand> SSessionCommand;
 | 
						|
typedef std::list<SSessionCommand>      SessionCommandList;
 | 
						|
 | 
						|
class SessionCommand
 | 
						|
{
 | 
						|
    SessionCommand(const SessionCommand&);
 | 
						|
    SessionCommand& operator=(const SessionCommand&);
 | 
						|
public:
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Get the command type of the session command
 | 
						|
     *
 | 
						|
     * @return The type of the command
 | 
						|
     */
 | 
						|
    uint8_t get_command() const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Get the position of this session command
 | 
						|
     *
 | 
						|
     * @return The position of the session command
 | 
						|
     */
 | 
						|
    uint64_t get_position() const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Creates a deep copy of the internal buffer
 | 
						|
     *
 | 
						|
     * @return A deep copy of the internal buffer or NULL on error
 | 
						|
     */
 | 
						|
    GWBUF* deep_copy_buffer();
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Create a new session command
 | 
						|
     *
 | 
						|
     * @param buffer The buffer containing the command. Note that the ownership
 | 
						|
     *               of @c buffer is transferred to this object.
 | 
						|
     * @param id     A unique position identifier used to track replies
 | 
						|
     */
 | 
						|
    SessionCommand(GWBUF* buffer, uint64_t id);
 | 
						|
 | 
						|
    ~SessionCommand();
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Debug function for printing session commands
 | 
						|
     *
 | 
						|
     * @return String representation of the object
 | 
						|
     */
 | 
						|
    std::string to_string();
 | 
						|
 | 
						|
    /**
 | 
						|
     * @brief Equality comparison
 | 
						|
     *
 | 
						|
     * @return True if @c rhs is equal
 | 
						|
     */
 | 
						|
    bool eq(const SessionCommand& rhs) const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Mark the session command as a re-execution of another command
 | 
						|
     *
 | 
						|
     * This function makes the current command's buffer a reference to the other
 | 
						|
     * command's buffer. The commands will still have separate positions and
 | 
						|
     * reply statuses.
 | 
						|
     *
 | 
						|
     * @param rhs Session command whose data is used
 | 
						|
     */
 | 
						|
    void mark_as_duplicate(const SessionCommand& rhs);
 | 
						|
 | 
						|
private:
 | 
						|
    mxs::Buffer m_buffer;       /**< The buffer containing the command */
 | 
						|
    uint8_t     m_command;      /**< The command being executed */
 | 
						|
    uint64_t    m_pos;          /**< Unique position identifier */
 | 
						|
    bool        m_reply_sent;   /**< Whether the session command reply has been sent */
 | 
						|
};
 | 
						|
 | 
						|
inline bool operator==(const SessionCommand& lhs, const SessionCommand& rhs)
 | 
						|
{
 | 
						|
    return lhs.eq(rhs);
 | 
						|
}
 | 
						|
 | 
						|
inline bool operator!=(const SessionCommand& lhs, const SessionCommand& rhs)
 | 
						|
{
 | 
						|
    return !lhs.eq(rhs);
 | 
						|
}
 | 
						|
}
 |