#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <time.h>  
#include "mysql.h" 
#include <iostream>
#include <cstring>

using namespace std;
char *user = "xx", *passwd = NULL, *dbname = "test", *host="127.0.0.1";
int port = 9224;

std::string PrepareSql(unsigned c,unsigned d)
{
    std::string insert_sql = "INSERT INTO ";
    insert_sql.append(" tab_test ");
    insert_sql.append(" VALUES ");
    for (unsigned n = 0; n < d; ++ n)
    {
        insert_sql.append(" ('moc.naolila') , ");
    }
    int mFieldNum = 1 ;
    // rows
    for (unsigned j = 0; j < c; ++ j)
    {
        insert_sql.append("(");
        // columns 
        for(unsigned i = 0; i < mFieldNum; ++ i)
        {
            insert_sql.append("?");
            if (i < mFieldNum -1 )
            {
                insert_sql.append(",");
            }
        }
        insert_sql.append(")");
        if (j < c - 1)
        {
            insert_sql.append(", ");
        }
    }
    return insert_sql.append("\n");
}
char * currentTime(){
    time_t rawtime;
    struct tm * timeinfo;

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    return asctime(timeinfo) ;
}
int main (int argc, char *argv[]) {

    if  (argc < 3) 
    {
        printf("\007Usage:   %s <binds_rows> <dummy_rows> \n", argv[0]);
        exit(0);
    }
    int binds_count = atoi(argv[1]);
    int dummy_count = atoi(argv[2]);
    MYSQL mConn; 
    MYSQL_STMT    *mStmt;
   
    mysql_init(&mConn);
    if (NULL == mysql_real_connect(&mConn, host, user, NULL, dbname, port, NULL, 0))
    {
        printf ("connect to mysql failed !!\n");
    }
    std::string set_charset = "set names utf8;";
    mysql_real_query(&mConn, set_charset.c_str(), set_charset.length());
    std::string create_table= "create table tab_test (a varchar(500));";
    mysql_real_query(&mConn, create_table.c_str(), create_table.length());
    mysql_autocommit(&mConn, false);

    // prepare bind parameters
    std::string insert_sql = PrepareSql(binds_count,dummy_count);
    if (insert_sql.length() < 3000)
    {
        printf ("SQL:\n %s\n", insert_sql.c_str());
    }
    else 
    {
        printf("SQL Too Long too print,Length %d !!\n",insert_sql.length());
    }
    mStmt = mysql_stmt_init(&mConn);
    mysql_stmt_prepare(mStmt, insert_sql.c_str(), insert_sql.length());
    //char **buf = new char *[binds_count];
    MYSQL_BIND *params = (MYSQL_BIND*)malloc(sizeof(MYSQL_BIND)*binds_count);
    memset(params, 0, sizeof(MYSQL_BIND)*binds_count);
    //memset(buf, 0, sizeof(char)*binds_count );

    for (unsigned i = 0; i < binds_count; ++ i)
    {
        std::string content = "aliloan.com";
        char buf[] = "aliloan.com";
        memcpy(buf, content.c_str(), content.length());
        params[i].buffer_type = MYSQL_TYPE_STRING;
        params[i].buffer = buf;
        params[i].buffer_length = content.length();
    }

    // bind parameter to statement 
    for ( int r = 0 ; r < 10 ; r++ )
    {
        if (mysql_stmt_bind_param(mStmt, params)) 
        {
            printf("bind parameter to statement got error: %d , %s",mysql_errno(&mConn),mysql_error(&mConn)); 
        }
        //execute 
        if (!mysql_stmt_execute(mStmt)) 
        {
            printf("Inserted %lu rows   AT   %s",(unsigned long)mysql_affected_rows(&mConn), currentTime());
        } 
        else 
        {
            fprintf(stderr, "Insert error %d: %s\n", mysql_errno(&mConn),mysql_error(&mConn));
        }
        
        mysql_commit(&mConn);
    }

    free(params);
    //free(buf);
}



