From: Jorge Pereira Date: Sun, 7 Mar 2021 00:16:51 +0000 (-0300) Subject: rlm_sql_map: Add 'multiple_rows' option (#3903) X-Git-Tag: release_3_0_22~163 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c6b4def5487868fd93ee2d41fff3dc01e10b8027;p=thirdparty%2Ffreeradius-server.git rlm_sql_map: Add 'multiple_rows' option (#3903) --- diff --git a/raddb/mods-available/sql_map b/raddb/mods-available/sql_map index 2798952abb..91856aa304 100644 --- a/raddb/mods-available/sql_map +++ b/raddb/mods-available/sql_map @@ -43,4 +43,7 @@ sql_map { # reply:Tunnel-Medium-Type := 5 # reply:Tunnel-Private-Group-ID := 6 } + + # If the 'query' results in multiple rows, it creates the [*] array entry. +# multiple_rows = yes } diff --git a/src/modules/rlm_sql_map/rlm_sql_map.c b/src/modules/rlm_sql_map/rlm_sql_map.c index 77ab0a0243..69d83795ae 100644 --- a/src/modules/rlm_sql_map/rlm_sql_map.c +++ b/src/modules/rlm_sql_map/rlm_sql_map.c @@ -37,9 +37,11 @@ RCSID("$Id$") typedef struct rlm_sql_map_t { char const *sql_instance_name; //!< Instance of SQL module to use, //!< usually just 'sql'. - rlm_sql_t *sql_inst; + bool multiple_rows; //!< Process all rows creating an attr[*] array + + char const *query; //!< SQL query to retrieve current - char const *query; //!< SQL query to retrieve current + rlm_sql_t *sql_inst; CONF_SECTION *cs; @@ -60,7 +62,7 @@ typedef struct rlm_sql_map_t { */ static const CONF_PARSER module_config[] = { { "sql_module_instance", FR_CONF_OFFSET(PW_TYPE_STRING | PW_TYPE_REQUIRED, rlm_sql_map_t, sql_instance_name), NULL }, - + { "multiple_rows", FR_CONF_OFFSET(PW_TYPE_BOOLEAN, rlm_sql_map_t, multiple_rows), "no" }, { "query", FR_CONF_OFFSET(PW_TYPE_STRING | PW_TYPE_XLAT | PW_TYPE_REQUIRED, rlm_sql_map_t, query), NULL }, CONF_PARSER_TERMINATOR @@ -243,6 +245,11 @@ static int sql_map_do(const rlm_sql_map_t *inst, REQUEST *request, rlm_sql_handl ctx.row = (*handle)->row; ctx.num_columns = (inst->sql_inst->module->sql_num_fields)(*handle, inst->sql_inst->config); + if (applied >= 1 && !inst->multiple_rows) { + RWDEBUG("Ignoring multiple rows. Enable the option 'multiple_rows' if you need multiple rows."); + break; + } + for (map = inst->user_map; map != NULL; map = map->next) { /* * If something bad happened, just skip, this is probably @@ -253,6 +260,8 @@ static int sql_map_do(const rlm_sql_map_t *inst, REQUEST *request, rlm_sql_handl return -1; /* Fail */ } } + + applied++; } return applied;