#include #include #include #include #include #include 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 \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; }