/* MDEV-12247 test case
 * Author: SF@4 J S dot C O M
 * Symptom: The database does not respond at second execute.
 * Note:
 * - The database is using UTF8 charset.
 * - When not setting the cursor type, the problem disappears.
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <signal.h>

#include <mysql/mysql.h>
#include <mysql/mysqld_error.h>

static char * c_host = "orion";
static char * c_user = "mdbuser";
static char * c_auth = "fourjs";
static int    c_port = 3309;
static char * c_sock = NULL;
static char * c_dbnm = "test1";

static void show_error(MYSQL * conn, MYSQL_STMT * hstmt, const char * msg)
{
    fprintf(stderr, msg);
    fprintf(stderr, "\n");
    if (hstmt == NULL) {
        fprintf(stderr, "  MySQL error number = %d\n", mysql_errno(conn));
        fprintf(stderr, "  MySQL error message= %s\n", mysql_error(conn));
    } else {
        fprintf(stderr, "  MySQL error number = %d\n", mysql_stmt_errno(hstmt));
        fprintf(stderr, "  MySQL error message= %s\n", mysql_stmt_error(hstmt));
    }
}

static void exec_direct(int soe, MYSQL * conn, const char * sql)
{
    int s = mysql_query(conn, sql);
    if (s != 0 && soe) {
        char tmp[500];
        sprintf(tmp, "Could not execute : [%s]", sql);
        show_error(conn,NULL,tmp);
        exit(1);
    }
}

int main(int argc, char ** argv)
{
    int s;
    MYSQL * conn;
    MYSQL_STMT * hstmt;

    conn = mysql_init(NULL);

    fprintf(stdout, "mysql_real_connect() ...\n");
    if (!mysql_real_connect(conn, c_host, c_user, c_auth,
                            c_dbnm, c_port, c_sock,
                            CLIENT_FOUND_ROWS)) {
        fprintf(stderr, "Could not connect (err=%d)\n", mysql_errno(conn));
        return -1;
    }

    fprintf(stdout, "mysql_stmt_init() ...\n");
    hstmt = mysql_stmt_init(conn);
    if (hstmt == NULL) {
        show_error(conn,NULL,"Could not allocate stmt handle");
        return -1;
    }

    exec_direct(0,conn,"drop table dbit2");
    exec_direct(1,conn,"create table dbit2 ( dbit2_key int, dbit2_c10 char(10), dbit2_vc200 varchar(200) )");
    exec_direct(1,conn,"insert into dbit2 values (1,'aaa','bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb')");
    exec_direct(1,conn,"insert into dbit2 values (2,'bbb','bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb')");
    exec_direct(1,conn,"insert into dbit2 values (3,'ccc','bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb')");

    fprintf(stdout, "mysql_stmt_prepare() ...\n");
    {
        const char * sqlstmt = "select * from dbit2";
        s = mysql_stmt_prepare(hstmt, sqlstmt, (unsigned long) strlen(sqlstmt));
        if (s != 0) {
            show_error(conn,NULL,"Could not prepare stmt");
            return -1;
        }
    }

#ifndef SKIP_SET_CURSOR_TYPE
    fprintf(stdout, "mysql_stmt_attr_set( ... STMT_ATTR_CURSOR_TYPE ... ) ...\n");
    {
        unsigned long ct = (unsigned long) CURSOR_TYPE_READ_ONLY;
        s = mysql_stmt_attr_set(hstmt, STMT_ATTR_CURSOR_TYPE, (const void *) &ct);
        if (s != 0) {
            show_error(conn,NULL,"Could not define the cursor type");
            return -1;
        }
    }
#endif

    fprintf(stdout, "mysql_stmt_execute()...\n");
    s = mysql_stmt_execute(hstmt);
    if (s != 0) {
        show_error(conn,hstmt,"Could not execute stmt");
        return -1;
    }

    fprintf(stdout, "Re- mysql_stmt_execute()...\n");
    s = mysql_stmt_execute(hstmt);
    if (s != 0) {
        show_error(conn,hstmt,"Could not re-execute stmt");
        return -1;
    }
    
    fprintf(stdout, "Finished...\n");

    return 0;
}
