AMPS:数据库访问模块源码解读
来源:互联网 发布:云计算的含义 编辑:程序博客网 时间:2024/06/06 20:54
AMPS做为一个中间件,也提供了访问数据库的接口,目前支持MySQL和Oracle(对我所喜爱PostgreSQL却默认不支持,看来我的爱好属于非主流哈~),下面要看的是DBEngine库,它只做一件事情,就是封装了不同数据库操作的差异,提供一个数据库统一访问接口。下节再看针对不同数据库的具体操作。
AMPS_DBEngine.h
#ifndef __HEADER_AMPS_DB_ENGINE_H#define __HEADER_AMPS_DB_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"typedef struct _BDEngineContextt_BDEngineContext;struct _BDEngineContext{void*poDBHandle;void*pvAMPSContext;//pointer to framework contexte_AMPSDBTypeoAMPSDBType;charpchHostName[AMPS_MAX_IP_STRING_LENGTH];charpchUserName[AMPS_SIZE_OF_DB_USER_NAME];char pchPassword[AMPS_SIZE_OF_DB_PWD];charpchDataBaseName[AMPS_SIZE_OF_DB_NAME];unsigned int unDBPort;charpchUnixSocket[AMPS_SIZE_OF_DB_UNIX_SOCKET];unsigned long ulClientFlag;};void* DBEngine_Init(void* r_pvAMPSContext, e_AMPSDBType r_oAMPSDBType, char* r_pchHostName, char* r_pchUserName, char* r_pchPassword, char* r_pchDataBaseName);void DBEngine_Cleanup(void* r_pvAMPSContext, void* r_pvBDEngineContext);int DBEngine_Query(void* r_pvAMPSContext, void* r_pvBDEngineContext, const char* r_pcchQueryStatement, unsigned long r_ulLengthOfQuery, t_AMPSDBEngineResult* r_poAMPSDBEngineResult);void DBEngine_FreeResults(void* r_pvAMPSContext, void* r_pvBDEngineContext, t_AMPSDBEngineResult* r_poAMPSDBEngineResult);#ifdef __cplusplus}#endif#endif //__HEADER_AMPS_DB_ENGINE_H
AMPS_DBEngine.c
#include "AMPS_DBEngine.h"#include "AMPS_MySQL.h"#include "AMPS_Oracle.h"/*****************************************************************函数名称: DBEngine_Init功能描述: 数据库访问初始化函数入参:: void* r_pvAMPSContext APMS应用上下文 e_AMPSDBType r_oAMPSDBType 数据库类型(MySQL或Oracle) char* r_pchHostName 数据库的监听IP char* r_pchUserName 数据库访问用户名 char* r_pchPassword 数据库访问密码 char* r_pchDataBaseName 数据库名称 出参: 返回值: void* 数据库访问句柄*****************************************************************/void* DBEngine_Init(void* r_pvAMPSContext, e_AMPSDBType r_oAMPSDBType, char* r_pchHostName, char* r_pchUserName, char* r_pchPassword, char* r_pchDataBaseName){t_BDEngineContext* poBDEngineContext = NULL;//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");poBDEngineContext = (t_BDEngineContext*)AMPS_InternalMalloc(sizeof(t_BDEngineContext));if(NULL == poBDEngineContext){TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for poBDEngineContext.\n"); return NULL; }poBDEngineContext->pvAMPSContext = r_pvAMPSContext;poBDEngineContext->oAMPSDBType = r_oAMPSDBType;memcpy(poBDEngineContext->pchHostName, r_pchHostName, strlen(r_pchHostName));//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Host Name is %s.\n", poBDEngineContext->pchHostName);memcpy(poBDEngineContext->pchUserName, r_pchUserName, strlen(r_pchUserName));//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "User Name is %s.\n", poBDEngineContext->pchUserName);memcpy(poBDEngineContext->pchPassword, r_pchPassword, strlen(r_pchPassword));//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Password is %s.\n", poBDEngineContext->pchPassword);memcpy(poBDEngineContext->pchDataBaseName, r_pchDataBaseName, strlen(r_pchDataBaseName));//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "DataBase Name is %s.\n", poBDEngineContext->pchDataBaseName); /*根据不同的数据库类型,进行访问前的初始化*/if(AMPS_DB_TYPE_MYSQL == poBDEngineContext->oAMPSDBType){if(AMPS_SUCCESS != MySQL_Init(r_pvAMPSContext, poBDEngineContext)){TRACE(DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "MySQL_Init failed.\n");return NULL;}}elseif(AMPS_DB_TYPE_ORACLE == poBDEngineContext->oAMPSDBType){if(AMPS_SUCCESS != Oracle_Init(r_pvAMPSContext, poBDEngineContext)){TRACE(DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Oracle_Init failed.\n");return NULL;}}else{TRACE(DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Invalid DB Type %d.\n", r_oAMPSDBType);return NULL;}//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");return poBDEngineContext;}/*****************************************************************函数名称: DBEngine_Cleanup功能描述: 数据库访问完成后的资源销毁函数入参:: void* r_pvAMPSContext APMS应用上下文 void* r_pvBDEngineContext 数据库访问句柄 出参: 返回值: void*****************************************************************/void DBEngine_Cleanup(void* r_pvAMPSContext, void* r_pvBDEngineContext){t_BDEngineContext* poBDEngineContext = r_pvBDEngineContext;//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); /*根据不同数据库类型进行数据库关闭等清理操作*/if(AMPS_DB_TYPE_MYSQL == poBDEngineContext->oAMPSDBType){MySQL_Cleanup(r_pvAMPSContext, poBDEngineContext);}elseif(AMPS_DB_TYPE_ORACLE == poBDEngineContext->oAMPSDBType){Oracle_Cleanup(r_pvAMPSContext, poBDEngineContext);}AMPS_InternalFree(r_pvBDEngineContext);//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}/*****************************************************************函数名称: DBEngine_Query功能描述: 数据库操作语句执行函数入参:: void* r_pvAMPSContext APMS应用上下文 void* r_pvBDEngineContext 数据库访问句柄 char* r_pcchQueryStatement 需要执行的SQL语句 unsigned long r_ulLengthOfQuery SQL语句长度 t_AMPSDBEngineResult* r_poBDEngineResult 查询完成后的结果集 出参: t_AMPSDBEngineResult* r_poBDEngineResult 查询完成后的结果集 返回值: int*****************************************************************/int DBEngine_Query(void* r_pvAMPSContext, void* r_pvBDEngineContext, const char* r_pcchQueryStatement, unsigned long r_ulLengthOfQuery, t_AMPSDBEngineResult* r_poBDEngineResult){t_BDEngineContext* poBDEngineContext = r_pvBDEngineContext;//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); /*按不同数据库类型进行SQL语句的执行*/if(AMPS_DB_TYPE_MYSQL == poBDEngineContext->oAMPSDBType){MySQL_Query(r_pvAMPSContext, r_pvBDEngineContext, r_pcchQueryStatement, r_ulLengthOfQuery, r_poBDEngineResult);}elseif(AMPS_DB_TYPE_ORACLE == poBDEngineContext->oAMPSDBType){Oracle_Query(r_pvAMPSContext, r_pvBDEngineContext, r_pcchQueryStatement, r_ulLengthOfQuery, r_poBDEngineResult);}//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");return AMPS_SUCCESS;}/*****************************************************************函数名称: DBEngine_FreeResults功能描述: 数据库操作语句执行完成后的资源释放函数入参:: void* r_pvAMPSContext APMS应用上下文 void* r_pvBDEngineContext 数据库访问句柄 t_AMPSDBEngineResult* r_poBDEngineResult 查询完成后的结果集 出参: 返回值: int*****************************************************************/void DBEngine_FreeResults(void* r_pvAMPSContext, void* r_pvBDEngineContext, t_AMPSDBEngineResult* r_poBDEngineResult){t_BDEngineContext* poBDEngineContext = r_pvBDEngineContext;//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); /*按不同数据库类型进行SQL语句的执行后的资源释放*/if(AMPS_DB_TYPE_MYSQL == poBDEngineContext->oAMPSDBType){MySQL_FreeResults(r_pvAMPSContext, r_pvBDEngineContext, r_poBDEngineResult);}elseif(AMPS_DB_TYPE_ORACLE == poBDEngineContext->oAMPSDBType){Oracle_FreeResults(r_pvAMPSContext, r_pvBDEngineContext, r_poBDEngineResult);}//TRACE( DBE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}
- AMPS:数据库访问模块源码解读
- AMPS:MySQL数据库操作模块源码解读
- AMPS:Oracle数据库操作模块源码解读
- AMPS:Trace模块源码解读
- AMPS:MD5模块源码解读
- AMPS:AES模块源码解读
- AMPS:日志模块源码解读
- AMPS:Cache模块源码解读
- AMPS:定时器模块源码解读
- AMPS:队列源码解读
- AMPS:堆源码解读
- AMPS:哈希表源码解读
- AMPS:内存管理模块源码解读(一)
- AMPS:内存管理模块源码解读(二)
- AMPS:字符串操作源码解读
- AMPS:单向链表源码解读
- AMPS:双向链表源码解读
- Ejabberd源码解读-ejabberd_listener模块
- iOS中异步函数的单元测试
- JavaScript 原型扩展函数 - 类似PHP [持续增加中]
- 04-VTK可视化管线(1)
- ecshop中使用JS
- Core Java (十九) 泛型程序设计(Generic parogramming)
- AMPS:数据库访问模块源码解读
- Mac OS X下读写ext2/ext3文件系统
- 设置文件setting bundle
- sql中导入*.csv格式文件
- chrome 离线下载地址
- poj 3122 la3635 pie
- 查找 EXC_BAD_ACCESS 问题根源的方法
- ecshop功能二次开发之后台管理增加成本价和毛利
- 精通UIPasteboard 粘贴板