 c447e5cf15
			
		
	
	c447e5cf15
	
	
	
		
			
			See script directory for method. The script to run in the top level MaxScale directory is called maxscale-uncrustify.sh, which uses another script, list-src, from the same directory (so you need to set your PATH). The uncrustify version was 0.66.
		
			
				
	
	
		
			156 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.5 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: 2022-01-01
 | |
|  *
 | |
|  * 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 <list>
 | |
| 
 | |
| #include <maxscale/buffer.hh>
 | |
| #include <maxscale/utils.hh>
 | |
| #include <maxscale/modutil.hh>
 | |
| 
 | |
| // A transaction
 | |
| class Trx
 | |
| {
 | |
| public:
 | |
|     // A log of executed queries, for transaction replay
 | |
|     typedef std::list<mxs::Buffer> TrxLog;
 | |
| 
 | |
|     Trx()
 | |
|         : m_size(0)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Add a statement to the transaction
 | |
|      *
 | |
|      * @param buf Statement to add
 | |
|      */
 | |
|     void add_stmt(GWBUF* buf)
 | |
|     {
 | |
|         mxb_assert_message(buf, "Trx::add_stmt: Buffer must not be empty");
 | |
| 
 | |
|         if (mxs_log_is_priority_enabled(LOG_INFO))
 | |
|         {
 | |
|             MXS_INFO("Adding to trx: %s", mxs::extract_sql(buf, 512).c_str());
 | |
|         }
 | |
| 
 | |
|         m_size += gwbuf_length(buf);
 | |
|         m_log.emplace_back(buf);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Add a result to the transaction
 | |
|      *
 | |
|      * The result is used to update the checksum.
 | |
|      *
 | |
|      * @param buf Result to add
 | |
|      */
 | |
|     void add_result(GWBUF* buf)
 | |
|     {
 | |
|         m_checksum.update(buf);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Releases the oldest statement in this transaction
 | |
|      *
 | |
|      * This reduces the size of the transaction by one and should only be used
 | |
|      * to replay a transaction.
 | |
|      *
 | |
|      * @return The oldest statement in this transaction
 | |
|      */
 | |
|     GWBUF* pop_stmt()
 | |
|     {
 | |
|         mxb_assert(!m_log.empty());
 | |
|         GWBUF* rval = m_log.front().release();
 | |
|         m_log.pop_front();
 | |
|         return rval;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Finalize the transaction
 | |
|      *
 | |
|      * This function marks the transaction as completed be that by a COMMIT
 | |
|      * or by a failure of the current server where the transaction was being
 | |
|      * executed.
 | |
|      */
 | |
|     void finalize()
 | |
|     {
 | |
|         m_checksum.finalize();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Check if transaction has statements
 | |
|      *
 | |
|      * @return True if transaction has statements
 | |
|      *
 | |
|      * @note This function should only be used when checking whether a transaction
 | |
|      *       that is being replayed has ended. The empty() method can be used
 | |
|      *       to check whether statements were added to the transaction.
 | |
|      */
 | |
|     bool have_stmts() const
 | |
|     {
 | |
|         return !m_log.empty();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Check whether the transaction is empty
 | |
|      *
 | |
|      * @return True if no statements have been added to the transaction
 | |
|      */
 | |
|     bool empty() const
 | |
|     {
 | |
|         return m_size == 0;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get transaction size in bytes
 | |
|      *
 | |
|      * @return Size of the transaction in bytes
 | |
|      */
 | |
|     size_t size() const
 | |
|     {
 | |
|         return m_size;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Close the transaction
 | |
|      *
 | |
|      * This clears out the stored statements and resets the checksum state.
 | |
|      */
 | |
|     void close()
 | |
|     {
 | |
|         m_checksum.reset();
 | |
|         m_log.clear();
 | |
|         m_size = 0;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the current checksum
 | |
|      *
 | |
|      * finalize() must be called before the return value of this function is used.
 | |
|      *
 | |
|      * @return The checksum of the transaction
 | |
|      */
 | |
|     const mxs::SHA1Checksum& checksum() const
 | |
|     {
 | |
|         return m_checksum;
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     mxs::SHA1Checksum m_checksum;   /**< Checksum of the transaction */
 | |
|     TrxLog            m_log;        /**< The transaction contents */
 | |
|     size_t            m_size;       /**< Transaction size in bytes */
 | |
| };
 |