Added a dummy session and dcb to the filter harness.
Added tests for regexfilter.
This commit is contained in:
		@ -10,4 +10,7 @@ add_executable(harness_ui harness_ui.c harness_common.c)
 | 
				
			|||||||
add_executable(harness harness_util.c harness_common.c ${CORE})
 | 
					add_executable(harness harness_util.c harness_common.c ${CORE})
 | 
				
			||||||
target_link_libraries(harness_ui fullcore log_manager utils)
 | 
					target_link_libraries(harness_ui fullcore log_manager utils)
 | 
				
			||||||
target_link_libraries(harness fullcore)
 | 
					target_link_libraries(harness fullcore)
 | 
				
			||||||
add_test(TestHintfilter /bin/sh -c "MAXSCALE_HOME=\"${CMAKE_BINARY_DIR}\" ${CMAKE_CURRENT_BINARY_DIR}/harness -i ${CMAKE_CURRENT_SOURCE_DIR}/hint_testing.input -o ${CMAKE_CURRENT_BINARY_DIR}/hint_testing.output -c ${CMAKE_CURRENT_SOURCE_DIR}/hint_testing.cnf -t 1 -s 1 && diff ${CMAKE_CURRENT_SOURCE_DIR}/hint_testing.expected ${CMAKE_CURRENT_BINARY_DIR}/hint_testing.output;exit $?")
 | 
					execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${ERRMSG} ${CMAKE_CURRENT_BINARY_DIR})
 | 
				
			||||||
 | 
					add_test(TestHintfilter /bin/sh -c "MAXSCALE_HOME=\"${CMAKE_BINARY_DIR}\" ${CMAKE_CURRENT_BINARY_DIR}/harness -i ${CMAKE_CURRENT_SOURCE_DIR}/hint_testing.input -o ${CMAKE_CURRENT_BINARY_DIR}/hint_testing.output -c ${CMAKE_CURRENT_SOURCE_DIR}/hint_testing.cnf -t 1 -s 1 -e ${CMAKE_CURRENT_SOURCE_DIR}/hint_testing.expected")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_test(TestRegexfilter /bin/sh -c "MAXSCALE_HOME=\"${CMAKE_BINARY_DIR}\" ${CMAKE_CURRENT_BINARY_DIR}/harness -i ${CMAKE_CURRENT_SOURCE_DIR}/regextest.input -o ${CMAKE_CURRENT_BINARY_DIR}/regextest.output -c ${CMAKE_CURRENT_SOURCE_DIR}/regextest.cnf -t 1 -s 1 -e ${CMAKE_CURRENT_SOURCE_DIR}/regextest.expected")
 | 
				
			||||||
@ -69,6 +69,9 @@
 | 
				
			|||||||
#include <ini.h>
 | 
					#include <ini.h>
 | 
				
			||||||
#include <hint.h>
 | 
					#include <hint.h>
 | 
				
			||||||
#include <modutil.h>
 | 
					#include <modutil.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <mysql_client_server_protocol.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * A single name-value pair and a link to the next item in the 
 | 
					 * A single name-value pair and a link to the next item in the 
 | 
				
			||||||
 * configuration.
 | 
					 * configuration.
 | 
				
			||||||
@ -117,6 +120,7 @@ typedef struct
 | 
				
			|||||||
	int running;
 | 
						int running;
 | 
				
			||||||
	int verbose; /**Whether to print to stdout*/
 | 
						int verbose; /**Whether to print to stdout*/
 | 
				
			||||||
	int infile; /**A file where the queries are loaded from*/
 | 
						int infile; /**A file where the queries are loaded from*/
 | 
				
			||||||
 | 
						int expected;
 | 
				
			||||||
	int error;
 | 
						int error;
 | 
				
			||||||
	char* mod_dir; /**Module directory absolute path*/
 | 
						char* mod_dir; /**Module directory absolute path*/
 | 
				
			||||||
	char* infile_name;
 | 
						char* infile_name;
 | 
				
			||||||
@ -125,6 +129,7 @@ typedef struct
 | 
				
			|||||||
	FILTERCHAIN* head; /**The head of the filter chain*/
 | 
						FILTERCHAIN* head; /**The head of the filter chain*/
 | 
				
			||||||
	FILTERCHAIN* tail; /**The tail of the filter chain*/
 | 
						FILTERCHAIN* tail; /**The tail of the filter chain*/
 | 
				
			||||||
	GWBUF** buffer; /**Buffers that are fed to the filter chain*/
 | 
						GWBUF** buffer; /**Buffers that are fed to the filter chain*/
 | 
				
			||||||
 | 
						SESSION* session;
 | 
				
			||||||
	int buffer_count;
 | 
						int buffer_count;
 | 
				
			||||||
	int session_count;
 | 
						int session_count;
 | 
				
			||||||
	DOWNSTREAM dummyrouter; /**Dummy downstream router for data extraction*/
 | 
						DOWNSTREAM dummyrouter; /**Dummy downstream router for data extraction*/
 | 
				
			||||||
@ -172,7 +177,7 @@ typedef packet_t PACKET;
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Initialize the static instance.
 | 
					 * Initialize the static instance.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int harness_init(int argc,char** argv);
 | 
					int harness_init(int argc,char** argv,HARNESS_INSTANCE** inst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Frees all the query buffers
 | 
					 * Frees all the query buffers
 | 
				
			||||||
@ -359,4 +364,14 @@ GWBUF* gen_packet(PACKET pkt);
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
int process_opts(int argc, char** argv);
 | 
					int process_opts(int argc, char** argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Compares the contents of two files.
 | 
				
			||||||
 | 
					 * This function resets the offsets of the file descriptors and leaves them in an
 | 
				
			||||||
 | 
					 * undefined state.
 | 
				
			||||||
 | 
					 * @param a The first file
 | 
				
			||||||
 | 
					 * @param b The second file
 | 
				
			||||||
 | 
					 * @return 0 if the files do not differ and 1 if they do or an error occurred.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int compare_files(int a, int b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,22 @@
 | 
				
			|||||||
#include <harness.h>
 | 
					#include <harness.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int harness_init(int argc, char** argv){
 | 
					
 | 
				
			||||||
 | 
					int dcbfun(struct dcb* dcb, GWBUF * buffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						printf("Data was written to client DCB.\n");
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int harness_init(int argc, char** argv, HARNESS_INSTANCE** inst){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int i = 0;  
 | 
						int i = 0;  
 | 
				
			||||||
 | 
						MYSQL_session* mysqlsess;
 | 
				
			||||||
 | 
						DCB* dcb;
 | 
				
			||||||
 | 
						char cwd[1024];
 | 
				
			||||||
 | 
						char tmp[2048];
 | 
				
			||||||
 | 
						char** optstr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!(argc == 2 && strcmp(argv[1],"-h") == 0)){
 | 
						if(!(argc == 2 && strcmp(argv[1],"-h") == 0)){
 | 
				
			||||||
		skygw_logmanager_init(0,NULL);
 | 
							skygw_logmanager_init(0,NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -14,12 +29,36 @@ int harness_init(int argc, char** argv){
 | 
				
			|||||||
			return 1;
 | 
								return 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*inst = &instance;
 | 
				
			||||||
	instance.running = 1;
 | 
						instance.running = 1;
 | 
				
			||||||
	instance.infile = -1;
 | 
						instance.infile = -1;
 | 
				
			||||||
	instance.outfile = -1;
 | 
						instance.outfile = -1;
 | 
				
			||||||
 | 
						instance.expected = -1;
 | 
				
			||||||
	instance.buff_ind = -1;
 | 
						instance.buff_ind = -1;
 | 
				
			||||||
	instance.last_ind = -1;
 | 
						instance.last_ind = -1;
 | 
				
			||||||
	instance.sess_ind = -1;
 | 
						instance.sess_ind = -1;
 | 
				
			||||||
 | 
					    instance.session = calloc(1,sizeof(SESSION));
 | 
				
			||||||
 | 
						dcb = calloc(1,sizeof(DCB));
 | 
				
			||||||
 | 
						mysqlsess = calloc(1,sizeof(MYSQL_session));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(mysqlsess->user,"dummyuser");
 | 
				
			||||||
 | 
						sprintf(mysqlsess->db,"dummydb");		
 | 
				
			||||||
 | 
						dcb->func.write = dcbfun;
 | 
				
			||||||
 | 
						dcb->remote = strdup("0.0.0.0");
 | 
				
			||||||
 | 
						dcb->user = strdup("user");
 | 
				
			||||||
 | 
						instance.session->client = (void*)dcb;
 | 
				
			||||||
 | 
						instance.session->data = (void*)mysqlsess;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						getcwd(cwd,sizeof(cwd));
 | 
				
			||||||
 | 
						sprintf(tmp,"%s",cwd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						optstr = (char**)malloc(sizeof(char*)*4);
 | 
				
			||||||
 | 
						optstr[0] = strdup("log_manager");
 | 
				
			||||||
 | 
						optstr[1] = strdup("-j");
 | 
				
			||||||
 | 
						optstr[2] = strdup(tmp);
 | 
				
			||||||
 | 
						optstr[3] = NULL;
 | 
				
			||||||
 | 
						skygw_logmanager_init( 3, optstr);
 | 
				
			||||||
 | 
						free(optstr);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	process_opts(argc,argv);
 | 
						process_opts(argc,argv);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -84,15 +123,17 @@ void free_buffers()
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
int open_file(char* str, unsigned int write)
 | 
					int open_file(char* str, unsigned int write)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int mode;
 | 
						int mode,fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(write){
 | 
						if(write){
 | 
				
			||||||
		mode = O_RDWR|O_CREAT;
 | 
							mode = O_RDWR|O_CREAT;
 | 
				
			||||||
	}else{
 | 
						}else{
 | 
				
			||||||
		mode = O_RDONLY;
 | 
							mode = O_RDONLY;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
  
 | 
						if((fd = open(str,mode,S_IRWXU|S_IRGRP|S_IXGRP|S_IXOTH)) < 0){
 | 
				
			||||||
	return open(str,mode,S_IRWXU|S_IRGRP|S_IXGRP|S_IXOTH);
 | 
							printf("Error %d: %s\n",errno,strerror(errno));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -608,6 +649,8 @@ int load_filter(FILTERCHAIN* fc, CONFIG* cnf)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	FILTER_PARAMETER** fparams = NULL;
 | 
						FILTER_PARAMETER** fparams = NULL;
 | 
				
			||||||
	int i, paramc = -1;
 | 
						int i, paramc = -1;
 | 
				
			||||||
 | 
						int sess_err = 0;
 | 
				
			||||||
 | 
						int x;
 | 
				
			||||||
	if(cnf == NULL){
 | 
						if(cnf == NULL){
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
		fparams = read_params(¶mc);
 | 
							fparams = read_params(¶mc);
 | 
				
			||||||
@ -672,16 +715,19 @@ int load_filter(FILTERCHAIN* fc, CONFIG* cnf)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int sess_err = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(cnf && fc && fc->instance){
 | 
						if(cnf && fc && fc->instance){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fc->filter = (FILTER*)fc->instance->createInstance(NULL,fparams);
 | 
							fc->filter = (FILTER*)fc->instance->createInstance(NULL,fparams);
 | 
				
			||||||
    
 | 
							if(fc->filter == NULL){
 | 
				
			||||||
 | 
								printf("Error loading filter:%s: createInstance returned NULL.\n",fc->name);
 | 
				
			||||||
 | 
								sess_err = 1;
 | 
				
			||||||
 | 
								goto error;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		for(i = 0;i<instance.session_count;i++){
 | 
							for(i = 0;i<instance.session_count;i++){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if((fc->session[i] = fc->instance->newSession(fc->filter, fc->session[i])) &&
 | 
								if((fc->session[i] = fc->instance->newSession(fc->filter, instance.session)) &&
 | 
				
			||||||
			   (fc->down[i] = calloc(1,sizeof(DOWNSTREAM))) &&
 | 
								   (fc->down[i] = calloc(1,sizeof(DOWNSTREAM))) &&
 | 
				
			||||||
			   (fc->up[i] = calloc(1,sizeof(UPSTREAM)))){
 | 
								   (fc->up[i] = calloc(1,sizeof(UPSTREAM)))){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -693,7 +739,7 @@ int load_filter(FILTERCHAIN* fc, CONFIG* cnf)
 | 
				
			|||||||
					fc->instance->setUpstream(fc->filter, fc->session[i], fc->up[i]);
 | 
										fc->instance->setUpstream(fc->filter, fc->session[i], fc->up[i]);
 | 
				
			||||||
				}else{
 | 
									}else{
 | 
				
			||||||
					skygw_log_write(LOGFILE_MESSAGE,
 | 
										skygw_log_write(LOGFILE_MESSAGE,
 | 
				
			||||||
									"Warning: The filter %s does not support client relies.\n",fc->name);
 | 
														"Warning: The filter %s does not support client replies.\n",fc->name);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if(fc->next && fc->next->next){ 
 | 
									if(fc->next && fc->next->next){ 
 | 
				
			||||||
@ -746,8 +792,8 @@ int load_filter(FILTERCHAIN* fc, CONFIG* cnf)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						error:  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int x;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(fparams){
 | 
						if(fparams){
 | 
				
			||||||
		for(x = 0;x<paramc;x++){
 | 
							for(x = 0;x<paramc;x++){
 | 
				
			||||||
@ -863,9 +909,14 @@ void work_buffer(void* thr_num)
 | 
				
			|||||||
		   index < instance.session_count &&
 | 
							   index < instance.session_count &&
 | 
				
			||||||
		   instance.buff_ind < instance.buffer_count)
 | 
							   instance.buff_ind < instance.buffer_count)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				instance.head->instance->routeQuery(instance.head->filter,
 | 
									if(instance.head->instance->routeQuery(instance.head->filter,
 | 
				
			||||||
													instance.head->session[index],
 | 
																		instance.head->session[index],
 | 
				
			||||||
													instance.buffer[instance.buff_ind]);
 | 
																		   instance.buffer[instance.buff_ind]) == 0){
 | 
				
			||||||
 | 
										if(instance.outfile > 0){
 | 
				
			||||||
 | 
											const char* msg = "Query returned 0.\n";
 | 
				
			||||||
 | 
											write(instance.outfile,msg,strlen(msg));
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				if(instance.tail->instance->clientReply){
 | 
									if(instance.tail->instance->clientReply){
 | 
				
			||||||
					instance.tail->instance->clientReply(instance.tail->filter,
 | 
										instance.tail->instance->clientReply(instance.tail->filter,
 | 
				
			||||||
														 instance.tail->session[index],
 | 
																			 instance.tail->session[index],
 | 
				
			||||||
@ -932,7 +983,7 @@ GWBUF* gen_packet(PACKET pkt)
 | 
				
			|||||||
int process_opts(int argc, char** argv)
 | 
					int process_opts(int argc, char** argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int fd, buffsize = 1024;
 | 
						int fd, buffsize = 1024;
 | 
				
			||||||
	int rd,rdsz, rval;
 | 
						int rd,rdsz, rval = 0;
 | 
				
			||||||
	size_t fsize;
 | 
						size_t fsize;
 | 
				
			||||||
	char *buff = calloc(buffsize,sizeof(char)), *tok = NULL;
 | 
						char *buff = calloc(buffsize,sizeof(char)), *tok = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -985,10 +1036,18 @@ int process_opts(int argc, char** argv)
 | 
				
			|||||||
		close(fd);
 | 
							close(fd);
 | 
				
			||||||
		return 1;
 | 
							return 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char* conf_name = NULL;
 | 
						char* conf_name = NULL;
 | 
				
			||||||
	while((rd = getopt(argc,argv,"m:c:i:o:s:t:d:qh")) > 0){
 | 
						rval = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while((rd = getopt(argc,argv,"e:m:c:i:o:s:t:d:qh")) > 0){
 | 
				
			||||||
		switch(rd){
 | 
							switch(rd){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'e':
 | 
				
			||||||
 | 
								instance.expected = open_file(optarg,0);
 | 
				
			||||||
 | 
								printf("Expected output is read from: %s\n",optarg);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case 'o':
 | 
							case 'o':
 | 
				
			||||||
			instance.outfile = open_file(optarg,1);
 | 
								instance.outfile = open_file(optarg,1);
 | 
				
			||||||
			printf("Output is written to: %s\n",optarg);
 | 
								printf("Output is written to: %s\n",optarg);
 | 
				
			||||||
@ -1053,6 +1112,7 @@ int process_opts(int argc, char** argv)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	printf("\n");
 | 
						printf("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(conf_name && load_config(conf_name)){
 | 
						if(conf_name && load_config(conf_name)){
 | 
				
			||||||
		load_query();
 | 
							load_query();
 | 
				
			||||||
	}else{
 | 
						}else{
 | 
				
			||||||
@ -1061,5 +1121,30 @@ int process_opts(int argc, char** argv)
 | 
				
			|||||||
	free(conf_name);
 | 
						free(conf_name);
 | 
				
			||||||
	close(fd);
 | 
						close(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return rval;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int compare_files(int a,int b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char in[4098];
 | 
				
			||||||
 | 
						char exp[4098];
 | 
				
			||||||
 | 
						int line = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(a < 1 || b < 1){
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(lseek(a,0,SEEK_SET) < 0 ||
 | 
				
			||||||
 | 
						   lseek(b,0,SEEK_SET) < 0){
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(fdgets(a,in,4098) && fdgets(b,exp,4098)){
 | 
				
			||||||
 | 
							if(strcmp(in,exp)){
 | 
				
			||||||
 | 
								printf("The files differ at line %d:\n%s\n-------------------------------------\n%s\n",line,in,exp);
 | 
				
			||||||
 | 
								return 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							line++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,9 +6,9 @@ int main(int argc, char** argv){
 | 
				
			|||||||
  char* tk;
 | 
					  char* tk;
 | 
				
			||||||
  FILTERCHAIN* tmp_chn;
 | 
					  FILTERCHAIN* tmp_chn;
 | 
				
			||||||
  FILTERCHAIN* del_chn;  
 | 
					  FILTERCHAIN* del_chn;  
 | 
				
			||||||
 | 
						HARNESS_INSTANCE* hinstance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(harness_init(argc,argv,&hinstance)){
 | 
				
			||||||
	if(harness_init(argc,argv)){
 | 
					 | 
				
			||||||
		printf("Error: Initialization failed.\n");
 | 
							printf("Error: Initialization failed.\n");
 | 
				
			||||||
		skygw_log_write(LOGFILE_ERROR,"Error: Initialization failed.\n");
 | 
							skygw_log_write(LOGFILE_ERROR,"Error: Initialization failed.\n");
 | 
				
			||||||
		skygw_logmanager_done();
 | 
							skygw_logmanager_done();
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,38 @@
 | 
				
			|||||||
 | 
					#include <my_config.h>
 | 
				
			||||||
 | 
					#include <mysql.h>
 | 
				
			||||||
#include <harness.h>
 | 
					#include <harness.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc,char** argv)
 | 
					int main(int argc,char** argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if(harness_init(argc,argv) || instance.error){
 | 
					
 | 
				
			||||||
 | 
						static char* server_options[] = {
 | 
				
			||||||
 | 
							"MariaDB Corporation MaxScale",
 | 
				
			||||||
 | 
							"--datadir=./",
 | 
				
			||||||
 | 
							"--language=./",
 | 
				
			||||||
 | 
							"--skip-innodb",
 | 
				
			||||||
 | 
							"--default-storage-engine=myisam",
 | 
				
			||||||
 | 
							NULL
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static char* server_groups[] = {
 | 
				
			||||||
 | 
							"embedded",
 | 
				
			||||||
 | 
							"server",
 | 
				
			||||||
 | 
							"server",
 | 
				
			||||||
 | 
							NULL
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HARNESS_INSTANCE* inst;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(mysql_library_init(num_elements, server_options, server_groups)){
 | 
				
			||||||
 | 
							printf("Embedded server init failed.\n");
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(harness_init(argc,argv,&inst) || inst->error){
 | 
				
			||||||
		printf("Error: Initialization failed.\n");
 | 
							printf("Error: Initialization failed.\n");
 | 
				
			||||||
		skygw_log_write(LOGFILE_ERROR,"Error: Initialization failed.\n");
 | 
							skygw_log_write(LOGFILE_ERROR,"Error: Initialization failed.\n");
 | 
				
			||||||
		skygw_logmanager_done();
 | 
							skygw_logmanager_done();
 | 
				
			||||||
@ -10,5 +41,8 @@ int main(int argc,char** argv)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	route_buffers();
 | 
						route_buffers();
 | 
				
			||||||
 | 
						if(inst->expected){
 | 
				
			||||||
 | 
							return compare_files(inst->outfile,inst->expected);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,165 +1,3 @@
 | 
				
			|||||||
#
 | 
					 | 
				
			||||||
# Example MaxScale.cnf configuration file
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Number of server threads
 | 
					 | 
				
			||||||
# Valid options are:
 | 
					 | 
				
			||||||
# 	threads=<number of threads>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[maxscale]
 | 
					 | 
				
			||||||
threads=1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Define a monitor that can be used to determine the state and role of
 | 
					 | 
				
			||||||
# the servers.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Valid options are:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# 	module=<name of module to load>
 | 
					 | 
				
			||||||
# 	servers=<server name>,<server name>,...
 | 
					 | 
				
			||||||
# 	user =<user name - must have slave replication and 
 | 
					 | 
				
			||||||
#                          slave client privileges>
 | 
					 | 
				
			||||||
# 	passwd=<password of the above user, plain text currently>
 | 
					 | 
				
			||||||
#	monitor_interval=<sampling interval in milliseconds,
 | 
					 | 
				
			||||||
#                          default value is 10000>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[MySQL Monitor]
 | 
					 | 
				
			||||||
type=monitor
 | 
					 | 
				
			||||||
module=mysqlmon
 | 
					 | 
				
			||||||
servers=server1,server2,server3,server4
 | 
					 | 
				
			||||||
user=maxuser
 | 
					 | 
				
			||||||
passwd=maxpwd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# A series of service definition
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Valid options are:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# 	router=<name of router module>
 | 
					 | 
				
			||||||
# 	servers=<server name>,<server name>,...
 | 
					 | 
				
			||||||
# 	user=<User to fetch password inforamtion with>
 | 
					 | 
				
			||||||
# 	passwd=<Password of the user, plain text currently>
 | 
					 | 
				
			||||||
#	enable_root_user=<0 or 1, default is 0>
 | 
					 | 
				
			||||||
#	version_string=<specific string for server handshake,
 | 
					 | 
				
			||||||
#		default is the MariaDB embedded library version>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Valid router modules currently are:
 | 
					 | 
				
			||||||
# 	readwritesplit, readconnroute and debugcli
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[RW Split Router]
 | 
					 | 
				
			||||||
type=service
 | 
					 | 
				
			||||||
router=readwritesplit
 | 
					 | 
				
			||||||
servers=server1,server2,server3,server4
 | 
					 | 
				
			||||||
max_slave_connections=90%
 | 
					 | 
				
			||||||
user=maxuser
 | 
					 | 
				
			||||||
passwd=maxpwd
 | 
					 | 
				
			||||||
#filters=MQ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[RW Split Hint Router]
 | 
					 | 
				
			||||||
type=service
 | 
					 | 
				
			||||||
router=readwritesplit
 | 
					 | 
				
			||||||
servers=server1,server2,server3,server4
 | 
					 | 
				
			||||||
max_slave_connections=90%
 | 
					 | 
				
			||||||
user=maxuser
 | 
					 | 
				
			||||||
passwd=maxpwd
 | 
					 | 
				
			||||||
filters=Hint
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Read Connection Router]
 | 
					 | 
				
			||||||
type=service
 | 
					 | 
				
			||||||
router=readconnroute
 | 
					 | 
				
			||||||
router_options=master
 | 
					 | 
				
			||||||
servers=server1
 | 
					 | 
				
			||||||
user=maxuser
 | 
					 | 
				
			||||||
passwd=maxpwd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[HTTPD Router]
 | 
					 | 
				
			||||||
type=service
 | 
					 | 
				
			||||||
router=testroute
 | 
					 | 
				
			||||||
servers=server1,server2,server3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Debug Interface]
 | 
					 | 
				
			||||||
type=service
 | 
					 | 
				
			||||||
router=debugcli
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Hint]
 | 
					[Hint]
 | 
				
			||||||
type=filter
 | 
					type=filter
 | 
				
			||||||
module=hintfilter
 | 
					module=hintfilter
 | 
				
			||||||
 | 
					 | 
				
			||||||
#[MQ]
 | 
					 | 
				
			||||||
#type=filter
 | 
					 | 
				
			||||||
#module=mqfilter
 | 
					 | 
				
			||||||
#exchange=x1
 | 
					 | 
				
			||||||
#key=k1
 | 
					 | 
				
			||||||
#queue=q1
 | 
					 | 
				
			||||||
#port=5673
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Listener definitions for the services
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Valid options are:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# 	service=<name of service defined elsewhere>
 | 
					 | 
				
			||||||
# 	protocol=<name of protocol module with which to listen>
 | 
					 | 
				
			||||||
# 	port=<Listening port>
 | 
					 | 
				
			||||||
#	address=<Address to bind to>
 | 
					 | 
				
			||||||
#	socket=<Listening socket>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[RW Split Listener]
 | 
					 | 
				
			||||||
type=listener
 | 
					 | 
				
			||||||
service=RW Split Router
 | 
					 | 
				
			||||||
protocol=MySQLClient
 | 
					 | 
				
			||||||
port=4006
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[RW Split Hint Listener]
 | 
					 | 
				
			||||||
type=listener
 | 
					 | 
				
			||||||
service=RW Split Hint Router
 | 
					 | 
				
			||||||
protocol=MySQLClient
 | 
					 | 
				
			||||||
port=4009
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Read Connection Listener]
 | 
					 | 
				
			||||||
type=listener
 | 
					 | 
				
			||||||
service=Read Connection Router
 | 
					 | 
				
			||||||
protocol=MySQLClient
 | 
					 | 
				
			||||||
port=4008
 | 
					 | 
				
			||||||
#socket=/tmp/readconn.sock
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Debug Listener]
 | 
					 | 
				
			||||||
type=listener
 | 
					 | 
				
			||||||
service=Debug Interface
 | 
					 | 
				
			||||||
protocol=telnetd
 | 
					 | 
				
			||||||
port=4442
 | 
					 | 
				
			||||||
#address=127.0.0.1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[HTTPD Listener]
 | 
					 | 
				
			||||||
type=listener
 | 
					 | 
				
			||||||
service=HTTPD Router
 | 
					 | 
				
			||||||
protocol=HTTPD
 | 
					 | 
				
			||||||
port=6444
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Definition of the servers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[server1]
 | 
					 | 
				
			||||||
type=server
 | 
					 | 
				
			||||||
address=127.0.0.1
 | 
					 | 
				
			||||||
port=3000
 | 
					 | 
				
			||||||
protocol=MySQLBackend
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[server2]
 | 
					 | 
				
			||||||
type=server
 | 
					 | 
				
			||||||
address=127.0.0.1
 | 
					 | 
				
			||||||
port=3001
 | 
					 | 
				
			||||||
protocol=MySQLBackend
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[server3]
 | 
					 | 
				
			||||||
type=server
 | 
					 | 
				
			||||||
address=127.0.0.1
 | 
					 | 
				
			||||||
port=3002
 | 
					 | 
				
			||||||
protocol=MySQLBackend
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[server4]
 | 
					 | 
				
			||||||
type=server
 | 
					 | 
				
			||||||
address=127.0.0.1
 | 
					 | 
				
			||||||
port=3003
 | 
					 | 
				
			||||||
protocol=MySQLBackend
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								server/modules/filter/test/regextest.cnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								server/modules/filter/test/regextest.cnf
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					[Regex]
 | 
				
			||||||
 | 
					type=filter
 | 
				
			||||||
 | 
					module=regexfilter
 | 
				
			||||||
 | 
					match=wrong
 | 
				
			||||||
 | 
					replace=right
 | 
				
			||||||
							
								
								
									
										3
									
								
								server/modules/filter/test/regextest.expected
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								server/modules/filter/test/regextest.expected
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					select * from mysql.right;
 | 
				
			||||||
 | 
					select right from test.table;
 | 
				
			||||||
 | 
					select * from test.table where name='right';
 | 
				
			||||||
							
								
								
									
										3
									
								
								server/modules/filter/test/regextest.input
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								server/modules/filter/test/regextest.input
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					select * from mysql.wrong;
 | 
				
			||||||
 | 
					select wrong from test.table;
 | 
				
			||||||
 | 
					select * from test.table where name='wrong';
 | 
				
			||||||
		Reference in New Issue
	
	Block a user