115 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _MYSQLHINT_H
 | |
| #define _MYSQLHINT_H
 | |
| /*
 | |
|  * This file is distributed as part of the MariaDB Corporation MaxScale.  It is free
 | |
|  * software: you can redistribute it and/or modify it under the terms of the
 | |
|  * GNU General Public License as published by the Free Software Foundation,
 | |
|  * version 2.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful, but WITHOUT
 | |
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | |
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 | |
|  * details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License along with
 | |
|  * this program; if not, write to the Free Software Foundation, Inc., 51
 | |
|  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | |
|  *
 | |
|  * Copyright MariaDB Corporation Ab 2013-2014
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Revision History
 | |
|  *
 | |
|  * Date		Who		Description
 | |
|  * 17-07-2014	Mark Riddoch	Initial implementation
 | |
|  */
 | |
| #include <hint.h>
 | |
| 
 | |
| /* Parser tokens for the hint parser */
 | |
| typedef enum {
 | |
| 	TOK_MAXSCALE = 1,
 | |
| 	TOK_PREPARE,
 | |
| 	TOK_START,
 | |
| 	TOK_STOP,
 | |
| 	TOK_EQUAL,
 | |
| 	TOK_STRING,
 | |
| 	TOK_ROUTE,
 | |
| 	TOK_TO,
 | |
| 	TOK_MASTER,
 | |
| 	TOK_SLAVE,
 | |
| 	TOK_SERVER,
 | |
| 	TOK_EOL
 | |
| } TOKEN_VALUE;
 | |
| 
 | |
| /* The tokenising return type */
 | |
| typedef struct {
 | |
| 	TOKEN_VALUE	token;		// The token itself
 | |
| 	char		*value;		// The string version of the token
 | |
| } HINT_TOKEN;
 | |
| 
 | |
| /**
 | |
|  * A named hint set.
 | |
|  *
 | |
|  * The hint "MaxScale name PREPARE ..." can be used to defined a named set
 | |
|  * of hints that can be later applied.
 | |
|  */
 | |
| typedef struct namedhints {
 | |
| 	char		*name;	/*< Hintsets name */
 | |
| 	HINT		*hints;
 | |
| 	struct namedhints
 | |
| 			*next;	/*< Next named hint */
 | |
| } NAMEDHINTS;
 | |
| 
 | |
| /**
 | |
|  * A session meaintains a stack of hints, the hints BEGIN and STOP are used
 | |
|  * push hints on and off the stack. The current top of the stack is added to
 | |
|  * any statement that does not explicitly define a hint for that signle
 | |
|  * statement.
 | |
|  */
 | |
| typedef struct hintstack {
 | |
| 	HINT		*hint;
 | |
| 	struct hintstack
 | |
| 			*next;
 | |
| } HINTSTACK;
 | |
| 
 | |
| /**
 | |
|  * The hint instance structure
 | |
|  */
 | |
| typedef struct {
 | |
| 	int	sessions;
 | |
| } HINT_INSTANCE;
 | |
| 
 | |
| /**
 | |
|  * A hint parser session structure
 | |
|  */
 | |
| typedef struct {
 | |
| 	DOWNSTREAM	down;
 | |
| 	GWBUF		*request;
 | |
| 	int		query_len;
 | |
| 	HINTSTACK	*stack;
 | |
| 	NAMEDHINTS	*named_hints;	/* The named hints defined in this session */
 | |
| } HINT_SESSION;
 | |
| 
 | |
| /* Some useful macros */
 | |
| #define	CURRENT_HINT(session)	((session)->stack ? \
 | |
| 					(session)->stack->hints : NULL)
 | |
| 
 | |
| /* Hint Parser State Machine */
 | |
| #define	HS_INIT		0
 | |
| #define	HS_ROUTE	1
 | |
| #define	HS_ROUTE1	2
 | |
| #define	HS_ROUTE_SERVER	3
 | |
| #define	HS_NAME		4
 | |
| #define	HS_PVALUE	5
 | |
| #define	HS_PREPARE	6
 | |
| 
 | |
| 
 | |
| extern HINT *hint_parser(HINT_SESSION *session, GWBUF *request);
 | |
| NAMEDHINTS* free_named_hint(NAMEDHINTS* named_hint);
 | |
| HINTSTACK*  free_hint_stack(HINTSTACK* hint_stack);
 | |
| 
 | |
| 
 | |
| 
 | |
| #endif
 | 
