mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 16:57:16 +01:00
181 lines
3.9 KiB
C
181 lines
3.9 KiB
C
/*
|
|
*/
|
|
|
|
#include "my_test.h"
|
|
#include <ma_pthread.h>
|
|
|
|
static int basic_connect(MYSQL *unused __attribute__((unused)))
|
|
{
|
|
MYSQL_ROW row;
|
|
MYSQL_RES *res;
|
|
MYSQL_FIELD *field;
|
|
int rc;
|
|
|
|
MYSQL *my= mysql_init(NULL);
|
|
FAIL_IF(!my, "mysql_init() failed");
|
|
|
|
FAIL_IF(!my_test_connect(my, hostname, username, password, schema,
|
|
port, socketname, 0), mysql_error(my));
|
|
|
|
rc= mysql_query(my, "SELECT @@version");
|
|
check_mysql_rc(rc, my);
|
|
|
|
res= mysql_store_result(my);
|
|
FAIL_IF(!res, mysql_error(my));
|
|
field= mysql_fetch_fields(res);
|
|
FAIL_IF(!field, "Couldn't fetch fields");
|
|
|
|
while ((row= mysql_fetch_row(res)) != NULL)
|
|
{
|
|
FAIL_IF(mysql_num_fields(res) != 1, "Got the wrong number of fields");
|
|
}
|
|
FAIL_IF(mysql_errno(my), mysql_error(my));
|
|
|
|
mysql_free_result(res);
|
|
mysql_close(my);
|
|
|
|
|
|
return OK;
|
|
}
|
|
|
|
pthread_mutex_t LOCK_test;
|
|
|
|
#ifndef _WIN32
|
|
int thread_conc27(void);
|
|
#else
|
|
DWORD WINAPI thread_conc27(void);
|
|
#endif
|
|
|
|
#define THREAD_NUM 100
|
|
|
|
/* run this test as root and increase the number of handles (ulimit -n) */
|
|
static int test_conc_27(MYSQL *mysql)
|
|
{
|
|
|
|
int rc;
|
|
int i;
|
|
MYSQL_ROW row;
|
|
MYSQL_RES *res;
|
|
#ifndef _WIN32
|
|
pthread_t threads[THREAD_NUM];
|
|
#else
|
|
HANDLE hthreads[THREAD_NUM];
|
|
DWORD threads[THREAD_NUM];
|
|
#endif
|
|
|
|
diag("please run this test manually as root");
|
|
return SKIP;
|
|
|
|
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t_conc27");
|
|
check_mysql_rc(rc, mysql);
|
|
|
|
rc= mysql_query(mysql, "CREATE TABLE t_conc27(a int)");
|
|
check_mysql_rc(rc, mysql);
|
|
|
|
rc= mysql_query(mysql, "INSERT INTO t_conc27 VALUES(0)");
|
|
check_mysql_rc(rc, mysql);
|
|
|
|
rc= mysql_query(mysql, "SET @a:=@@max_connections");
|
|
check_mysql_rc(rc, mysql);
|
|
|
|
rc= mysql_query(mysql, "SET GLOBAL max_connections=100000");
|
|
check_mysql_rc(rc, mysql);
|
|
|
|
pthread_mutex_init(&LOCK_test, NULL);
|
|
for (i=0; i < THREAD_NUM; i++)
|
|
{
|
|
#ifndef _WIN32
|
|
pthread_create(&threads[i], NULL, (void *)thread_conc27, NULL);
|
|
#else
|
|
hthreads[i]= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_conc27, NULL, 0, &threads[i]);
|
|
if (hthreads[i]==NULL)
|
|
diag("error while starting thread");
|
|
#endif
|
|
}
|
|
for (i=0; i < THREAD_NUM; i++)
|
|
{
|
|
#ifndef _WIN32
|
|
pthread_join(threads[i], NULL);
|
|
#else
|
|
WaitForSingleObject(hthreads[i], INFINITE);
|
|
#endif
|
|
}
|
|
|
|
pthread_mutex_destroy(&LOCK_test);
|
|
|
|
rc= mysql_query(mysql, "SET GLOBAL max_connections=@a");
|
|
check_mysql_rc(rc, mysql);
|
|
|
|
rc= mysql_query(mysql, "SELECT a FROM t_conc27");
|
|
check_mysql_rc(rc,mysql);
|
|
|
|
res= mysql_store_result(mysql);
|
|
FAIL_IF(!res, "invalid result");
|
|
|
|
row= mysql_fetch_row(res);
|
|
FAIL_IF(!row, "can't fetch row");
|
|
|
|
diag("row=%s", row[0]);
|
|
FAIL_IF(atoi(row[0]) != THREAD_NUM, "expected value THREAD_NUM");
|
|
mysql_free_result(res);
|
|
rc= mysql_query(mysql, "DROP TABLE t_conc27");
|
|
check_mysql_rc(rc,mysql);
|
|
|
|
return OK;
|
|
}
|
|
|
|
#ifndef _WIN32
|
|
int thread_conc27(void)
|
|
#else
|
|
DWORD WINAPI thread_conc27(void)
|
|
#endif
|
|
{
|
|
MYSQL *mysql;
|
|
int rc;
|
|
MYSQL_RES *res;
|
|
mysql_thread_init();
|
|
mysql= mysql_init(NULL);
|
|
if(!my_test_connect(mysql, hostname, username, password, schema,
|
|
port, socketname, 0))
|
|
{
|
|
diag(">Error: %s", mysql_error(mysql));
|
|
mysql_close(mysql);
|
|
mysql_thread_end();
|
|
goto end;
|
|
}
|
|
pthread_mutex_lock(&LOCK_test);
|
|
rc= mysql_query(mysql, "UPDATE t_conc27 SET a=a+1");
|
|
check_mysql_rc(rc, mysql);
|
|
pthread_mutex_unlock(&LOCK_test);
|
|
check_mysql_rc(rc, mysql);
|
|
if ((res= mysql_store_result(mysql)))
|
|
mysql_free_result(res);
|
|
mysql_close(mysql);
|
|
end:
|
|
mysql_thread_end();
|
|
return 0;
|
|
}
|
|
|
|
struct my_tests_st my_tests[] = {
|
|
{"basic_connect", basic_connect, TEST_CONNECTION_NONE, 0, NULL, NULL},
|
|
{"test_conc_27", test_conc_27, TEST_CONNECTION_NEW, 0, NULL, NULL},
|
|
{NULL, NULL, 0, 0, NULL, NULL}
|
|
};
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
|
|
mysql_library_init(0,0,NULL);
|
|
|
|
if (argc > 1)
|
|
get_options(argc, argv);
|
|
|
|
get_envvars();
|
|
|
|
run_tests(my_tests);
|
|
|
|
mysql_server_end();
|
|
return(exit_status());
|
|
}
|