Addition of global Makefile
First example external module, testroute, has been added. This serves more as an example than a real router Updated module loading to used fixed GetModuleObject route and addition of ModuleInit routine
This commit is contained in:
27
Makefile
Normal file
27
Makefile
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# This file is distributed as part of the SkySQL Gateway. 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 SkySQL Ab 2013
|
||||||
|
#
|
||||||
|
# Revision History
|
||||||
|
# Date Who Description
|
||||||
|
# 14/06/13 Mark Riddoch Initial implementation
|
||||||
|
|
||||||
|
all:
|
||||||
|
(cd core; make)
|
||||||
|
(cd modules/routing; make)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
(cd core; make clean)
|
||||||
|
(cd modules/routing; make clean)
|
@ -179,6 +179,8 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
fprintf(stderr, "(C) SkySQL Ab 2013\n");
|
fprintf(stderr, "(C) SkySQL Ab 2013\n");
|
||||||
|
|
||||||
|
load_module("testroute", "Router");
|
||||||
|
|
||||||
if (sigfillset(&sigset) != 0) {
|
if (sigfillset(&sigset) != 0) {
|
||||||
fprintf(stderr, "sigfillset() error %s\n", strerror(errno));
|
fprintf(stderr, "sigfillset() error %s\n", strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
*
|
*
|
||||||
* Date Who Description
|
* Date Who Description
|
||||||
* 13/06/13 Mark Riddoch Initial implementation
|
* 13/06/13 Mark Riddoch Initial implementation
|
||||||
|
* 14/06/13 Mark Riddoch Updated to add call to ModuleInit if one is defined
|
||||||
|
* in the loaded module.
|
||||||
|
* Also updated to call fixed GetModuleObject
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
@ -51,7 +54,7 @@ static void unregister_module(const char *module);
|
|||||||
* @return The module specific entry point structure or NULL
|
* @return The module specific entry point structure or NULL
|
||||||
*/
|
*/
|
||||||
void *
|
void *
|
||||||
load_module(const char *module, const char *type, const char *entry)
|
load_module(const char *module, const char *type)
|
||||||
{
|
{
|
||||||
char *home, *version;
|
char *home, *version;
|
||||||
char fname[MAXPATHLEN];
|
char fname[MAXPATHLEN];
|
||||||
@ -67,7 +70,7 @@ MODULES *mod;
|
|||||||
*
|
*
|
||||||
* Search of the shared object.
|
* Search of the shared object.
|
||||||
*/
|
*/
|
||||||
sprintf(fname, "lib%s.so", module);
|
sprintf(fname, "./lib%s.so", module);
|
||||||
if (access(fname, F_OK) == -1)
|
if (access(fname, F_OK) == -1)
|
||||||
{
|
{
|
||||||
if ((home = getenv("GATEWAY_HOME")) == NULL)
|
if ((home = getenv("GATEWAY_HOME")) == NULL)
|
||||||
@ -94,7 +97,16 @@ MODULES *mod;
|
|||||||
ver = sym;
|
ver = sym;
|
||||||
version = ver();
|
version = ver();
|
||||||
|
|
||||||
if ((sym = dlsym(dlhandle, entry)) == NULL)
|
/*
|
||||||
|
* If the module has a ModuleInit function cal it now.
|
||||||
|
*/
|
||||||
|
if ((sym = dlsym(dlhandle, "ModuleInit")) != NULL)
|
||||||
|
{
|
||||||
|
void (*ModuleInit)() = sym;
|
||||||
|
ModuleInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sym = dlsym(dlhandle, "GetModuleObject")) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Expected entry point interface missing from module: %s, %s\n", module, dlerror());
|
fprintf(stderr, "Expected entry point interface missing from module: %s, %s\n", module, dlerror());
|
||||||
dlclose(dlhandle);
|
dlclose(dlhandle);
|
||||||
|
@ -38,7 +38,7 @@ typedef struct modules {
|
|||||||
*next; /* Next module in the linked list */
|
*next; /* Next module in the linked list */
|
||||||
} MODULES;
|
} MODULES;
|
||||||
|
|
||||||
extern void *load_module(const char *module, const char *type, const char *entry);
|
extern void *load_module(const char *module, const char *type);
|
||||||
extern void unload_module(const char *module);
|
extern void unload_module(const char *module);
|
||||||
extern void printModules();
|
extern void printModules();
|
||||||
#endif
|
#endif
|
||||||
|
59
include/router.h
Normal file
59
include/router.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#ifndef _ROUTER_H
|
||||||
|
#define _ROUTER_H
|
||||||
|
/*
|
||||||
|
* This file is distributed as part of the SkySQL Gateway. 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 SkySQL Ab 2013
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The query router interface mechanisms
|
||||||
|
*
|
||||||
|
* Revision History
|
||||||
|
*
|
||||||
|
* Date Who Description
|
||||||
|
* 14/06/13 Mark Riddoch Initial implementation
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <service.h>
|
||||||
|
#include <session.h>
|
||||||
|
#include <buffer.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the ROUTER handle points to module specific data, so the best we can do
|
||||||
|
* is to make it a void * externally.
|
||||||
|
*/
|
||||||
|
typedef void *ROUTER;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The "module object" structure for a query router module
|
||||||
|
*
|
||||||
|
* The entry points are:
|
||||||
|
* createInstance Called by the service to create a new
|
||||||
|
* instance of the query router
|
||||||
|
* newSession Called to create a new user session
|
||||||
|
* within the query router
|
||||||
|
* closeSession Called when a session is closed
|
||||||
|
* routeQuery Called on each query that requires
|
||||||
|
* routing
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
ROUTER *(*createInstance)(SERVICE *service);
|
||||||
|
void *(*newSession)(ROUTER *instance, SESSION *session);
|
||||||
|
void (*closeSession)(ROUTER *instance, SESSION *session);
|
||||||
|
int (*routeQuery)(ROUTER *instance, SESSION *session, GWBUF *queue);
|
||||||
|
} ROUTER_OBJECT;
|
||||||
|
#endif
|
52
include/service.h
Normal file
52
include/service.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#ifndef _SERVICE_H
|
||||||
|
#define _SERVICE_H
|
||||||
|
/*
|
||||||
|
* This file is distributed as part of the SkySQL Gateway. 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 SkySQL Ab 2013
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The service level definitions within the gateway
|
||||||
|
*
|
||||||
|
* Revision History
|
||||||
|
*
|
||||||
|
* Date Who Description
|
||||||
|
* 14/06/13 Mark Riddoch Initial implementation
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct server;
|
||||||
|
struct router;
|
||||||
|
|
||||||
|
typedef struct servprotocol {
|
||||||
|
char *protocol; /* Protocol name */
|
||||||
|
int port; /* Port to listen on */
|
||||||
|
char *routerModule; /* Name of router module to use */
|
||||||
|
struct router *router;
|
||||||
|
struct servprotocol
|
||||||
|
*next; /* Next service protocol */
|
||||||
|
} SERV_PROTOCOL;
|
||||||
|
|
||||||
|
typedef struct service {
|
||||||
|
char *name; /* The service name */
|
||||||
|
SERV_PROTOCOL *ports; /* Linked list of ports and protocols
|
||||||
|
* that this service will listen on.
|
||||||
|
*/
|
||||||
|
struct server *servers; /* Linked list of databases associated
|
||||||
|
* with this service
|
||||||
|
*/
|
||||||
|
} SERVICE;
|
||||||
|
|
||||||
|
#endif
|
38
modules/routing/Makefile
Normal file
38
modules/routing/Makefile
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# This file is distributed as part of the SkySQL Gateway. 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 SkySQL Ab 2013
|
||||||
|
#
|
||||||
|
# Revision History
|
||||||
|
# Date Who Description
|
||||||
|
# 13/06/13 Mark Riddoch Initial routing module development
|
||||||
|
|
||||||
|
CC=cc
|
||||||
|
CFLAGS=-c -fPIC -I/usr/include -I../include -I../../include
|
||||||
|
LDFLAGS=-shared
|
||||||
|
SRCS=testroute.c
|
||||||
|
OBJ=$(SRCS:.c=.o)
|
||||||
|
LIBS=-lssl
|
||||||
|
|
||||||
|
libtestroute.so: $(OBJ)
|
||||||
|
$(CC) $(LDFLAGS) $(OBJ) $(LIBS) -o $@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJ) libtestroute.so
|
||||||
|
|
||||||
|
tags:
|
||||||
|
ctags $(SRCS) $(HDRS)
|
107
modules/routing/testroute.c
Normal file
107
modules/routing/testroute.c
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* This file is distributed as part of the SkySQL Gateway. 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 SkySQL Ab 2013
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <router.h>
|
||||||
|
|
||||||
|
static char *version_str = "V1.0.0";
|
||||||
|
|
||||||
|
static ROUTER *createInstance(SERVICE *service);
|
||||||
|
static void *newSession(ROUTER *instance, SESSION *session);
|
||||||
|
static void closeSession(ROUTER *instance, SESSION *session);
|
||||||
|
static int routeQuery(ROUTER *instance, SESSION *session, GWBUF *queue);
|
||||||
|
|
||||||
|
static ROUTER_OBJECT MyObject = { createInstance, newSession, closeSession, routeQuery };
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Implementation of the mandatory version entry point
|
||||||
|
*
|
||||||
|
* @return version string of the module
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
version()
|
||||||
|
{
|
||||||
|
return version_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The module initialisation routine, called when the module
|
||||||
|
* is first loaded.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ModuleInit()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Initial test router module.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The module entry point routine. It is this routine that
|
||||||
|
* must populate the structure that is referred to as the
|
||||||
|
* "module object", this is a structure with the set of
|
||||||
|
* external entry points for this module.
|
||||||
|
*
|
||||||
|
* @return The module object
|
||||||
|
*/
|
||||||
|
ROUTER_OBJECT *
|
||||||
|
GetModuleObject()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Returing test router module object.\n");
|
||||||
|
return &MyObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create an instance of the router for a particular service
|
||||||
|
* within the gateway.
|
||||||
|
*
|
||||||
|
* @param service The service this router is being create for
|
||||||
|
*
|
||||||
|
* @return The instance data for this new instance
|
||||||
|
*/
|
||||||
|
static ROUTER *
|
||||||
|
createInstance(SERVICE *service)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Associate a new session with this instance of the router.
|
||||||
|
*
|
||||||
|
* @param instance The router instance data
|
||||||
|
* @param session The session itself
|
||||||
|
* @return Session specific data for this session
|
||||||
|
*/
|
||||||
|
static void *
|
||||||
|
newSession(ROUTER *instance, SESSION *session)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close a session with the router, this is the mechanism
|
||||||
|
* by which a router may cleanup data structure etc.
|
||||||
|
*
|
||||||
|
* @param instance The router instance data
|
||||||
|
* @param session The session being closed
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
closeSession(ROUTER *instance, SESSION *session)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
routeQuery(ROUTER *instance, SESSION *session, GWBUF *queue)
|
||||||
|
{
|
||||||
|
}
|
Reference in New Issue
Block a user