exit(1);
}
- if(SQLAllocStmt(iodbc_sock->dbc_handle, &iodbc_sock->stmt_handle) != SQL_SUCCESS) {
- radlog(L_CONS|L_ERR, "sql_create_socket: SQLAllocStmt failed: %s",
- sql_error(sqlsocket, config));
- exit(1);
- }
+ return 0;
+}
+
+/*************************************************************************
+ *
+ * Function: sql_destroy_socket
+ *
+ * Purpose: Free socket and private connection data
+ *
+ *************************************************************************/
+int sql_destroy_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
+ /* FIXME: Someone write the odbc specific disconnect and free code!! */
+
+ free(sqlsocket);
return 0;
}
rlm_sql_iodbc_sock *iodbc_sock = sqlsocket->conn;
+ if(SQLAllocStmt(iodbc_sock->dbc_handle, &iodbc_sock->stmt_handle) != SQL_SUCCESS) {
+ radlog(L_CONS|L_ERR, "sql_create_socket: SQLAllocStmt failed: %s",
+ sql_error(sqlsocket, config));
+ exit(1);
+ }
+
if (config->sqltrace)
radlog(L_DBG, "rlm_sql: %s", querystr);
if (iodbc_sock->dbc_handle == NULL) {
return -1;
}
- if(SQLExecDirect(iodbc_sock->stmt_handle, querystr, SQL_NTS) != SQL_SUCCESS) {
- radlog(L_CONS|L_ERR, "sql_query: failed: %s",
+ if (SQLExecDirect(iodbc_sock->stmt_handle, querystr, SQL_NTS) != SQL_SUCCESS) {
+ radlog(L_CONS|L_ERR, "sql_query: failed: %s",
sql_error(sqlsocket, config));
return -1;
}
numfields = sql_num_fields(sqlsocket, config);
- row = (char **) rad_malloc(sizeof(char *) * numfields);
+ row = (char **) rad_malloc(sizeof(char *) * (numfields+1));
memset(row, 0, (sizeof(char *) * (numfields)));
- row[numfields-1] = NULL;
+ row[numfields] = NULL;
for(i=1; i<=numfields; i++) {
SQLColAttributes(iodbc_sock->stmt_handle, ((SQLUSMALLINT) i), SQL_COLUMN_LENGTH,
if((rc = SQLFetch(iodbc_sock->stmt_handle)) == SQL_NO_DATA_FOUND) {
return NULL;
}
- return iodbc->row;
+ return iodbc_sock->row;
}
* for a result set
*
*************************************************************************/
-void sql_free_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
+int sql_free_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
int i=0;
rlm_sql_iodbc_sock *iodbc_sock = sqlsocket->conn;
for(i=0; i<sql_num_fields(sqlsocket, config); i++) {
free(iodbc_sock->row[i]);
}
- free(iodbc->row);
+ free(iodbc_sock->row);
iodbc_sock->row=NULL;
+
+ SQLFreeStmt( iodbc_sock->stmt_handle, SQL_DROP );
+
+ return 0;
}
static SQLCHAR error[256] = "";
rlm_sql_iodbc_sock *iodbc_sock = sqlsocket->conn;
- SQLError(idobc_sock->env_handle, iodbc_sock->dbc_handle, iodbc_sock->stmt_handle,
+ SQLError(iodbc_sock->env_handle, iodbc_sock->dbc_handle, iodbc_sock->stmt_handle,
state, &errornum, error, 256, &length);
return error;
}
* Purpose: End the select query, such as freeing memory or result
*
*************************************************************************/
-int sql_finish_select_query(SQLSOCK *socket) {
- return 0;
+int sql_finish_select_query(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
+ return sql_free_result(sqlsocket, config);
}
#include <sqltypes.h>
#include "rlm_sql.h"
-typedef char** SQL_ROW;
-
typedef struct rlm_sql_iodbc_sock {
HENV env_handle;
HDBC dbc_handle;
struct sql_socket *next;
- viod *conn;
+ void *conn;
} rlm_sql_iodbc_sock;;
SQLSOCK *sql_create_socket(SQL_INST *inst);
-int sql_checksocket(const char *facility);
-int sql_query(SQL_INST *inst, SQLSOCK *sqlsocket, char *querystr);
-int sql_select_query(SQL_INST *inst, SQLSOCK *sqlsocket, char *querystr);
-int sql_store_result(SQLSOCK *sqlsocket);
-int sql_num_fields(SQLSOCK *sqlsocket);
-int sql_num_rows(SQLSOCK *sqlsocket);
-SQL_ROW sql_fetch_row(SQLSOCK *sqlsocket);
-void sql_free_result(SQLSOCK *sqlsocket);
-char *sql_error(SQLSOCK *sqlsocket);
-void sql_close(SQLSOCK *sqlsocket);
-void sql_finish_query(SQLSOCK *sqlsocket);
-void sql_finish_select_query(SQLSOCK *sqlsocket);
-int sql_affected_rows(SQLSOCK *sqlsocket);
+int sql_checksocket(const char *facility);
+int sql_destroy_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+int sql_query(SQLSOCK *sqlsocket, SQL_CONFIG *config, char *querystr) ;
+int sql_select_query(SQLSOCK *sqlsocket, SQL_CONFIG *config, char *querystr) ;
+int sql_store_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+int sql_num_fields(SQLSOCK *sqlsocket, SQL_CONFIG *config);
+int sql_num_rows(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+SQL_ROW sql_fetch_row(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+int sql_free_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+char* sql_error(SQLSOCK *sqlsocket, SQL_CONFIG *config);
+int sql_close(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+int sql_finish_query(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+int sql_finish_select_query(SQLSOCK *socket, SQL_CONFIG *config) ;
+int sql_affected_rows(SQLSOCK *sqlsocket, SQL_CONFIG *config) ;
+int sql_init_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config);
/*
* Unused. Now provided in rlm_sql main module.
* But left in here just in case...