⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sql_oracle.c

📁 RADIUS认证协议
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (x == OCI_NO_DATA) {		/* Nothing to fetch */		return 0;	}	else if (x != OCI_SUCCESS) {		radlog(L_ERR,"rlm_sql_oracle: query failed in sql_select_query: %s",sql_error(sqlsocket, config));		return SQL_DOWN;	}	/*	 * Define where the output from fetch calls will go	 *	 * This is a gross hack, but it works - we convert	 * all data to strings for ease of use.  Fortunately, most	 * of the data we deal with is already in string format.	 */	colcount = sql_num_fields(sqlsocket, config);	/* DEBUG2("sql_select_query(): colcount=%d",colcount); */	/*	 *	FIXME: These malloc's can probably go, as the schema	 *	is fixed...	 */	rowdata=(char **)rad_malloc(sizeof(char *) * (colcount+1) );	memset(rowdata, 0, (sizeof(char *) * (colcount+1) ));	indicators = (sb2 *) rad_malloc(sizeof(sb2) * (colcount+1) );	memset(indicators, 0, sizeof(sb2) * (colcount+1));	for (y=1; y <= colcount; y++) {		x=OCIParamGet(oracle_sock->queryHandle, OCI_HTYPE_STMT,				oracle_sock->errHandle,				(dvoid **)&param,				(ub4) y);		if (x != OCI_SUCCESS) {			radlog(L_ERR,"rlm_sql_oracle: OCIParamGet() failed in sql_select_query: %s",				sql_error(sqlsocket, config));			return -1;		}		x=OCIAttrGet((dvoid*)param, OCI_DTYPE_PARAM,			   (dvoid*)&dtype, (ub4*)0, OCI_ATTR_DATA_TYPE,			   oracle_sock->errHandle);		if (x != OCI_SUCCESS) {			radlog(L_ERR,"rlm_sql_oracle: OCIAttrGet() failed in sql_select_query: %s",				sql_error(sqlsocket, config));			return -1;		}		dsize=MAX_DATASTR_LEN;		/*		 * Use the retrieved length of dname to allocate an output		 * buffer, and then define the output variable (but only		 * for char/string type columns).		 */		switch(dtype) {#ifdef SQLT_AFC		case SQLT_AFC:	/* ansii fixed char */#endif#ifdef SQLT_AFV		case SQLT_AFV:	/* ansii var char */#endif		case SQLT_VCS:	/* var char */		case SQLT_CHR:	/* char */		case SQLT_STR:	/* string */			x=OCIAttrGet((dvoid*)param, (ub4) OCI_DTYPE_PARAM,				   (dvoid*) &dsize, (ub4 *)0, (ub4) OCI_ATTR_DATA_SIZE,				   oracle_sock->errHandle);			if (x != OCI_SUCCESS) {				radlog(L_ERR,"rlm_sql_oracle: OCIAttrGet() failed in sql_select_query: %s",					sql_error(sqlsocket, config));				return -1;			}			rowdata[y-1]=rad_malloc(dsize+1);			break;		case SQLT_DAT:		case SQLT_INT:		case SQLT_UIN:		case SQLT_FLT:		case SQLT_PDN:		case SQLT_BIN:		case SQLT_NUM:			rowdata[y-1]=rad_malloc(dsize+1);			break;		default:			dsize=0;			rowdata[y-1]=NULL;			break;		}		indicators[y-1] = 0;		x=OCIDefineByPos(oracle_sock->queryHandle,				&define,				oracle_sock->errHandle,				y,				(ub1 *) rowdata[y-1],				dsize+1,				SQLT_STR,				&indicators[y-1],				(dvoid *) 0,				(dvoid *) 0,				OCI_DEFAULT);		/*		 *	FIXME: memory leaks of indicators & rowdata?		 */		if (x != OCI_SUCCESS) {			radlog(L_ERR,"rlm_sql_oracle: OCIDefineByPos() failed in sql_select_query: %s",				sql_error(sqlsocket, config));			return -1;		}	}	oracle_sock->results=rowdata;	oracle_sock->indicators=indicators;	return 0;}/************************************************************************* * *	Function: sql_store_result * *	Purpose: database specific store_result function. Returns a result *               set for the query. * *************************************************************************/static int sql_store_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) {	/* Not needed for Oracle */	return 0;}/************************************************************************* * *	Function: sql_num_rows * *	Purpose: database specific num_rows. Returns number of rows in *               query * *************************************************************************/static int sql_num_rows(SQLSOCK *sqlsocket, SQL_CONFIG *config) {	ub4	rows=0;	rlm_sql_oracle_sock *oracle_sock = sqlsocket->conn;	OCIAttrGet((CONST dvoid *)oracle_sock->queryHandle,			OCI_HTYPE_STMT,			(dvoid *)&rows,			(ub4 *) sizeof(ub4),			OCI_ATTR_ROW_COUNT,			oracle_sock->errHandle);	return rows;}/************************************************************************* * *	Function: sql_fetch_row * *	Purpose: database specific fetch_row. Returns a SQL_ROW struct *               with all the data for the query in 'sqlsocket->row'. Returns *		 0 on success, -1 on failure, SQL_DOWN if database is down. * *************************************************************************/static int sql_fetch_row(SQLSOCK *sqlsocket, SQL_CONFIG *config) {	int	x;	rlm_sql_oracle_sock *oracle_sock = sqlsocket->conn;	if (oracle_sock->conn == NULL) {		radlog(L_ERR, "rlm_sql_oracle: Socket not connected");		return SQL_DOWN;	}	sqlsocket->row = NULL;	x=OCIStmtFetch(oracle_sock->queryHandle,			oracle_sock->errHandle,			1,			OCI_FETCH_NEXT,			OCI_DEFAULT);	if (x == OCI_NO_DATA) {		return -1;	}	else if (x != OCI_SUCCESS) {		/* XXX Check if x suggests we should return SQL_DOWN */		radlog(L_ERR,"rlm_sql_oracle: fetch failed in sql_fetch_row: %s",				sql_error(sqlsocket, config));		return SQL_DOWN;	}	sqlsocket->row = oracle_sock->results;	return 0;}/************************************************************************* * *	Function: sql_free_result * *	Purpose: database specific free_result. Frees memory allocated *               for a result set * *************************************************************************/static int sql_free_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) {	int x;	int num_fields;	rlm_sql_oracle_sock *oracle_sock = sqlsocket->conn;	/* Cancel the cursor first */	x=OCIStmtFetch(oracle_sock->queryHandle,			oracle_sock->errHandle,			0,			OCI_FETCH_NEXT,			OCI_DEFAULT);	num_fields = sql_num_fields(sqlsocket, config);	if (num_fields >= 0) {		for(x=0; x < num_fields; x++) {			free(oracle_sock->results[x]);		}		free(oracle_sock->results);		free(oracle_sock->indicators);	}	oracle_sock->results=NULL;	return 0;}/************************************************************************* * *	Function: sql_finish_query * *	Purpose: End the query, such as freeing memory * *************************************************************************/static int sql_finish_query(SQLSOCK *sqlsocket, SQL_CONFIG *config){	return 0;}/************************************************************************* * *	Function: sql_finish_select_query * *	Purpose: End the select query, such as freeing memory or result * *************************************************************************/static int sql_finish_select_query(SQLSOCK *sqlsocket, SQL_CONFIG *config) {	int 	x=0;	rlm_sql_oracle_sock *oracle_sock = sqlsocket->conn;	if (oracle_sock->results) {		while(oracle_sock->results[x]) free(oracle_sock->results[x++]);		free(oracle_sock->results);		free(oracle_sock->indicators);		oracle_sock->results=NULL;	}	return 0;}/************************************************************************* * *	Function: sql_affected_rows * *	Purpose: Return the number of rows affected by the query (update, *               or insert) * *************************************************************************/static int sql_affected_rows(SQLSOCK *sqlsocket, SQL_CONFIG *config) {	return sql_num_rows(sqlsocket, config);}/* Exported to rlm_sql */rlm_sql_module_t rlm_sql_oracle = {	"rlm_sql_oracle",	sql_init_socket,	sql_destroy_socket,	sql_query,	sql_select_query,	sql_store_result,	sql_num_fields,	sql_num_rows,	sql_fetch_row,	sql_free_result,	sql_error,	sql_close,	sql_finish_query,	sql_finish_select_query,	sql_affected_rows};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -