#include <mysql/mysql.h>
#include <string>
#include <iostream>
#include <vector>
#include <thread>
#include <sstream>

const std::string constant("'" + std::string(1024 * 1024 * 5, 'a') + "'");

int main(int argc, char** argv)
{
    std::vector<std::thread> threads;
    int THREADS = 16;
    srand(time(nullptr));

    for (int t = 0; t < THREADS; t++)
    {
        auto fn = [&, t](){
            MYSQL* c = mysql_init(nullptr);

            if (!mysql_real_connect(c, "127.0.0.1", "maxuser", "maxpwd", "test", 4006, nullptr, 0))
            {
                std::cout << "Connect: " << mysql_error(c) << std::endl;
            }
            else
            {
                int64_t queries = 0;

                while (true)
                {
                    std::ostringstream ss;
                    ss << "SELECT " + constant;
 
                    for (int i = 0; i < 64; i++)
                    {
                        ss << ", '" << rand() << "' as `" << rand() << "_" << queries << "`";
                    }

                    auto query = ss.str();
                    
                    if (mysql_query(c, query.c_str()))
                    {
                        std::cout << "Error: " << mysql_error(c) << std::endl;
                        mysql_close(c);
                        return;
                    }
                    
                    if (auto res = mysql_use_result(c))
                    {
                        mysql_free_result(res);
                    }

                    ++queries;
                }
            }

            mysql_close(c);
        };

        threads.emplace_back(fn);
    }

    for (auto& t : threads)
    {
        t.join();
    }

    return 0;
}
