327 lines
9.0 KiB
C
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;
|
|
}
|