diff --git a/core/od_config.c b/core/od_config.c index 27695693..a88d8692 100644 --- a/core/od_config.c +++ b/core/od_config.c @@ -47,6 +47,7 @@ static odkeyword_t od_config_keywords[] = od_keyword("server", OD_LSERVER), /* routing */ od_keyword("routing", OD_LROUTING), + od_keyword("default", OD_LDEFAULT), od_keyword("route", OD_LROUTE), od_keyword("mode", OD_LMODE), od_keyword("database", OD_LDATABASE), @@ -265,7 +266,12 @@ od_configparse_route(odconfig_t *config, odtoken_t *name) od_schemeroute_add(config->scheme); if (route == NULL) return -1; - route->target = name->v.string; + if (name == NULL) { + route->is_default = 1; + route->target = ""; + } else { + route->target = name->v.string; + } if (od_confignext(config, '{', NULL) == -1) return -1; odtoken_t *tk; @@ -355,6 +361,12 @@ od_configparse_routing(odconfig_t *config) if (rc == -1) return -1; break; + /* route default */ + case OD_LDEFAULT: + rc = od_configparse_route(config, NULL); + if (rc == -1) + return -1; + break; case OD_LEOF: od_configerror(config, tk, "unexpected end of config file"); return -1; diff --git a/core/od_config.h b/core/od_config.h index 1a446328..0ee5d75d 100644 --- a/core/od_config.h +++ b/core/od_config.h @@ -24,6 +24,7 @@ enum { OD_LCLIENT_MAX, OD_LSERVER, OD_LROUTING, + OD_LDEFAULT, OD_LROUTE, OD_LMODE, OD_LDATABASE, diff --git a/core/od_scheme.c b/core/od_scheme.c index f7cf3817..00379563 100644 --- a/core/od_scheme.c +++ b/core/od_scheme.c @@ -28,6 +28,7 @@ void od_schemeinit(odscheme_t *scheme) scheme->pooling_mode = OD_PUNDEF; scheme->routing = NULL; scheme->routing_mode = OD_RUNDEF; + scheme->routing_default = NULL; scheme->server_id = 0; od_listinit(&scheme->servers); od_listinit(&scheme->routing_table); @@ -158,6 +159,8 @@ int od_schemevalidate(odscheme_t *scheme, odlog_t *log) } } + odscheme_route_t *default_route = NULL; + /* routing table */ od_listforeach(&scheme->routing_table, i) { odscheme_route_t *route; @@ -173,7 +176,15 @@ int od_schemevalidate(odscheme_t *scheme, odlog_t *log) route->route); return -1; } + if (route->is_default) { + if (default_route) { + od_error(log, "more than one default route"); + return -1; + } + default_route = route; + } } + scheme->routing_default = default_route; return 0; } @@ -208,8 +219,10 @@ void od_schemeprint(odscheme_t *scheme, odlog_t *log) od_listforeach(&scheme->routing_table, i) { odscheme_route_t *route; route = od_container_of(i, odscheme_route_t, link); - od_log(log, " <%s>", route->database); + od_log(log, " <%s>", route->target); od_log(log, " route '%s'", route->route); + if (route->database) + od_log(log, " database '%s'", route->database); if (route->user) od_log(log, " user '%s'", route->user); if (route->password) diff --git a/core/od_scheme.h b/core/od_scheme.h index af13f218..9a5cc882 100644 --- a/core/od_scheme.h +++ b/core/od_scheme.h @@ -35,6 +35,7 @@ struct odscheme_server_t { struct odscheme_route_t { odscheme_server_t *server; + int is_default; char *target; char *route; char *database; @@ -47,25 +48,26 @@ struct odscheme_route_t { }; struct odscheme_t { - char *config_file; - int server_id; + char *config_file; + int server_id; /* main */ - int daemonize; - char *log_file; - char *pid_file; - char *pooling; - odpooling_t pooling_mode; + int daemonize; + char *log_file; + char *pid_file; + char *pooling; + odpooling_t pooling_mode; /* listen */ - char *host; - int port; - int workers; - int client_max; + char *host; + int port; + int workers; + int client_max; /* servers */ - odlist_t servers; + odlist_t servers; /* routing */ - char *routing; - odrouting_t routing_mode; - odlist_t routing_table; + char *routing; + odrouting_t routing_mode; + odscheme_route_t *routing_default; + odlist_t routing_table; }; void od_schemeinit(odscheme_t*); diff --git a/odissey.conf b/odissey.conf index 7375b74a..b849db3e 100644 --- a/odissey.conf +++ b/odissey.conf @@ -36,7 +36,15 @@ odissey { routing { mode "forward" # round-robin - "*" { + "testdb" { + route "default" + pool_min 0 + pool_max 100 + client_max 100 + # force user, db, limits + } + + default { route "default" pool_min 0 pool_max 100