2015-04-01 15:23:23 +03:00

327 lines
9.0 KiB
C

#include <my_config.h>
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysqld_error.h>
int main(int argc, char** argv)
{
/**
* This test sets a session variable, creates tables in each of the shards
* and inserts into them a single value while querying the session variable.
* This will show if the value in the session variable in the shard is set and
* if it is the same in all the shards.
*
* The test fails if any of the session variables is not set or differ from the original value.
*/
const unsigned int ports[4] = {
3000,
3001,
3002,
3003
};
const char* srv_id[4] = {
"3000",
"3001",
"3002",
"3003"
};
const char* databases[4] = {
"db0",
"db1",
"db2",
"db3"
};
MYSQL* server;
MYSQL_RES *result,*shdres;
MYSQL_ROW row;
char *host = NULL,*username = NULL, *password = NULL;
char query[2048];
unsigned int port,errnum,optval;
unsigned long *lengths;
int rval, i, j;
if(argc < 5)
{
fprintf(stderr,"Usage: %s <host> <port> <username> <password>\n",argv[0]);
return 1;
}
host = strdup(argv[1]);
port = atoi(argv[2]);
username = strdup(argv[3]);
password = strdup(argv[4]);
rval = 0;
for(i = 0;i<4;i++)
{
if((server = mysql_init(NULL)) == NULL){
fprintf(stderr,"Error : Initialization of MySQL client failed.\n");
rval = 1;
goto report;
}
optval = 1;
mysql_options(server,MYSQL_OPT_CONNECT_TIMEOUT,&optval);
if(mysql_real_connect(server,host,username,password,NULL,ports[i],NULL,0) == NULL){
fprintf(stderr, "Failed to connect to server on port %d: %s\n",
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
sprintf(query,"STOP SLAVE");
if(mysql_real_query(server,query,strlen(query)))
{
fprintf(stderr, "Failed to stop slave in %d: %s.\n",
ports[i],
mysql_error(server));
}
for(j = 0;j<4;j++)
{
sprintf(query,"DROP DATABASE IF EXISTS %s",databases[j]);
if(mysql_real_query(server,query,strlen(query)))
{
fprintf(stderr, "Failed to drop database in %d: %s.\n",
ports[i],
mysql_error(server));
}
}
mysql_close(server);
}
for(i=0;i<4;i++)
{
if((server = mysql_init(NULL)) == NULL){
fprintf(stderr,"Error : Initialization of MySQL client failed.\n");
rval = 1;
goto report;
}
mysql_options(server,MYSQL_OPT_CONNECT_TIMEOUT,&optval);
if(mysql_real_connect(server,host,username,password,NULL,ports[i],NULL,0) == NULL){
fprintf(stderr, "Failed to connect to server on port %d: %s\n",
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
sprintf(query,"CREATE DATABASE %s",databases[i]);
if(mysql_real_query(server,query,strlen(query)))
{
fprintf(stderr, "Failed to create database '%s' in %d: %s.\n",
databases[i],
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
sprintf(query,"DROP TABLE IF EXISTS %s.t1",databases[i]);
if(mysql_real_query(server,query,strlen(query)))
{
fprintf(stderr, "Failed to drop table '%s.t1' in %d: %s.\n",
databases[i],
ports[i],
mysql_error(server));
}
sprintf(query,"CREATE TABLE %s.t1 (id int)",databases[i]);
if(mysql_real_query(server,query,strlen(query)))
{
fprintf(stderr, "Failed to create table '%s.t1' in %d: %s.\n",
databases[i],
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
if(mysql_select_db(server,databases[i]))
{
fprintf(stderr, "Failed to use database %s in %d: %s.\n",
databases[i],
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
sprintf(query,"INSERT INTO t1 values (%s)",srv_id[i]);
if(mysql_real_query(server,query,strlen(query)))
{
fprintf(stderr, "Failed to insert values in %d: %s.\n",
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
mysql_close(server);
}
/** Test 1 - With default database */
printf("Testing with default database.\n");
for(i = 0;i<4;i++)
{
printf("Testing database %s through MaxScale.\n",databases[i]);
if((server = mysql_init(NULL)) == NULL){
fprintf(stderr,"Error : Initialization of MySQL client failed.\n");
rval = 1;
goto report;
}
if(mysql_real_connect(server,host,username,password,databases[i],port,NULL,0) == NULL){
fprintf(stderr, "Failed to connect to port %d using database %s: %s\n",
port,
databases[i],
mysql_error(server));
rval = 1;
goto report;
}
if(mysql_real_query(server,"SELECT id FROM t1",strlen("SELECT id FROM t1")))
{
fprintf(stderr, "Failed to execute query in %d: %s.\n",
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
result = mysql_store_result(server);
while((row = mysql_fetch_row(result)))
{
if(strcmp(row[0],srv_id[i]))
{
fprintf(stderr, "Test failed in %d: Was expecting %s but got %s instead.\n",
ports[i],srv_id[i],row[0]);
rval = 1;
}
}
mysql_free_result(result);
mysql_close(server);
}
printf("Testing without default database and USE ... query.\n");
for(i = 0;i<4;i++)
{
printf("Testing server on port %d through MaxScale.\n",ports[i]);
if((server = mysql_init(NULL)) == NULL){
fprintf(stderr,"Error : Initialization of MySQL client failed.\n");
rval = 1;
goto report;
}
if(mysql_real_connect(server,host,username,password,NULL,port,NULL,0) == NULL){
fprintf(stderr, "Failed to connect to port %d using database %s: %s\n",
port,
databases[i],
mysql_error(server));
rval = 1;
goto report;
}
sprintf(query,"USE %s",databases[i]);
if(mysql_select_db(server,databases[i]))
{
fprintf(stderr, "Failed to use database %s in %d: %s.\n",
databases[i],
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
if(mysql_real_query(server,"SELECT id FROM t1",strlen("SELECT id FROM t1")))
{
fprintf(stderr, "Failed to execute query in %d: %s.\n",
ports[i],
mysql_error(server));
rval = 1;
goto report;
}
result = mysql_store_result(server);
while((row = mysql_fetch_row(result)))
{
if(strcmp(row[0],srv_id[i]))
{
fprintf(stderr, "Test failed in %d: Was expecting %s but got %s instead.\n",
ports[i],srv_id[i],row[0]);
rval = 1;
}
}
mysql_free_result(result);
mysql_close(server);
}
/** Cleanup and START SLAVE */
for(i = 0;i<4;i++)
{
if((server = mysql_init(NULL)) == NULL){
fprintf(stderr,"Error : Initialization of MySQL client failed.\n");
rval = 1;
goto report;
}
if(mysql_real_connect(server,host,username,password,NULL,port,NULL,0) == NULL){
fprintf(stderr, "Failed to connect to port %d using database %s: %s\n",
port,
databases[i],
mysql_error(server));
rval = 1;
goto report;
}
if(i > 0 && mysql_real_query(server,"START SLAVE",strlen("START SLAVE")))
{
fprintf(stderr, "Failed to start slave in %d: %s.\n",
ports[i],
mysql_error(server));
}
mysql_close(server);
}
report:
if(rval){
printf("\nTest failed: Errors during test run.\n");
}
free(host);
free(username);
free(password);
return rval;
}