]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Firebird can detect key conflicts
authorNick Porter <nick@portercomputing.co.uk>
Mon, 14 Oct 2024 17:00:31 +0000 (18:00 +0100)
committerNick Porter <nick@portercomputing.co.uk>
Mon, 14 Oct 2024 17:17:44 +0000 (18:17 +0100)
src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c
src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.c
src/modules/rlm_sql/drivers/rlm_sql_firebird/sql_fbapi.h

index d73362e7c79632bd0ba6f4d5227f139292d42553..f6c04879d6fb07804103c5869e7d09dbbf4e0ebc 100644 (file)
@@ -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,
index 2b69981783082069e37567d8add46e7a3aea6648..0f5b0dbb8a7b2dd604a2e90b4b4a6deae9fc2dd7 100644 (file)
@@ -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
index 8553b54bdf6f5106484f90792543fcd33cb27106..04b31aacf9087892b1c41dc4d4a796756a91ad62 100644 (file)
@@ -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"