Files
MaxScale/server/modules/routing/dbshard/test/testdbshard.c
Markus Makela a7d1a865de Updates to how shards are discovered while the module is running
SHOW DATABASES now takes notice of the state of the backends
Added scripts for sharding test preparation and local port blocking
2014-12-17 16:22:52 +02:00

211 lines
6.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.
*/
MYSQL* server;
MYSQL_RES *result,*shdres;
MYSQL_ROW row;
char *host = NULL,*username = NULL, *password = NULL;
char query[2048];
unsigned int port,errnum;
unsigned long *lengths;
int rval;
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;
printf("Connecting to %s:%d as %s/%s\n",host,port,username,password);
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 database: %s\n",
mysql_error(server));
rval = 1;
goto report;
}
if(mysql_real_query(server,
"SET @test=123",
strlen("SET @test=123")))
{
fprintf(stderr, "Failed to set session variable: %s.\n",
mysql_error(server));
rval = 1;
goto report;
}
if((result = mysql_list_dbs(server,NULL)) == NULL){
fprintf(stderr, "Failed to query databases: %s\n",
mysql_error(server));
rval = 1;
goto report;
}
if(mysql_field_count(server) != 1)
{
fprintf(stderr, "SHOW DATABASES returned an unexpected result.\n");
rval = 1;
goto report;
}
while((row = mysql_fetch_row(result)))
{
char* dbname = strdup(row[0]);
printf("Testing database %-32s",dbname);
sprintf(query,"DROP TABLE IF EXISTS %s.t1",dbname);
if(mysql_real_query(server,(const char*)query,strlen(query)))
{
errnum = mysql_errno(server);
if(errnum != ER_DBACCESS_DENIED_ERROR &&
errnum != ER_ACCESS_DENIED_ERROR)
{
fprintf(stderr, "DROP TABLE failed in %s: %d: %s.\n",dbname,mysql_errno(server),mysql_error(server));
}
printf("NO PERMISSION\n");
continue;
}
sprintf(query,"CREATE TABLE %s.t1 (id INT)",dbname);
if(mysql_real_query(server,(const char*)query,strlen(query)))
{
errnum = mysql_errno(server);
if( errnum == ER_TABLEACCESS_DENIED_ERROR)
{
sprintf(query,"DROP TABLE IF EXISTS %s.t1",dbname);
mysql_real_query(server,(const char*)query,strlen(query));
printf("NO PERMISSION\n");
continue;
}
fprintf(stderr, "CREATE TABLE failed in %s: %d: %s.\n",
dbname,mysql_errno(server),mysql_error(server));
rval = 1;
goto report;
}
sprintf(query,"INSERT INTO %s.t1 VALUES (1);",dbname);
if(mysql_real_query(server,(const char*)query,strlen(query)))
{
fprintf(stderr, "Query to server failed: %d: %s.\n",
mysql_errno(server),mysql_error(server));
rval = 1;
goto report;
}
sprintf(query,"SELECT ID FROM %s.t1 UNION SELECT @test",dbname);
if(mysql_real_query(server,(const char*)query,strlen(query)))
{
fprintf(stderr, "Query to server failed: %d: %s.\n",
mysql_errno(server),mysql_error(server));
rval = 1;
goto report;
}
if((shdres = mysql_store_result(server)) == NULL)
{
fprintf(stderr, "Failed to fetch result set: %d: %s\n",
mysql_errno(server),mysql_error(server));
rval = 1;
goto report;
}
if(mysql_field_count(server) != 1)
{
fprintf(stderr, "Returned field count value did not match the expected value.\n");
rval = 1;
goto report;
}
/**Fetch the two rows, the inserted value and the session variable*/
if(mysql_fetch_row(shdres) == NULL ||
(row = mysql_fetch_row(shdres)) == NULL )
{
fprintf(stderr, "Number of returned rows did not match the expected value.\n");
rval = 1;
goto report;
}
if((lengths = mysql_fetch_lengths(shdres)) == NULL)
{
fprintf(stderr, "Failed to retrieve row lengths: %d: %s.\n",
mysql_errno(server),mysql_error(server));
rval = 1;
goto report;
}
if(lengths[0] != 3 || strcmp(row[0],"123"))
{
rval = 1;
printf(" FAILED\n");
printf( "Reason: Session variable was %s instead of \"123\".\n",row[0]);
}
else
{
printf("OK\n");
}
sprintf(query,"DROP TABLE %s.t1;",dbname);
if(mysql_real_query(server,(const char*)query,strlen(query)))
{
fprintf(stderr, "Query to server failed: %s.\n",mysql_error(server));
rval = 1;
goto report;
}
free(dbname);
mysql_free_result(shdres);
}
mysql_free_result(result);
mysql_close(server);
report:
if(rval){
printf("\nTest failed: Errors during test run.\n");
}
free(host);
free(username);
free(password);
return rval;
}