<?php
// Run script from CLI using:
// # php galera-stability.php

// Fill in Node 1 DB connection information here
define('DB_HOST1', '<PROXYSQL IP>');
define('DB_USER1', '<USERNAME>');
define('DB_PASS1', '<PASSWORD>');
define('DB_NAME1', 'stability_test');
define('DB_PORT1', '<PROXYSQ PORT>');

run();

function run() {
    // Get DB connection for node 1
    try{
        $conn1 = getDbConnection1();
        
        // Make sure the connection is still available
        performTest($conn1);
        logString("\n\n");
        
        // Close connection with node 1
        mysqli_close($conn1);
    } catch (Exception $e) {
        // Close connection with node 1
        mysqli_close($conn1);
    }
}

function performTest($conn1) {
    $randomString = generateRandomString(32);
    logString("Genarting random string: " . $randomString);
    
    if (0 >= insert($conn1, $randomString)){
        logString("Cannot insert string: " . $randomString);
    } else if (!select($conn1, $randomString)) {
        logString("String $randomString was not replicated in time.");
    } else if (!update($conn1, $randomString)) {
        logString("String $randomString cannot be updated.");
    }
}

function getDbConnection1() {
    logString("Getting connection for DB 1 ... ");
    $connection = mysqli_init();
    
    // Specify connection timeout
    mysqli_options($connection, MYSQLI_OPT_CONNECT_TIMEOUT, 1);
    
    mysqli_real_connect($connection, DB_HOST1, DB_USER1, DB_PASS1, DB_NAME1, DB_PORT1);
    return $connection;
}

function insert($conn, $randomString) {
    logString("Trying to insert ...");
    
    $sql = "INSERT INTO `item` (
		`id`, `name`, `external_id`, `count`, `field1`, `field2`, `field3`, `field4`, `field5`, `field6`, `field7`, `field8`, `field9`, `field10`
	) VALUES (
		NULL, '" . $randomString . "', '" . $randomString . "', 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
	)";
    $result = mysqli_query($conn, $sql);
    $lastId = 0;
    if ($result) {
        $lastId = mysqli_insert_id($conn);
    } else {
        logString(mysqli_error($conn));
    }
    return $lastId;
}

function select($conn, $randomString) {
    logString("Trying to select ...");
    
    $return = false;
    $sql = "SELECT * FROM `item` WHERE `external_id` LIKE '" . $randomString . "'";
    $result = mysqli_query($conn, $sql);
    if ($result) {
        $return = mysqli_fetch_row($result);
    } else {
        logString(mysqli_error($conn));
    }
    return $return;
}

function update($conn, $randomString) {
    logString("Trying to update ...");
    
    $return = false;
    $sql = "UPDATE `item` SET `count`=`count` + 1 WHERE `external_id`='" . $randomString . "' AND `name`='" . $randomString . "'";
    $result = mysqli_query($conn, $sql);
    if (!$result) {
        logString(mysqli_error($conn));
    } else {
        $return = true;
    }
    return $return;
}

function connectionAvailable($conn, $connString = '') {
    logString("Testing connection available: $connString");
    $pingResult = mysqli_ping($conn);
    logString("Ping result: " . $pingResult);
    return $pingResult;
}

/**
 * Generates a string of given length
 *
 * @param $length
 * @return string
 */
function generateRandomString($length){
    $chars_set = array(
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
        //	'~', '`', '!', '@', '#', '$', '&', '*', '(', ')', '{', '}', '[', ']', '|', ':', '?'
    );
    
    $rnd_string = "";
    $number_of_characters = count($chars_set);
    for ($i = 0; $i < $length; $i++){
        $subset_index = (mt_rand(0, $number_of_characters) + mt_rand(0, 1000000)) % $number_of_characters;
        $character = $chars_set[$subset_index];
        $rnd_string .= $character;
    }
    return $rnd_string;
}

function logString($message) {
    //echo date('Y-m-d H:i:s') . ' ' . $message . "\n";
}
?>