From: Nick Porter Date: Mon, 14 Oct 2024 17:00:31 +0000 (+0100) Subject: Firebird can detect key conflicts X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8463395d09e7296fccf00a313faa8ec799c9fe21;p=thirdparty%2Ffreeradius-server.git Firebird can detect key conflicts --- diff --git a/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c b/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c index d73362e7c79..f6c04879d6f 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c @@ -122,6 +122,10 @@ static void sql_trunk_request_mux(UNUSED fr_event_list_t *el, trunk_connection_t goto try_again; } + if (sql_conn->sql_code == DUPLICATE_KEY_SQL_CODE) { + query_ctx->rcode = RLM_SQL_ALT_QUERY; + goto finish; + } ROPTIONAL(RERROR, ERROR, "conn_id rlm_sql_firebird,sql_query error: sql_code=%li, error='%s', query=%s", (long int) sql_conn->sql_code, sql_conn->error, query_ctx->query_str); @@ -149,6 +153,7 @@ static void sql_trunk_request_mux(UNUSED fr_event_list_t *el, trunk_connection_t } query_ctx->rcode = RLM_SQL_OK; +finish: query_ctx->status = SQL_QUERY_RETURNED; trunk_request_signal_reapable(treq); if (request) unlang_interpret_mark_runnable(request); @@ -294,6 +299,7 @@ rlm_sql_driver_t rlm_sql_firebird = { .name = "sql_firebird", .magic = MODULE_MAGIC_INIT }, + .flags = RLM_SQL_RCODE_FLAGS_ALT_QUERY, .sql_query_resume = sql_query_resume, .sql_select_query_resume = sql_query_resume, .sql_affected_rows = sql_affected_rows, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.c b/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.c index 2b699817830..0f5b0dbb8a7 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.c @@ -78,6 +78,8 @@ int fb_error(rlm_sql_firebird_conn_t *conn) if (IS_ISC_ERROR(conn->status)) { conn->sql_code = isc_sqlcode(conn->status); + if (conn->sql_code == DUPLICATE_KEY_SQL_CODE) return conn->sql_code; + /* * pstatus is a pointer into the status array which is * advanced by isc_interprete. It's initialised to the diff --git a/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.h b/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.h index 8553b54bdf6..04b31aacf90 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.h +++ b/src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.h @@ -32,6 +32,7 @@ RCSIDH(sql_fbapi_h, "$Id$") #define DEADLOCK_SQL_CODE -913 #define DOWN_SQL_CODE -902 +#define DUPLICATE_KEY_SQL_CODE -803 #if defined(_LP64) || defined(__LP64__) || defined(__arch64__) #define ISC_LONG_FMT "d"