#include <iostream>
#include <string>
#include <mysql/mysql.h>
using std::cout;
using std::endl;

int main()
{
    // 1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql)
    MYSQL *mysql = mysql_init(nullptr);
    if(mysql == nullptr)
    {
        cout << "mysql init failed" << endl;
        return -1;
    }

    // 2. 连接mysql数据库
    // MYSQL *mysql_real_connect(...)
    const std::string host = "127.0.0.1";
    const std::string user = "thj";
    const std::string password = "Abcd1234@";
    const std::string db = "gobang";
    unsigned int port = 4106;
    mysql = mysql_real_connect(mysql, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0);
    if(mysql == nullptr)
    {
        cout << "connection mysql server failed" << endl;
        mysql_close(mysql);
        return -1;
    }

    // 3. 设置客户端字符集
    // int mysql_set_character_set(MYSQL *mysql, const char *csname)
    if (mysql_set_character_set(mysql, "utf8") != 0)
    {
        cout << "set client character failed: " << mysql_error(mysql) << endl;
    }

    // 4. 选择要操作的数据库
    // int mysql_select_db(MYSQL *mysql, const char *db)
    // mysql_select_db(mysql, db.c_str());

    // 5. 执行sql语句 -- 增删改
    // int mysql_query(MYSQL *mysql, const char *stmt_str)
    if(mysql_query(mysql, "insert into user values(null, '张三', 18, '11122223333')") != 0)
    {
        cout << "sql query failed: " << mysql_error(mysql) << endl;
    }

    // 6. 执行sql语句 -- 查询
    if (mysql_query(mysql, "select * from user") != 0)
    { 
        cout << "sql query failed: " << mysql_error(mysql) << endl;
    }
    // 6.1 将查询结果转储到本地
    // MYSQL_RES *mysql_store_result(MYSQL *mysql)
    MYSQL_RES *res = mysql_store_result(mysql);
    if(res == nullptr)
    {
        cout << "store query result failed: " << mysql_error(mysql) << endl;
        mysql_close(mysql);
        return -1;
    }
    // 6.2 获取结果集的行数与列数
    // uint64_t mysql_num_rows(MYSQL_RES *result)
    // unsigned int mysql_num_fields(MYSQL_RES *result)
    int rowCount = mysql_num_rows(res);
    int colCount = mysql_num_fields(res);
    // 6.3 打印结果集中的列属性信息
    // MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) 一次获取一列
    // MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 一次获取全部
    for(int i = 0; i < colCount; i++)
    {
        // 自动迭代
        MYSQL_FIELD *field = mysql_fetch_field(res);
        cout << field->name << '\t';
    }
    cout << endl;
    // 一次获取全部列字段的属性信息，然后分别打印
    // MYSQL_FIELD *total_fields = mysql_fetch_fields(res);
    // for(int i = 0; i < colCount; i++)
    // {
    //     cout << total_fields[i].name << '\t';
    // }
    // cout << endl;

    // 6.4 打印结果集中的行内容
    // MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
    for(int i = 0; i < rowCount; i++)
    {
        // 一行的所有内容 -- 自动迭代
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j = 0; j < colCount; j++)
        {
            // 一行内容中的某一列的内容
            cout << row[j] << '\t';
        }
        cout << endl;
    }

   // 7. 释放结果集
   mysql_free_result(res);

   // 8. 关闭mysql连接
   mysql_close(mysql);

    return 0;
}