AMPS:MySQL数据库操作模块源码解读
来源:互联网 发布:网络层主要协议 编辑:程序博客网 时间:2024/06/07 06:36
本节看看在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 __cplusplusextern "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;}
- AMPS:MySQL数据库操作模块源码解读
- AMPS:Oracle数据库操作模块源码解读
- AMPS:数据库访问模块源码解读
- AMPS:Trace模块源码解读
- AMPS:MD5模块源码解读
- AMPS:AES模块源码解读
- AMPS:日志模块源码解读
- AMPS:Cache模块源码解读
- AMPS:定时器模块源码解读
- AMPS:字符串操作源码解读
- AMPS:队列源码解读
- AMPS:堆源码解读
- AMPS:哈希表源码解读
- AMPS:内存管理模块源码解读(一)
- AMPS:内存管理模块源码解读(二)
- AMPS:单向链表源码解读
- AMPS:双向链表源码解读
- peewee模块操作mysql数据库
- iOS设计UI工具大全
- 第二章 BIRT设计器概述及本地化支持(续)
- js复习:字符串反转
- 第三章 BIRT数据源的配置
- js复习:数组排除重复
- AMPS:MySQL数据库操作模块源码解读
- win8设置无线临时网络(虚拟wifi)
- 完成机制
- UVa10034
- Java周边小知识--2,My97时间控件
- CString与char *互转总结
- 实用Linux命令(4)权限设置
- 杭电ACM题目分类
- GeekOS中的进程睡眠