From e62193f887b236eba7e2fa66afd446a974056880 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher <tilghman@meg.abyt.es> Date: Mon, 15 Dec 2008 21:17:07 +0000 Subject: [PATCH] Allow disabling pattern match searches within the Realtime dialplan switch. (closes issue #13698) Reported by: fhackenberger Patches: 20081211__bug13698.diff.txt uploaded by Corydon76 (license 14) Tested by: fhackenberger git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@164485 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 2 ++ configs/extconfig.conf.sample | 13 +++++++++++++ pbx/pbx_realtime.c | 21 ++++++++++++++++++--- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 70d3063471..b145f1e407 100644 --- a/CHANGES +++ b/CHANGES @@ -87,6 +87,8 @@ Miscellaneous which are interpreted as relative to the astvarlibdir setting in asterisk.conf. * All deprecated CLI commands are removed from the sourcecode. They are now handled by the new clialiases module. See cli_aliases.conf.sample file. + * The realtime switch now supports an option flag, 'p', which disables searches for + pattern matches. Asterisk Manager Interface -------------------------- diff --git a/configs/extconfig.conf.sample b/configs/extconfig.conf.sample index 4c3899fcd5..8a17f9b41f 100644 --- a/configs/extconfig.conf.sample +++ b/configs/extconfig.conf.sample @@ -60,4 +60,17 @@ ;queue_members => odbc,asterisk ;musiconhold => mysql,asterisk ;queue_log => mysql,aasterisk +; +; +; While most dynamic realtime engines are automatically used when defined in +; this file, 'extensions', distinctively, is not. To activate dynamic realtime +; extensions, you must turn them on in each respective context within +; extensions.conf with a switch statement. The syntax is: +; switch => Realtime/[[db_context@]tablename]/<opts> +; The only option available currently is the 'p' option, which disallows +; extension pattern queries to the database. If you have no patterns defined +; in a particular context, this will save quite a bit of CPU time. However, +; note that using dynamic realtime extensions is not recommended anymore as a +; best practice; instead, you should consider writing a static dialplan with +; proper data abstraction via a tool like func_odbc. diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index fbe3c3fdc7..3488961c1a 100644 --- a/pbx/pbx_realtime.c +++ b/pbx/pbx_realtime.c @@ -46,6 +46,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/utils.h" #include "asterisk/crypto.h" #include "asterisk/astdb.h" +#include "asterisk/app.h" #define MODE_MATCH 0 #define MODE_MATCHMORE 1 @@ -53,6 +54,14 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #define EXT_DATA_SIZE 256 +enum { + OPTION_PATTERNS_DISABLED = (1 << 0), +} option_flags; + +AST_APP_OPTIONS(switch_opts, { + AST_APP_OPTION('p', OPTION_PATTERNS_DISABLED), +}); + /* Realtime switch looks up extensions in the supplied realtime table. [context@][realtimetable][/options] @@ -67,7 +76,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") */ -static struct ast_variable *realtime_switch_common(const char *table, const char *context, const char *exten, int priority, int mode) +static struct ast_variable *realtime_switch_common(const char *table, const char *context, const char *exten, int priority, int mode, struct ast_flags flags) { struct ast_variable *var; struct ast_config *cfg; @@ -97,7 +106,7 @@ static struct ast_variable *realtime_switch_common(const char *table, const char ast_copy_string(rexten, exten, sizeof(rexten)); } var = ast_load_realtime(table, ematch, rexten, "context", context, "priority", pri, SENTINEL); - if (!var) { + if (!var && !ast_test_flag(&flags, OPTION_PATTERNS_DISABLED)) { cfg = ast_load_realtime_multientry(table, "exten LIKE", "\\_%", "context", context, "priority", pri, SENTINEL); if (cfg) { char *cat = ast_category_browse(cfg, NULL); @@ -131,8 +140,11 @@ static struct ast_variable *realtime_common(const char *context, const char *ext const char *ctx = NULL; char *table; struct ast_variable *var=NULL; + struct ast_flags flags = { 0, }; char *buf = ast_strdupa(data); if (buf) { + /* "Realtime" prefix is stripped off in the parent engine. The + * remaining string is: [[context@]table][/opts] */ char *opts = strchr(buf, '/'); if (opts) *opts++ = '\0'; @@ -143,7 +155,10 @@ static struct ast_variable *realtime_common(const char *context, const char *ext } ctx = S_OR(ctx, context); table = S_OR(table, "extensions"); - var = realtime_switch_common(table, ctx, exten, priority, mode); + if (!ast_strlen_zero(opts)) { + ast_app_parse_options(switch_opts, &flags, NULL, opts); + } + var = realtime_switch_common(table, ctx, exten, priority, mode, flags); } return var; } -- GitLab