本节看看在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
#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;
}