#include "testconnections.h"
#include <iostream>

using namespace std;

void print_stmt_error(MYSQL_STMT *stmt, const char* msg)
{
    cout << "Error: " << msg << ": " << mysql_stmt_error(stmt) << endl;
}

static int test_long_data(MYSQL *conn, int sqlsize)
{
    int data1size = sqlsize / 2;

    char * data1 = (char*) malloc(data1size);
    memset(data1, 97, data1size);
    char * data3 = (char*) malloc(sqlsize);
    memset(data3, 99, sqlsize);

    MYSQL_STMT *stmt;
    stmt = mysql_stmt_init(conn);
    int        int_data;
    MYSQL_RES  *result;
    MYSQL_BIND my_bind[1];

    mysql_autocommit(conn, 1);

    if (NULL == stmt)
    {
        fprintf(stderr, "%s", mysql_error(conn));
        return 0;
    }
    if (mysql_stmt_prepare(stmt, "select ?", strlen("select ?")) != 0)
    {
        print_stmt_error(stmt, "stmt prepare fail");
        return 0;
    }

    memset((char*) my_bind, 0, sizeof(my_bind));

    my_bind[0].buffer = (void *)&int_data;
    my_bind[0].buffer_type = MYSQL_TYPE_STRING;

    if (mysql_stmt_bind_param(stmt, my_bind) != 0)
    {
        print_stmt_error(stmt, "bind param error");
        return 0;
    }

    /* supply data in pieces */
    if (mysql_stmt_send_long_data(stmt, 0, data1, data1size) != 0)
    {
        print_stmt_error(stmt, "send long data1 failed");
        return 0;
    }
    if (mysql_stmt_send_long_data(stmt, 0, data3, sqlsize) != 0)
    {
        print_stmt_error(stmt, "send long data3 failed");
        return 0;
    }

    /* execute */
    if (mysql_stmt_execute(stmt) != 0)
    {
        print_stmt_error(stmt, "execute prepare stmt failed");
        return 0;
    }
    /* get the result */
    result = mysql_store_result(conn);
    mysql_free_result(result);
    mysql_stmt_close(stmt);
    free(data1);
    free(data3);
    return 1;
}

int main(int argc, char** argv)
{
    TestConnections test(argc, argv);

    test.maxscales->connect();
    test.assert(test_long_data(test.maxscales->conn_rwsplit[0], 123456), "Test should work");
    test.maxscales->disconnect();

    return test.global_result;
}
