134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
/*
 | 
						|
 * 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: 2020-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.
 | 
						|
 */
 | 
						|
 | 
						|
#include <maxscale/cppdefs.hh>
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
#include <maxscale/json_api.h>
 | 
						|
#include <maxscale/monitor.h>
 | 
						|
 | 
						|
/** Utility macro for printing both MXS_ERROR and json error */
 | 
						|
#define PRINT_MXS_JSON_ERROR(err_out, format, ...)\
 | 
						|
    do {\
 | 
						|
       MXS_ERROR(format, ##__VA_ARGS__);\
 | 
						|
       if (err_out)\
 | 
						|
       {\
 | 
						|
            *err_out = mxs_json_error_append(*err_out, format, ##__VA_ARGS__);\
 | 
						|
       }\
 | 
						|
    } while (false)
 | 
						|
 | 
						|
typedef std::vector<MXS_MONITORED_SERVER*> MonServerArray;
 | 
						|
 | 
						|
extern const int64_t SERVER_ID_UNKNOWN;
 | 
						|
 | 
						|
/**
 | 
						|
 * Scan a server id from a string.
 | 
						|
 *
 | 
						|
 * @param id_string
 | 
						|
 * @return Server id, or -1 if scanning fails
 | 
						|
 */
 | 
						|
int64_t scan_server_id(const char* id_string);
 | 
						|
 | 
						|
/**
 | 
						|
 * Get MariaDB connection error strings from all the given servers, form one string.
 | 
						|
 *
 | 
						|
 * @param slaves Servers with errors
 | 
						|
 * @return Concatenated string.
 | 
						|
 */
 | 
						|
std::string get_connection_errors(const MonServerArray& servers);
 | 
						|
 | 
						|
/**
 | 
						|
 * Generates a list of server names separated by ', '
 | 
						|
 *
 | 
						|
 * @param array The servers
 | 
						|
 * @return Server names
 | 
						|
 */
 | 
						|
std::string monitored_servers_to_string(const MonServerArray& array);
 | 
						|
 | 
						|
/**
 | 
						|
 * Helper class for simplifying working with resultsets. Used in MariaDBServer.
 | 
						|
 */
 | 
						|
class QueryResult
 | 
						|
{
 | 
						|
    // These need to be banned to avoid premature destruction.
 | 
						|
    QueryResult(const QueryResult&) = delete;
 | 
						|
    QueryResult& operator = (const QueryResult&) = delete;
 | 
						|
 | 
						|
public:
 | 
						|
    QueryResult(MYSQL_RES* resultset = NULL);
 | 
						|
    ~QueryResult();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Advance to next row. Affects all result returning functions.
 | 
						|
     *
 | 
						|
     * @return True if the next row has data, false if the current row was the last one.
 | 
						|
     */
 | 
						|
    bool next_row();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the index of the current row.
 | 
						|
     *
 | 
						|
     * @return Current row index, or -1 if no data or next_row() has not been called yet.
 | 
						|
     */
 | 
						|
    int64_t get_row_index() const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * How many columns the result set has.
 | 
						|
     *
 | 
						|
     * @return Column count, or -1 if no data.
 | 
						|
     */
 | 
						|
    int64_t get_column_count() const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get a numeric index for a column name. May give wrong results if column names are not unique.
 | 
						|
     *
 | 
						|
     * @param col_name Column name
 | 
						|
     * @return Index or -1 if not found.
 | 
						|
     */
 | 
						|
    int64_t get_col_index(const std::string& col_name) const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Read a string value from the current row and given column. Empty string and (null) are both interpreted
 | 
						|
     * as the empty string.
 | 
						|
     *
 | 
						|
     * @param column_ind Column index
 | 
						|
     * @return Value as string
 | 
						|
     */
 | 
						|
    std::string get_string(int64_t column_ind) const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Read a non-negative integer value from the current row and given column.
 | 
						|
     *
 | 
						|
     * @param column_ind Column index
 | 
						|
     * @return Value as integer. 0 or greater indicates success, -1 is returned on error.
 | 
						|
     */
 | 
						|
    int64_t get_uint(int64_t column_ind) const;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Read a boolean value from the current row and given column.
 | 
						|
     *
 | 
						|
     * @param column_ind Column index
 | 
						|
     * @return Value as boolean. Returns true if the text is either 'Y' or '1'.
 | 
						|
     */
 | 
						|
    bool get_bool(int64_t column_ind) const;
 | 
						|
 | 
						|
private:
 | 
						|
    MYSQL_RES* m_resultset; // Underlying result set, freed at dtor.
 | 
						|
    std::tr1::unordered_map<std::string, int64_t> m_col_indexes; // Map of column name -> index
 | 
						|
    int64_t m_columns;     // How many columns does the data have. Usually equal to column index map size.
 | 
						|
    MYSQL_ROW m_rowdata;   // Data for current row
 | 
						|
    int64_t m_current_row; // Index of current row
 | 
						|
};
 |