From: Arran Cudbard-Bell Date: Thu, 7 Mar 2013 21:40:34 +0000 (-0500) Subject: Use talloc destructors to close sockets (firebird) X-Git-Tag: release_3_0_0_beta1~797 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2afe89bec9d1eab2b6dea47fbd5f218e60690308;p=thirdparty%2Ffreeradius-server.git Use talloc destructors to close sockets (firebird) --- 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 b9aae14d1ea..af881ccb3d7 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 @@ -32,31 +32,66 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, rlm_sql_config_t *config) static int sql_num_fields(rlm_sql_handle_t *handle, rlm_sql_config_t *config); static int sql_finish_query(rlm_sql_handle_t *handle, rlm_sql_config_t *config); +static int sql_socket_destructor(void *c) +{ + rlm_sql_firebird_conn_t *conn = c; + int i; + + DEBUG2("rlm_sql_firebird: socket destructor called, closing socket"); + + fb_commit(conn); + if (conn->dbh) { + fb_free_statement(conn); + isc_detach_database(conn->status, &(conn->dbh)); + + if (fb_lasterror(conn)) { + DEBUGW("rlm_sql_firebird: Got error " + "when closing socket:", conn->lasterror); + } + } + +#ifdef _PTHREAD_H + pthread_mutex_destroy (&conn->mut); +#endif + + for (i=0; i < conn->row_fcount; i++) { + free(conn->row[i]); + } + + free(conn->row); + free(conn->row_sizes); + fb_free_sqlda(conn->sqlda_out); + + free(conn->sqlda_out); + free(conn->tpb); + free(conn->dpb); + + if (conn->lasterror) { + free(conn->lasterror); + } + + return 0; +} + /** Establish connection to the db * */ static int sql_socket_init(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { - rlm_sql_firebird_sock *firebird_sock; + rlm_sql_firebird_conn_t *conn; long res; - if (!handle->conn) { - handle->conn = rad_malloc(sizeof(rlm_sql_firebird_sock)); - if (!handle->conn) { - return -1; - } - } + MEM(conn = handle->conn = talloc_zero(handle, rlm_sql_firebird_conn_t)); + talloc_set_destructor((void *) conn, sql_socket_destructor); - firebird_sock = handle->conn; - - res = fb_init_socket(firebird_sock); + res = fb_init_socket(conn); if (res) { return -1; } - if (fb_connect(firebird_sock,config)) { + if (fb_connect(conn,config)) { radlog(L_ERR, "rlm_sql_firebird: Connection failed %s\n", - firebird_sock->lasterror); + conn->lasterror); return SQL_DOWN; } @@ -64,31 +99,17 @@ static int sql_socket_init(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { return 0; } -/** Free socket and private connection data - * - */ -static int sql_destroy_socket(rlm_sql_handle_t *handle, - UNUSED rlm_sql_config_t *config) -{ - free(handle->conn); - - handle->conn = NULL; - - return 0; -} - - /** Issue a non-SELECT query (ie: update/delete/insert) to the database. * */ static int sql_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config, char *querystr) { - rlm_sql_firebird_sock *firebird_sock = handle->conn; + rlm_sql_firebird_conn_t *conn = handle->conn; int deadlock = 0; #ifdef _PTHREAD_H - pthread_mutex_lock(&firebird_sock->mut); + pthread_mutex_lock(&conn->mut); #endif try_again: @@ -96,47 +117,47 @@ static int sql_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config, * Try again query when deadlock, beacuse in any case it * will be retried. */ - if (fb_sql_query(firebird_sock,querystr)) { + if (fb_sql_query(conn,querystr)) { /* but may be lost for short sessions */ - if ((firebird_sock->sql_code == DEADLOCK_SQL_CODE) && + if ((conn->sql_code == DEADLOCK_SQL_CODE) && !deadlock) { - radlog(L_DBG,"sock_id deadlock. Retry query %s", + radlog(L_DBG,"conn_id deadlock. Retry query %s", querystr); /* * @todo For non READ_COMMITED transactions put * rollback here - * fb_rollback(sock); + * fb_rollback(conn); */ deadlock = 1; goto try_again; } - radlog(L_ERR, "sock_id rlm_sql_firebird,sql_query error: " + radlog(L_ERR, "conn_id rlm_sql_firebird,sql_query error: " "sql_code=%li, error='%s', query=%s", - (long int) firebird_sock->sql_code, - firebird_sock->lasterror, + (long int) conn->sql_code, + conn->lasterror, querystr); - if (firebird_sock->sql_code == DOWN_SQL_CODE) { + if (conn->sql_code == DOWN_SQL_CODE) { return SQL_DOWN; } /* Free problem query */ - if (fb_rollback(firebird_sock)) { + if (fb_rollback(conn)) { //assume the network is down if rollback had failed radlog(L_ERR,"Fail to rollback transaction after " "previous error. Error: %s", - firebird_sock->lasterror); + conn->lasterror); return SQL_DOWN; } - // firebird_sock->in_use=0; + // conn->in_use=0; return -1; } - if (firebird_sock->statement_type != isc_info_sql_stmt_select) { - if (fb_commit(firebird_sock)) { + if (conn->statement_type != isc_info_sql_stmt_select) { + if (fb_commit(conn)) { return -1; } } @@ -165,7 +186,7 @@ static int sql_store_result(UNUSED rlm_sql_handle_t *handle, */ static int sql_num_fields(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) { - return ((rlm_sql_firebird_sock *) handle->conn)->sqlda_out->sqld; + return ((rlm_sql_firebird_conn_t *) handle->conn)->sqlda_out->sqld; } /** Returns number of rows in query. @@ -180,30 +201,30 @@ static int sql_num_rows(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { */ static int sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) { - rlm_sql_firebird_sock *firebird_sock = handle->conn; + rlm_sql_firebird_conn_t *conn = handle->conn; int res; handle->row = NULL; - if (firebird_sock->statement_type != isc_info_sql_stmt_exec_procedure) { - res = fb_fetch(firebird_sock); + if (conn->statement_type != isc_info_sql_stmt_exec_procedure) { + res = fb_fetch(conn); if (res == 100) { return 0; } if (res) { radlog(L_ERR, "rlm_sql_firebird. Fetch problem:'%s'", - firebird_sock->lasterror); + conn->lasterror); return -1; } } else { - firebird_sock->statement_type=0; + conn->statement_type=0; } - fb_store_row(firebird_sock); + fb_store_row(conn); - handle->row = firebird_sock->row; + handle->row = conn->row; return 0; } @@ -214,10 +235,10 @@ static int sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *conf static int sql_finish_select_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) { - rlm_sql_firebird_sock *sock = (rlm_sql_firebird_sock *) handle->conn; + rlm_sql_firebird_conn_t *conn = (rlm_sql_firebird_conn_t *) handle->conn; - fb_commit(sock); - fb_close_cursor(sock); + fb_commit(conn); + fb_close_cursor(conn); return 0; } @@ -245,7 +266,7 @@ static int sql_free_result(UNUSED rlm_sql_handle_t *handle, */ static int sql_close(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) { - fb_destroy_socket((rlm_sql_firebird_sock *) handle->conn); + fb_destroy_socket((rlm_sql_firebird_conn_t *) handle->conn); return 0; } @@ -254,9 +275,9 @@ static int sql_close(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) */ static const char *sql_error(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) { - rlm_sql_firebird_sock *firebird_sock = handle->conn; + rlm_sql_firebird_conn_t *conn = handle->conn; - return firebird_sock->lasterror; + return conn->lasterror; } /** Return the number of rows affected by the query (update, or insert) @@ -278,7 +299,7 @@ rlm_sql_module_t rlm_sql_firebird = { "rlm_sql_firebird", NULL, sql_socket_init, - sql_destroy_socket, + NULL, sql_query, sql_select_query, sql_store_result, @@ -287,7 +308,7 @@ rlm_sql_module_t rlm_sql_firebird = { sql_fetch_row, sql_free_result, sql_error, - sql_close, + NULL, sql_finish_query, sql_finish_select_query, 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 39a9896c389..c9b9c5d72f3 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 @@ -26,26 +26,26 @@ RCSID("$Id$") #include -int fb_lasterror(rlm_sql_firebird_sock *sock) { +int fb_lasterror(rlm_sql_firebird_conn_t *conn) { char msg[512+2]; int l; ISC_LONG *pstatus; char *p = 0; - sock->sql_code = 0; + conn->sql_code = 0; - if (IS_ISC_ERROR(sock->status)) { + if (IS_ISC_ERROR(conn->status)) { /* * If error occured, free the previous error's text * and create a new one. */ - pstatus = sock->status; - if (sock->lasterror) { - free(sock->lasterror); + pstatus = conn->status; + if (conn->lasterror) { + free(conn->lasterror); } - sock->lasterror = 0; - sock->sql_code = isc_sqlcode(sock->status); + conn->lasterror = 0; + conn->sql_code = isc_sqlcode(conn->status); isc_interprete(msg,&pstatus); p = strdup(msg); @@ -60,32 +60,32 @@ int fb_lasterror(rlm_sql_firebird_sock *sock) { strcat(p, msg); } - sock->lasterror=p; + conn->lasterror=p; } else { //return empty (but not null) string if there are no error - if (sock->lasterror) { - *(sock->lasterror) = '\0'; + if (conn->lasterror) { + *(conn->lasterror) = '\0'; } else { - sock->lasterror = strdup(""); + conn->lasterror = strdup(""); } } - return sock->sql_code; + return conn->sql_code; } -void fb_set_tpb(rlm_sql_firebird_sock * sock, int count, ...) { +void fb_set_tpb(rlm_sql_firebird_conn_t *conn, int count, ...) { int i; va_list arg; va_start(arg, count); - sock->tpb = malloc(count); + conn->tpb = malloc(count); for (i = 0; i < count; i++) { - sock->tpb[i] = (char) va_arg(arg, int); + conn->tpb[i] = (char) va_arg(arg, int); } - sock->tpb_len=count; + conn->tpb_len = count; } @@ -144,7 +144,7 @@ typedef struct vary_fb { } VARY; //function fb_store_row based on fiebird's apifull example -void fb_store_row(rlm_sql_firebird_sock *sock) { +void fb_store_row(rlm_sql_firebird_conn_t *conn) { int dtype; struct tm times; ISC_QUAD bid; @@ -153,29 +153,29 @@ void fb_store_row(rlm_sql_firebird_sock *sock) { VARY * vary; /* assumed: id,username,attribute,value,op */ - if (sock->row_fcountsqlda_out->sqld) { - i=sock->row_fcount; - sock->row_fcount=sock->sqlda_out->sqld; - sock->row = (char **) realloc(sock->row, sock->row_fcount * sizeof(char *)); - sock->row_sizes = (int *) realloc(sock->row_sizes, sock->row_fcount * sizeof(int)); + if (conn->row_fcountsqlda_out->sqld) { + i=conn->row_fcount; + conn->row_fcount=conn->sqlda_out->sqld; + conn->row = (char **) realloc(conn->row, conn->row_fcount * sizeof(char *)); + conn->row_sizes = (int *) realloc(conn->row_sizes, conn->row_fcount * sizeof(int)); - while( i row_fcount) { - sock->row[i] = 0; - sock->row_sizes[i++] = 0; + while( i row_fcount) { + conn->row[i] = 0; + conn->row_sizes[i++] = 0; } } - for (i=0, var=sock->sqlda_out->sqlvar; isqlda_out->sqld; var++,i++) { + for (i=0, var=conn->sqlda_out->sqlvar; isqlda_out->sqld; var++,i++) { /* * Initial buffer size to store field's data is 256 bytes */ - if (sock->row_sizes[i]<256) { - sock->row[i]=(char *) realloc(sock->row[i],256); - sock->row_sizes[i]=256; + if (conn->row_sizes[i]<256) { + conn->row[i]=(char *) realloc(conn->row[i],256); + conn->row_sizes[i]=256; } if (IS_NULL(var)) { - strcpy(sock->row[i],"NULL"); + strcpy(conn->row[i],"NULL"); continue; } @@ -183,30 +183,30 @@ void fb_store_row(rlm_sql_firebird_sock *sock) { switch (dtype) { case SQL_TEXT: - if (sock->row_sizes[i]<=var->sqllen) { - sock->row_sizes[i] = var->sqllen + 1; - sock->row[i] = realloc(sock->row[i], - sock->row_sizes[i]); + if (conn->row_sizes[i]<=var->sqllen) { + conn->row_sizes[i] = var->sqllen + 1; + conn->row[i] = realloc(conn->row[i], + conn->row_sizes[i]); } - memmove(sock->row[i], var->sqldata, var->sqllen); - sock->row[i][var->sqllen] = 0; + memmove(conn->row[i], var->sqldata, var->sqllen); + conn->row[i][var->sqllen] = 0; break; case SQL_VARYING: vary = (VARY*) var->sqldata; - if (sock->row_sizes[i] <= vary->vary_length) { - sock->row_sizes[i] = vary->vary_length+1; - sock->row[i] = realloc(sock->row[i], - sock->row_sizes[i]); + if (conn->row_sizes[i] <= vary->vary_length) { + conn->row_sizes[i] = vary->vary_length+1; + conn->row[i] = realloc(conn->row[i], + conn->row_sizes[i]); } - memmove(sock->row[i],vary->vary_string,vary->vary_length); - sock->row[i][vary->vary_length] = 0; + memmove(conn->row[i],vary->vary_string,vary->vary_length); + conn->row[i][vary->vary_length] = 0; break; case SQL_FLOAT: - snprintf(sock->row[i], sock->row_sizes[i], "%15g", + snprintf(conn->row[i], conn->row_sizes[i], "%15g", *(float ISC_FAR *) (var->sqldata)); break; case SQL_SHORT: @@ -217,7 +217,7 @@ void fb_store_row(rlm_sql_firebird_sock *sock) { short field_width = 0; short dscale = 0; char *p; - p=sock->row[i]; + p=conn->row[i]; switch (dtype) { @@ -273,13 +273,13 @@ void fb_store_row(rlm_sql_firebird_sock *sock) { case SQL_D_FLOAT: case SQL_DOUBLE: - snprintf(sock->row[i],sock->row_sizes[i], "%24f", + snprintf(conn->row[i],conn->row_sizes[i], "%24f", *(double ISC_FAR *) (var->sqldata)); break; case SQL_TIMESTAMP: isc_decode_timestamp((ISC_TIMESTAMP ISC_FAR *)var->sqldata, ×); - snprintf(sock->row[i],sock->row_sizes[i],"%04d-%02d-%02d %02d:%02d:%02d.%04d", + snprintf(conn->row[i],conn->row_sizes[i],"%04d-%02d-%02d %02d:%02d:%02d.%04d", times.tm_year + 1900, times.tm_mon+1, times.tm_mday, @@ -291,7 +291,7 @@ void fb_store_row(rlm_sql_firebird_sock *sock) { case SQL_TYPE_DATE: isc_decode_sql_date((ISC_DATE ISC_FAR *)var->sqldata, ×); - snprintf(sock->row[i],sock->row_sizes[i], "%04d-%02d-%02d", + snprintf(conn->row[i],conn->row_sizes[i], "%04d-%02d-%02d", times.tm_year + 1900, times.tm_mon+1, times.tm_mday); @@ -299,7 +299,7 @@ void fb_store_row(rlm_sql_firebird_sock *sock) { case SQL_TYPE_TIME: isc_decode_sql_time((ISC_TIME ISC_FAR *)var->sqldata, ×); - snprintf(sock->row[i],sock->row_sizes[i], "%02d:%02d:%02d.%04d", + snprintf(conn->row[i],conn->row_sizes[i], "%02d:%02d:%02d.%04d", times.tm_hour, times.tm_min, times.tm_sec, @@ -310,61 +310,61 @@ void fb_store_row(rlm_sql_firebird_sock *sock) { case SQL_ARRAY: /* Print the blob id on blobs or arrays */ bid = *(ISC_QUAD ISC_FAR *) var->sqldata; - snprintf(sock->row[i],sock->row_sizes[i],"%08lx:%08lx", bid.gds_quad_high, bid.gds_quad_low); + snprintf(conn->row[i],conn->row_sizes[i],"%08lx:%08lx", bid.gds_quad_high, bid.gds_quad_low); break; } } } -int fb_init_socket(rlm_sql_firebird_sock *sock) { - memset(sock, 0, sizeof(*sock)); - sock->sqlda_out = (XSQLDA ISC_FAR *) calloc(XSQLDA_LENGTH (5),1); - sock->sqlda_out->sqln = 5; - sock->sqlda_out->version = SQLDA_VERSION1; - sock->sql_dialect = 3; +int fb_init_socket(rlm_sql_firebird_conn_t *conn) { + memset(conn, 0, sizeof(*conn)); + conn->sqlda_out = (XSQLDA ISC_FAR *) calloc(XSQLDA_LENGTH (5),1); + conn->sqlda_out->sqln = 5; + conn->sqlda_out->version = SQLDA_VERSION1; + conn->sql_dialect = 3; #ifdef _PTHREAD_H - pthread_mutex_init (&sock->mut, NULL); - radlog(L_DBG,"Init mutex %p\n",&sock->mut); + pthread_mutex_init (&conn->mut, NULL); + radlog(L_DBG,"Init mutex %p\n",&conn->mut); #endif /* * Set tpb to read_committed/wait/no_rec_version */ - fb_set_tpb(sock, 5, isc_tpb_version3, isc_tpb_wait, isc_tpb_write, + fb_set_tpb(conn, 5, isc_tpb_version3, isc_tpb_wait, isc_tpb_write, isc_tpb_read_committed, isc_tpb_no_rec_version); - if (!sock->tpb) { + if (!conn->tpb) { return -1; } return 0; } -int fb_connect(rlm_sql_firebird_sock * sock,rlm_sql_config_t *config) { +int fb_connect(rlm_sql_firebird_conn_t * conn,rlm_sql_config_t *config) { char *p; char *database; - sock->dpb_len = 4; + conn->dpb_len = 4; if (config->sql_login) { - sock->dpb_len+=strlen(config->sql_login) + 2; + conn->dpb_len+=strlen(config->sql_login) + 2; } if (config->sql_password) { - sock->dpb_len += strlen(config->sql_password) + 2; + conn->dpb_len += strlen(config->sql_password) + 2; } - sock->dpb = (char *) malloc(sock->dpb_len); - p = sock->dpb; + conn->dpb = (char *) malloc(conn->dpb_len); + p = conn->dpb; - *sock->dpb++ = isc_dpb_version1; - *sock->dpb++ = isc_dpb_num_buffers; - *sock->dpb++ = 1; - *sock->dpb++ = 90; + *conn->dpb++ = isc_dpb_version1; + *conn->dpb++ = isc_dpb_num_buffers; + *conn->dpb++ = 1; + *conn->dpb++ = 90; - fb_dpb_add_str(&sock->dpb, isc_dpb_user_name, config->sql_login); - fb_dpb_add_str(&sock->dpb, isc_dpb_password, config->sql_password); + fb_dpb_add_str(&conn->dpb, isc_dpb_user_name, config->sql_login); + fb_dpb_add_str(&conn->dpb, isc_dpb_password, config->sql_password); - sock->dpb = p; + conn->dpb = p; /* * Check if database and server in the form of server:database. @@ -385,124 +385,124 @@ int fb_connect(rlm_sql_firebird_sock * sock,rlm_sql_config_t *config) { database[ls]=':'; memmove(database+ls+1,config->sql_db,ld); } - isc_attach_database(sock->status, 0, database, &sock->dbh, - sock->dpb_len, sock->dpb); + isc_attach_database(conn->status, 0, database, &conn->dbh, + conn->dpb_len, conn->dpb); free(database); - return fb_lasterror(sock); + return fb_lasterror(conn); } -int fb_fetch(rlm_sql_firebird_sock *sock) { +int fb_fetch(rlm_sql_firebird_conn_t *conn) { long fetch_stat; - if (sock->statement_type!=isc_info_sql_stmt_select) { + if (conn->statement_type!=isc_info_sql_stmt_select) { return 100; } - fetch_stat = isc_dsql_fetch(sock->status, &sock->stmt, - SQL_DIALECT_V6, sock->sqlda_out); + fetch_stat = isc_dsql_fetch(conn->status, &conn->stmt, + SQL_DIALECT_V6, conn->sqlda_out); if (fetch_stat) { if (fetch_stat!=100L) { - fb_lasterror(sock); + fb_lasterror(conn); } else { - sock->sql_code=0; + conn->sql_code=0; } } return fetch_stat; } -int fb_prepare(rlm_sql_firebird_sock *sock,char *sqlstr) { +int fb_prepare(rlm_sql_firebird_conn_t *conn,char *sqlstr) { static char stmt_info[] = { isc_info_sql_stmt_type }; char info_buffer[128]; short l; - if (!sock->trh) { - isc_start_transaction(sock->status, &sock->trh, 1, &sock->dbh, - sock->tpb_len,sock->tpb); - if (!sock->trh) { + if (!conn->trh) { + isc_start_transaction(conn->status, &conn->trh, 1, &conn->dbh, + conn->tpb_len,conn->tpb); + if (!conn->trh) { return -4; } } - fb_free_statement(sock); - if (!sock->stmt) { - isc_dsql_allocate_statement(sock->status, &sock->dbh, - &sock->stmt); - if (!sock->stmt) { + fb_free_statement(conn); + if (!conn->stmt) { + isc_dsql_allocate_statement(conn->status, &conn->dbh, + &conn->stmt); + if (!conn->stmt) { return -1; } } - fb_free_sqlda(sock->sqlda_out); - isc_dsql_prepare(sock->status, &sock->trh, &sock->stmt, 0, sqlstr, - sock->sql_dialect, sock->sqlda_out); - if (IS_ISC_ERROR(sock->status)) { + fb_free_sqlda(conn->sqlda_out); + isc_dsql_prepare(conn->status, &conn->trh, &conn->stmt, 0, sqlstr, + conn->sql_dialect, conn->sqlda_out); + if (IS_ISC_ERROR(conn->status)) { return -2; } - if (sock->sqlda_out->sqlnsqlda_out->sqld) { - sock->sqlda_out->sqln=sock->sqlda_out->sqld; - sock->sqlda_out = (XSQLDA ISC_FAR *) realloc(sock->sqlda_out, - XSQLDA_LENGTH(sock->sqlda_out->sqld)); - isc_dsql_describe(sock->status, &sock->stmt, SQL_DIALECT_V6, - sock->sqlda_out); + if (conn->sqlda_out->sqlnsqlda_out->sqld) { + conn->sqlda_out->sqln=conn->sqlda_out->sqld; + conn->sqlda_out = (XSQLDA ISC_FAR *) realloc(conn->sqlda_out, + XSQLDA_LENGTH(conn->sqlda_out->sqld)); + isc_dsql_describe(conn->status, &conn->stmt, SQL_DIALECT_V6, + conn->sqlda_out); - if (IS_ISC_ERROR(sock->status)) { + if (IS_ISC_ERROR(conn->status)) { return -3; } } /* * Get statement type */ - isc_dsql_sql_info(sock->status, &sock->stmt, sizeof(stmt_info), + isc_dsql_sql_info(conn->status, &conn->stmt, sizeof(stmt_info), stmt_info,sizeof(info_buffer), info_buffer); - if (IS_ISC_ERROR(sock->status)) return -4; + if (IS_ISC_ERROR(conn->status)) return -4; l = (short) isc_vax_integer((char ISC_FAR *) info_buffer + 1, 2); - sock->statement_type = isc_vax_integer((char ISC_FAR *) info_buffer + 3, + conn->statement_type = isc_vax_integer((char ISC_FAR *) info_buffer + 3, l); - if (sock->sqlda_out->sqld) { - fb_set_sqlda(sock->sqlda_out); //set out sqlda + if (conn->sqlda_out->sqld) { + fb_set_sqlda(conn->sqlda_out); //set out sqlda } return 0; } -int fb_sql_query(rlm_sql_firebird_sock *sock,char *sqlstr) { - if (fb_prepare(sock,sqlstr)) { - return fb_lasterror(sock); +int fb_sql_query(rlm_sql_firebird_conn_t *conn,char *sqlstr) { + if (fb_prepare(conn,sqlstr)) { + return fb_lasterror(conn); } - switch (sock->statement_type) { + switch (conn->statement_type) { case isc_info_sql_stmt_exec_procedure: - isc_dsql_execute2(sock->status, &sock->trh, &sock->stmt, - SQL_DIALECT_V6, 0, sock->sqlda_out); + isc_dsql_execute2(conn->status, &conn->trh, &conn->stmt, + SQL_DIALECT_V6, 0, conn->sqlda_out); break; default: - isc_dsql_execute(sock->status, &sock->trh, &sock->stmt, + isc_dsql_execute(conn->status, &conn->trh, &conn->stmt, SQL_DIALECT_V6, 0); break; } - return fb_lasterror(sock); + return fb_lasterror(conn); } -int fb_affected_rows(rlm_sql_firebird_sock *sock) { +int fb_affected_rows(rlm_sql_firebird_conn_t *conn) { static char count_info[] = {isc_info_sql_records}; char info_buffer[128]; char *p ; int affected_rows = -1; - if (!sock->stmt) return -1; + if (!conn->stmt) return -1; - isc_dsql_sql_info(sock->status, &sock->stmt, + isc_dsql_sql_info(conn->status, &conn->stmt, sizeof (count_info), count_info, sizeof (info_buffer), info_buffer); - if (IS_ISC_ERROR(sock->status)) { - return fb_lasterror(sock); + if (IS_ISC_ERROR(conn->status)) { + return fb_lasterror(conn); } p = info_buffer + 3; @@ -520,88 +520,49 @@ int fb_affected_rows(rlm_sql_firebird_sock *sock) { return affected_rows; } -int fb_close_cursor(rlm_sql_firebird_sock *sock) { - isc_dsql_free_statement(sock->status, &sock->stmt, DSQL_close); +int fb_close_cursor(rlm_sql_firebird_conn_t *conn) { + isc_dsql_free_statement(conn->status, &conn->stmt, DSQL_close); - return fb_lasterror(sock); + return fb_lasterror(conn); } -void fb_free_statement(rlm_sql_firebird_sock *sock) { - if (sock->stmt) { - isc_dsql_free_statement(sock->status, &sock->stmt, DSQL_drop); - sock->stmt = 0; +void fb_free_statement(rlm_sql_firebird_conn_t *conn) { + if (conn->stmt) { + isc_dsql_free_statement(conn->status, &conn->stmt, DSQL_drop); + conn->stmt = 0; } } -int fb_rollback(rlm_sql_firebird_sock *sock) { - sock->sql_code = 0; - if (sock->trh) { - isc_rollback_transaction(sock->status, &sock->trh); -// sock->in_use=0; +int fb_rollback(rlm_sql_firebird_conn_t *conn) { + conn->sql_code = 0; + if (conn->trh) { + isc_rollback_transaction(conn->status, &conn->trh); +// conn->in_use=0; #ifdef _PTHREAD_H - pthread_mutex_unlock(&sock->mut); + pthread_mutex_unlock(&conn->mut); #endif - if (IS_ISC_ERROR(sock->status)) { - return fb_lasterror(sock); + if (IS_ISC_ERROR(conn->status)) { + return fb_lasterror(conn); } } - return sock->sql_code; + return conn->sql_code; } -int fb_commit(rlm_sql_firebird_sock *sock) { - sock->sql_code=0; - if (sock->trh) { - isc_commit_transaction (sock->status,&sock->trh); - if (IS_ISC_ERROR(sock->status)) { - fb_lasterror(sock); +int fb_commit(rlm_sql_firebird_conn_t *conn) { + conn->sql_code=0; + if (conn->trh) { + isc_commit_transaction (conn->status,&conn->trh); + if (IS_ISC_ERROR(conn->status)) { + fb_lasterror(conn); radlog(L_ERR, "Fail to commit. Error: %s. Try to rollback.", - sock->lasterror); - return fb_rollback(sock); + conn->lasterror); + return fb_rollback(conn); } } -// sock->in_use=0; +// conn->in_use=0; #ifdef _PTHREAD_H - pthread_mutex_unlock(&sock->mut); + pthread_mutex_unlock(&conn->mut); #endif - return sock->sql_code; -} - -int fb_disconnect(rlm_sql_firebird_sock *sock) { - if (sock->dbh) { - fb_free_statement(sock); - isc_detach_database(sock->status,&sock->dbh); - return fb_lasterror(sock); - } - return 0; -} - -void fb_destroy_socket(rlm_sql_firebird_sock *sock) { - int i; - fb_commit(sock); - - if (fb_disconnect(sock)) { - radlog(L_ERR, "Fatal. Fail to disconnect DB. Error :%s\n", - sock->lasterror); - } - -#ifdef _PTHREAD_H - pthread_mutex_destroy (&sock->mut); -#endif - for (i=0; irow_fcount;i++) { - free(sock->row[i]); - } - - free(sock->row);free(sock->row_sizes); - fb_free_sqlda(sock->sqlda_out); - - free(sock->sqlda_out); - free(sock->tpb); - free(sock->dpb); - - if (sock->lasterror) { - free(sock->lasterror); - } - - memset(sock,0,sizeof(rlm_sql_firebird_sock)); + return conn->sql_code; } 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 c7df04c9019..d2e74be633c 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 @@ -38,7 +38,7 @@ RCSIDH(sql_fbapi_h, "$Id$") #define DEADLOCK_SQL_CODE -913 #define DOWN_SQL_CODE -902 -typedef struct rlm_sql_firebird_sock { +typedef struct rlm_sql_firebird_conn { isc_db_handle dbh; isc_stmt_handle stmt; isc_tr_handle trh; @@ -60,24 +60,20 @@ typedef struct rlm_sql_firebird_sock { #ifdef _PTHREAD_H pthread_mutex_t mut; #endif +} rlm_sql_firebird_conn_t; -} rlm_sql_firebird_sock; - - -int fb_free_result(rlm_sql_firebird_sock *sock); -int fb_lasterror(rlm_sql_firebird_sock *); -int fb_init_socket(rlm_sql_firebird_sock *sock); -int fb_connect(rlm_sql_firebird_sock * sock,rlm_sql_config_t *config); -int fb_disconnect(rlm_sql_firebird_sock * sock); -int fb_sql_query(rlm_sql_firebird_sock * sock,char *sqlstr); -int fb_affected_rows(rlm_sql_firebird_sock * sock); -int fb_fetch(rlm_sql_firebird_sock * sock); -void fb_free_statement(rlm_sql_firebird_sock *sock); -int fb_close_cursor(rlm_sql_firebird_sock *sock); -int fb_rollback(rlm_sql_firebird_sock * sock); -int fb_commit(rlm_sql_firebird_sock * sock); -void fb_destroy_socket(rlm_sql_firebird_sock *); -void fb_store_row(rlm_sql_firebird_sock *sock); +int fb_free_result(rlm_sql_firebird_conn_t *conn); +int fb_lasterror(rlm_sql_firebird_conn_t *conn); +int fb_connect(rlm_sql_firebird_conn_t *conn, rlm_sql_config_t *config); +int fb_disconnect(rlm_sql_firebird_conn_t *conn); +int fb_sql_query(rlm_sql_firebird_conn_t *conn, char *sqlstr); +int fb_affected_rows(rlm_sql_firebird_conn_t *conn); +int fb_fetch(rlm_sql_firebird_conn_t *conn); +void fb_free_statement(rlm_sql_firebird_conn_t *conn); +int fb_close_cursor(rlm_sql_firebird_conn_t *conn); +int fb_rollback(rlm_sql_firebird_conn_t *conn); +int fb_commit(rlm_sql_firebird_conn_t *conn); +void fb_store_row(rlm_sql_firebird_conn_t *conn); #endif