AMPS:MySQL数据库操作模块源码解读

  本节看看在AMPS中对MySQL数据库的访问操作,它使用MySQL提供的C API接口进行访问,具体各API的使用可参考http://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html

 下面看看AMPS中的实现:

  AMPS_MySQL.h

#ifndef __HEADER_AMPS_MYSQL_ENGINE_H
#define __HEADER_AMPS_MYSQL_ENGINE_H

#ifdef __cplusplus
extern "C" {
#endif

#include "AMPS_Defines.h"
#include "AMPS_LinkList.h"
#include "AMPS_MemMgt.h"
#include "AMPS_EventSystem.h"
#include "AMPS_Core.h"
#include "AMPS_API.h"

int MySQL_Init(void* r_pvAMPSContext, void* r_pvBDEngineContext);
void MySQL_Cleanup(void* r_pvAMPSContext, void* r_pvBDEngineContext);
int MySQL_Query(void* r_pvAMPSContext, void* r_pvBDEngineContext, const char* r_pcchQueryStatement, unsigned long r_ulLengthOfQuery, t_AMPSDBEngineResult* r_poAMPSDBEngineResult);
int MySQL_GetNumberOfRecords(void* r_pvAMPSContext, void* r_pvBDEngineContext, unsigned long* r_pulNumberOfResults);
int MySQL_GetResults(void* r_pvAMPSContext, void* r_pvBDEngineContext, t_AMPSDBEngineResult* r_poAMPSDBEngineResult);
void MySQL_FreeResults(void* r_pvAMPSContext, void* r_pvBDEngineContext, t_AMPSDBEngineResult* r_poAMPSDBEngineResult);

void* MySQL_StatementInit(void* r_pvAMPSContext, void* r_pvBDEngineContext);
int   MySQL_StatementPrepare(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement, const char* r_puchQuery, int r_nQueryLength);
int MySQL_StatementParamCount(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement);
void* MySQL_CreateBindParameters(void* r_pvAMPSContext, void* r_pvDBEngineContext, int r_nNumberOfBindings);
void  MySQL_SetBindingParameter(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvCDRStatementParams, int r_nBindRecord, int r_nBufferType, 
								  char* r_pchBuffer, int r_nBufferLength, unsigned long* r_nLength);
int MySQL_BindParameters(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement, void* r_pvBind);
int MySQL_Execute(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement);

int MySQL_StatementClose(void* r_pvAMPSContext, void* r_pvStatement);


#ifdef __cplusplus
}
#endif

#endif //__HEADER_AMPS_MYSQL_ENGINE_H


AMPS_MySQL.c

#include "AMPS_DBEngine.h"
#include "AMPS_MySQL.h"
#include "Mysql.h"

/*****************************************************************
函数名称: MySQL_Init
功能描述: MySQL数据库初始化函数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
出参:
      
返回值:
      int

*****************************************************************/
int MySQL_Init(void* r_pvAMPSContext, void* r_pvBDEngineContext)
{
	t_BDEngineContext* poBDEngineContext = r_pvBDEngineContext;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
	
	poBDEngineContext->unDBPort = 0;
	poBDEngineContext->ulClientFlag = CLIENT_MULTI_RESULTS;

    /*初始化*/
	poBDEngineContext->poDBHandle = mysql_init(poBDEngineContext->poDBHandle);
 	if(NULL == poBDEngineContext->poDBHandle)
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_init failed.\n");
		AMPS_InternalFree(poBDEngineContext);
    	return AMPS_ERROR_FAILURE;
	}

    /*连接*/
 	if(NULL == mysql_real_connect((MYSQL*)(poBDEngineContext->poDBHandle), poBDEngineContext->pchHostName, poBDEngineContext->pchUserName, poBDEngineContext->pchPassword, 
		poBDEngineContext->pchDataBaseName, poBDEngineContext->unDBPort, poBDEngineContext->pchUnixSocket, poBDEngineContext->ulClientFlag))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_real_connect failed: Error: %s\n", mysql_error((MYSQL*)(poBDEngineContext->poDBHandle)));
		mysql_close((MYSQL*)(poBDEngineContext->poDBHandle));
		AMPS_InternalFree(poBDEngineContext);
    	return AMPS_ERROR_FAILURE;
	}

    /*设置数据库*/
 	if(0 != mysql_select_db((MYSQL*)(poBDEngineContext->poDBHandle), poBDEngineContext->pchDataBaseName))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_select_db failed: Error: %s\n", mysql_error((MYSQL*)(poBDEngineContext->poDBHandle)));
		mysql_close((MYSQL*)(poBDEngineContext->poDBHandle));
		AMPS_InternalFree(poBDEngineContext);
    	return AMPS_ERROR_FAILURE;
	}

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}

/*****************************************************************
函数名称: MySQL_Cleanup
功能描述: MySQL数据库销毁函数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
出参:
      
返回值:
      int

*****************************************************************/
void MySQL_Cleanup(void* r_pvAMPSContext, void* r_pvBDEngineContext)
{
	t_BDEngineContext* poBDEngineContext = (t_BDEngineContext*)r_pvBDEngineContext;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
    /*关闭数据库*/
	mysql_close((MYSQL*)(poBDEngineContext->poDBHandle));

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
}

/*****************************************************************
函数名称: MySQL_Query
功能描述: MySQL数据库销毁函数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      const char* r_pcchQueryStatement SQL查询语句
      unsigned long r_ulLengthOfQuery  SQL查询语句长度
      t_AMPSDBEngineResult* r_poBDEngineResult 查询结果
出参:
      
返回值:
      int

*****************************************************************/
int MySQL_Query(void* r_pvAMPSContext, void* r_pvBDEngineContext, const char* r_pcchQueryStatement, unsigned long r_ulLengthOfQuery, t_AMPSDBEngineResult* r_poBDEngineResult)
{
	t_BDEngineContext* poBDEngineContext = (t_BDEngineContext*)r_pvBDEngineContext;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "poBDEngineContext->poDBHandle = %p, r_pcchQueryStatement = %s, r_ulLengthOfQuery = %d.\n",poBDEngineContext->poDBHandle, r_pcchQueryStatement, r_ulLengthOfQuery);
    /*执行查询语句*/
    if(0 != mysql_real_query((MYSQL*)(poBDEngineContext->poDBHandle), r_pcchQueryStatement, r_ulLengthOfQuery))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_real_query failed: Error: %s\n", mysql_error((MYSQL*)(poBDEngineContext->poDBHandle)));
		r_poBDEngineResult->ulNumberOfResults = 0;
		r_poBDEngineResult->ulNumberOfRows = 0;
    	return AMPS_ERROR_FAILURE;
	}
/*
	if(AMPS_SUCCESS != MySQL_GetNumberOfRecords(r_pvAMPSContext, r_pvBDEngineContext, &r_poBDEngineResult->ulNumberOfResults))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "MySQL_GetNumberOfRecords failed.\n");
		r_poBDEngineResult->ulNumberOfResults = 0;
		r_poBDEngineResult->ulNumberOfRows = 0;
		return AMPS_ERROR_FAILURE;
	}
*/
    /*获取查询结果*/
	if(AMPS_SUCCESS != MySQL_GetResults(r_pvAMPSContext, r_pvBDEngineContext, r_poBDEngineResult))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "MySQL_GetResults failed.\n");
		r_poBDEngineResult->ulNumberOfResults = 0;
		r_poBDEngineResult->ulNumberOfRows = 0;
		return AMPS_ERROR_FAILURE;
	}

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}

/*****************************************************************
函数名称: MySQL_GetNumberOfRecords
功能描述: 获取记录条数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      unsigned long* r_pulNumberOfResults 记录条数

出参:
      
返回值:
      int

*****************************************************************/
int MySQL_GetNumberOfRecords(void* r_pvAMPSContext, void* r_pvBDEngineContext, unsigned long* r_pulNumberOfResults)
{
	t_BDEngineContext* poBDEngineContext = (t_BDEngineContext*)r_pvBDEngineContext;
	MYSQL_RES* pvResultObj = NULL;
	unsigned long ulNumberOfRows = 0;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

    /*取结果集*/
	pvResultObj = mysql_store_result((MYSQL*)(poBDEngineContext->poDBHandle));
 	if(NULL == pvResultObj)
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_store_result failed: Error: %s\n", mysql_error((MYSQL*)(poBDEngineContext->poDBHandle)));
    	return AMPS_ERROR_FAILURE;
	}

    /*获取行数*/
	ulNumberOfRows = (unsigned long)mysql_num_rows(pvResultObj);
	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "No of Rows %lu.\n", ulNumberOfRows);

	*r_pulNumberOfResults = ulNumberOfRows;
	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}

/*****************************************************************
函数名称: MySQL_GetResults
功能描述: 获取查询结果
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      t_AMPSDBEngineResult* r_poBDEngineResult 查询结果
出参:
      
返回值:
      int

*****************************************************************/
int MySQL_GetResults(void* r_pvAMPSContext, void* r_pvBDEngineContext, t_AMPSDBEngineResult* r_poBDEngineResult)
{
	t_BDEngineContext* poBDEngineContext = (t_BDEngineContext*)r_pvBDEngineContext;
	unsigned long* pulLengthOfField = NULL;
  	unsigned long ulRowCounter = 0;
  	unsigned long ulColumnCounter = 0;

	MYSQL_ROW oMYSQLRow;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

    /*获取查询结果*/
	r_poBDEngineResult->pvResultObj = mysql_store_result((MYSQL*)(poBDEngineContext->poDBHandle));
 	if(NULL == r_poBDEngineResult->pvResultObj)
	{
		if(0 == mysql_field_count((MYSQL*)(poBDEngineContext->poDBHandle)))
		{
			return AMPS_SUCCESS;
		}
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_store_result failed: Error: %s\n", mysql_error((MYSQL*)(poBDEngineContext->poDBHandle)));
    	return AMPS_ERROR_FAILURE;
	}

    /*返回结果集中的行数*/
	r_poBDEngineResult->ulNumberOfRows = (unsigned long)mysql_num_rows((MYSQL_RES*)(r_poBDEngineResult->pvResultObj));
	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "No of Rows %lu.\n", r_poBDEngineResult->ulNumberOfRows);
	r_poBDEngineResult->ulNumberOfResults = r_poBDEngineResult->ulNumberOfRows;

    /*返回结果集中的列数*/
	r_poBDEngineResult->ulNumberOfColumns = mysql_field_count((MYSQL*)(poBDEngineContext->poDBHandle));
	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "No of Columns %lu, No of Rows %lu.\n", r_poBDEngineResult->ulNumberOfColumns, r_poBDEngineResult->ulNumberOfResults);

    /*逐行,再逐列获取结果*/
	if (0 < r_poBDEngineResult->ulNumberOfRows) 
	{
        /*这块内存在查询结果销毁时释放*/
		r_poBDEngineResult->ppoAMPSDBEngineTable = (t_AMPSDBEngineTable**)AMPS_InternalMalloc(sizeof(t_AMPSDBEngineTable*) * r_poBDEngineResult->ulNumberOfRows);
		if(NULL == r_poBDEngineResult->ppoAMPSDBEngineTable)
		{
			//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for r_poBDEngineResult->ppoAMPSDBEngineTable.\n");
			mysql_free_result(r_poBDEngineResult->pvResultObj);
			return AMPS_ERROR_FAILURE;
		}

		//printf("\n\n r_poBDEngineResult->ulNumberOfRows is %ld  r_poBDEngineResult->ulNumberOfColumns %ld and r_poBDEngineResult->ppoAMPSDBEngineTable %p\n\n",r_poBDEngineResult->ulNumberOfRows, r_poBDEngineResult->ulNumberOfColumns, r_poBDEngineResult->ppoAMPSDBEngineTable);

		for(ulRowCounter = 0; ulRowCounter < r_poBDEngineResult->ulNumberOfRows; ulRowCounter++)
		{
			oMYSQLRow = mysql_fetch_row((MYSQL_RES*)(r_poBDEngineResult->pvResultObj));
			pulLengthOfField = mysql_fetch_lengths((MYSQL_RES*)(r_poBDEngineResult->pvResultObj));
	
	
			r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter] = (t_AMPSDBEngineTable*)AMPS_InternalMalloc(sizeof(t_AMPSDBEngineTable) * r_poBDEngineResult->ulNumberOfColumns);
			if(NULL == r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter])
			{
				//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter].\n");
				mysql_free_result(r_poBDEngineResult->pvResultObj);
					return AMPS_ERROR_FAILURE;
			}
			//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Pointer = %p.\n",  r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter]);
	
			for(ulColumnCounter = 0; ulColumnCounter < r_poBDEngineResult->ulNumberOfColumns; ulColumnCounter++)
			{
				TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Column %u is %lu bytes in length and value %s.\n", (ulColumnCounter + 1), pulLengthOfField[ulColumnCounter], oMYSQLRow[ulColumnCounter]);
	
				r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter][ulColumnCounter].nLengthOfField = pulLengthOfField[ulColumnCounter];
				TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Field Length = %d.\n", r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter][ulColumnCounter].nLengthOfField);
	
				r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter][ulColumnCounter].pchField = oMYSQLRow[ulColumnCounter];
				TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Filed Value = %s.\n", r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter][ulColumnCounter].pchField);
			}
		}

	}

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}

/*****************************************************************
函数名称: MySQL_FreeResults
功能描述: 释放结果集占用的资源
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      t_AMPSDBEngineResult* r_poBDEngineResult 查询结果
出参:
      
返回值:
      int

*****************************************************************/
void MySQL_FreeResults(void* r_pvAMPSContext, void* r_pvBDEngineContext, t_AMPSDBEngineResult* r_poBDEngineResult)
{
	//t_BDEngineContext* poBDEngineContext = (t_BDEngineContext*)r_pvBDEngineContext;
  	unsigned long ulRowCounter = 0;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "No of Rows %lu.\n", r_poBDEngineResult->ulNumberOfRows);

	if (0 < r_poBDEngineResult->ulNumberOfRows) 
	{
		for(ulRowCounter = 0; ulRowCounter < r_poBDEngineResult->ulNumberOfRows; ulRowCounter++)
		{
			//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Free Counter %lu.\n", ulRowCounter);
			//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Pointer = %p.\n",  r_poBDEngineResult)->ppoAMPSDBEngineTable[ulRowCounter]);
			AMPS_InternalFree(r_poBDEngineResult->ppoAMPSDBEngineTable[ulRowCounter]);
		}
	
		r_poBDEngineResult->ulNumberOfColumns = 0;
		r_poBDEngineResult->ulNumberOfRows = 0;
		r_poBDEngineResult->ulNumberOfResults = 0;
	
		AMPS_InternalFree(r_poBDEngineResult->ppoAMPSDBEngineTable );
	}

    /*释放结果内存*/
	mysql_free_result(r_poBDEngineResult->pvResultObj);

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
}

/*****************************************************************
函数名称: MySQL_StatementInit
功能描述: 创建一个MYSQL_STMT句柄
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
void* MySQL_StatementInit(void* r_pvAMPSContext, void* r_pvBDEngineContext)
{
	t_BDEngineContext* poBDEngineContext = (t_BDEngineContext*)r_pvBDEngineContext;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return mysql_stmt_init((MYSQL*)(poBDEngineContext->poDBHandle));
}

/*****************************************************************
函数名称: MySQL_StatementInit
功能描述: 通过STMT方式执行SQL前的语句分析
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      void* r_pvStatement  STMT句柄
      const char* r_puchQuery SQL语句
      int r_nQueryLength  SQL长度
出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
int MySQL_StatementPrepare(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement, const char* r_puchQuery, int r_nQueryLength)
{
	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	if (mysql_stmt_prepare((MYSQL_STMT*)r_pvStatement, r_puchQuery, r_nQueryLength))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_stmt_prepare(), INSERT failed %s\n", mysql_stmt_error((MYSQL_STMT*)r_pvStatement));
		return AMPS_ERROR_FAILURE;
	}

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}

/*****************************************************************
函数名称: MySQL_StatementParamCount
功能描述: 通过STMT方式执行SQL时所带参数个数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      void* r_pvStatement  STMT句柄
出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
int MySQL_StatementParamCount(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement)
{
	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return mysql_stmt_param_count((MYSQL_STMT*)r_pvStatement);
}

/*****************************************************************
函数名称: MySQL_CreateBindParameters
功能描述: 绑定参数前分配内存
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      int r_nNumberOfBindings 参数个数
出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
void* MySQL_CreateBindParameters(void* r_pvAMPSContext, void* r_pvDBEngineContext, int r_nNumberOfBindings)
{
	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");

	return AMPS_InternalMalloc(sizeof(MYSQL_BIND) * r_nNumberOfBindings);
}

/*****************************************************************
函数名称: MySQL_SetBindingParameter
功能描述: 设置绑定参数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      int r_nBindRecord  参数记录索引
      int r_nBufferType 参数类型,如MYSQL_TYPE_STRING、MYSQL_TYPE_TINY等
	  char* r_pchBuffer 字段名称
	  int r_nBufferLength 字段长度
	  unsigned long* r_nLength 结果长度
出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
void  MySQL_SetBindingParameter(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvCDRStatementParams, int r_nBindRecord, int r_nBufferType, 
								  char* r_pchBuffer, int r_nBufferLength, unsigned long* r_nLength)
{
	MYSQL_BIND* poMySqlBind = (MYSQL_BIND*)r_pvCDRStatementParams;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	poMySqlBind[r_nBindRecord].buffer_type = r_nBufferType;
	poMySqlBind[r_nBindRecord].buffer = r_pchBuffer;
	poMySqlBind[r_nBindRecord].buffer_length= r_nBufferLength;
	poMySqlBind[r_nBindRecord].is_null= 0;
	poMySqlBind[r_nBindRecord].length= r_nLength;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
}

/*****************************************************************
函数名称: MySQL_BindParameters
功能描述: 绑定参数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      void* r_pvStatement  STMS句柄
      void* r_pvBind       绑定参数内容

出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
int MySQL_BindParameters(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement, void* r_pvBind)
{

	MYSQL_BIND* poMySqlBind = (MYSQL_BIND*)r_pvBind;
	MYSQL_STMT* poMySqlStmt = (MYSQL_STMT*)r_pvStatement;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

	if (mysql_stmt_bind_param(poMySqlStmt, poMySqlBind))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_stmt_bind_param(), INSERT failed %s\n", mysql_stmt_error((MYSQL_STMT*)r_pvStatement));
		return AMPS_ERROR_FAILURE;
	}

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}

/*****************************************************************
函数名称: MySQL_Execute
功能描述: 绑定参数
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvBDEngineContext 数据库应用上下文
      void* r_pvStatement  STMS句柄

出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
int MySQL_Execute(void* r_pvAMPSContext, void* r_pvDBEngineContext, void* r_pvStatement)
{
	MYSQL_STMT* poMySqlStmt = (MYSQL_STMT*)r_pvStatement;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");

    /*执行域处理查询语句*/
	if (mysql_stmt_execute(poMySqlStmt))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "mysql_stmt_execute(), INSERT failed %s\n", mysql_stmt_error((MYSQL_STMT*)r_pvStatement));
		return AMPS_ERROR_FAILURE;
	}

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}

/*****************************************************************
函数名称: MySQL_StatementClose
功能描述: STMS句柄释放
入参::
      void* r_pvAMPSContext APMS应用上下文
      void* r_pvStatement  STMS句柄

出参:
      
返回值:
      MYSQL_STMT*类型的句柄

*****************************************************************/
int MySQL_StatementClose(void* r_pvAMPSContext, void* r_pvStatement)
{
	MYSQL_STMT* poMySqlStmt = (MYSQL_STMT*)r_pvStatement;

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
    
	if (mysql_stmt_close(poMySqlStmt))
	{
		//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, " failed while closing the statement %s\n", mysql_stmt_error(poMySqlStmt));
        return AMPS_ERROR_FAILURE;
	}

	//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
	return AMPS_SUCCESS;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值