群组服务器,读取实现 持续扩展ing...
【函数接口定义】
/* CLASS_BEGIN *****************************************************
类名: CImGroupDbRead
功能: IM群组服务器数据库读对象
版本: V1.0
时间: 2012-2-27 创建
实现: Snight Q:51171107
CLASS_END ******************************************************/
#ifndef H_CIMGROUPDBREADER_H
#define H_CIMGROUPDBREADER_H
#include "MysqlHelper.h"
#include <hash_map>
#include <vector>
#include "CGroupDefine.h"
class CImGroupDbRead : public CMysqlDataBase
{
public:
CImGroupDbRead(void);
~CImGroupDbRead(void);
public:
/*
读取群组基本属性集
@ ai64StartGroupId 起始群组ID
@ aiPageSize 一页读取数据数量
@ aoPropertyMap 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int GetGroupBaseProperty( SInt64& ai64StartGroupId,
SInt32 aiPageSize,
stdext::hash_map<SInt64, S_GrpBsProperty*>& aoPropertyMap);
/*
通过GID读取群组基本属性
@ ai64StartGroupId 起始群组ID
@ aiPageSize 一页读取数据数量
@ aoPropertyMap 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int GetGroupBasePropertyByGID( SInt64 ai64StartGroupId, S_GrpBsProperty& aoProperty);
/*
读取群组动态本属性
@ ai64StartGroupId 起始群组ID
@ aiPageSize 一页读取数据数量
@ aoPropertyMap 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int GetGroupDyProperty( SInt64& ai64StartGroupId,
SInt32 aiPageSize,
stdext::hash_map<SInt64, S_GrpDynamicProperty*>& aoPropertyMap);
/*
读取群组基本本属性 变化最后值
@ ai64LastId 起始ID
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int GetGroupBsPropertyChangeLast(SInt64& ai64LastId);
/*
通过GID读取群组动态属性
@ ai64StartGroupId 起始群组ID
@ aoDyProperty 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int GetGroupDyPropertyByGID(SInt64 ai64StartGroupId, S_GrpDynamicProperty& aoDyProperty);
/*
读取群组动态本属性 变化最后值
@ ai64LastId 起始ID
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int GetGroupDyPropertyChangeLast(SInt64& ai64LastId);
/*
通过ID,更新群组基本属性变化
@ ai64LastId 起始ID
@ aiPageSize 翻页大小
@ aoPropertyMap 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupBsPropertyChangeByLastID( SInt64& aiLastID,
SInt32 aiPageSize,
std::vector<S_GrpBsProperty*>& aoPropertyVct);
/*
通过ID,更新群组动态属性变化
@ ai64LastId 起始ID
@ aiPageSize 翻页大小
@ aoPropertyMap 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupDyPropertyChangeByLastID( SInt64& aiLastID,
SInt32 aiPageSize,
std::vector<S_GrpDynamicProperty*>& aoPropertyVct);
/*
检查t_group_member_x 表是否存在
@ aiUID
@ aiResult 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GroupMemberCheckExist(SInt64 aiGroupId, SInt16& ai16Result );
/*
检查t_group_member_change_x 表是否存在
@ aiUID
@ aiResult 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GroupMemberChangeCheckExist(SInt64 aiGroupId, SInt16& ai16Result );
/*
按照群ID读取成员信息
@ aiGroupId 群组ID
@ aoMembersVct 成员表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupMemberByGroupID(SInt64 aiGroupId, std::vector<S_GroupMember*>& aoMembersVct);
/*
按照群ID读取成员名片信息
@ aiGroupId 群组ID
@ aoMembersBsCardVct 成员名片表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupMemberBsCardByGroupID(SInt64 aiGroupId, std::map<SInt64,S_GroupMemberBsCard*>& aoMembersBsCardVct);
/*
群组成员信息变化最大值读取
@ ai64LastId 起始ID
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupMemberChangeLast(SInt64& ai64LastID);
/*
群组成员名片变化最大值读取
@ ai64LastId 起始ID
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupMbBscardChangeLast(SInt64& ai64LastID);
/*
通过ID,更新群组动态属性变化
@ ai64LastId 起始ID
@ ai32PageSize 翻页大小
@ aoGroupMemberVct 成员表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupMemberChangeByLastID( SInt64& ai64LastID,
SInt32 ai32PageSize,
std::vector<S_GroupMember*>& aoGroupMemberVct);
/*
通过ID,更新群组动态属性变化
@ ai64LastId 起始ID
@ ai32PageSize 翻页大小
@ aoGroupMemberBsCardVct 成员名片表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
BOOL GetGroupMbBscardChangeByLastID(SInt64& ai64LastID,
SInt32 ai32PageSize,
std::vector<S_GroupMemberBsCard*>& aoGroupMemberBsCardVct);
};
#endif//H_CIMGROUPDBREADER_H
【实现文件】
#include "SImGroupDbRead.h"
#include "CRunningLog.h"
#include "CGroupDefine.h"
CImGroupDbRead::CImGroupDbRead(void)
{
}
CImGroupDbRead::~CImGroupDbRead(void)
{
}
int CImGroupDbRead::GetGroupBaseProperty( SInt64& ai64StartGroupId, SInt32 aiPageSize,
stdext::hash_map<SInt64, S_GrpBsProperty*>& aoPropertyMap)
{
CMysqStmt* lpStmt = StmtInit();
int liRet = -1;
if (lpStmt)
{
SInt8 li8Statu = 0;
SInt64 li64CreateDateTime = 0,
li64GroupID = 0,
li64CreaterID = 0;
while (TRUE)
{
if (0 != (liRet = lpStmt->StmtPrepare( " call pr_group_base_property_get (%I64d,%d)",ai64StartGroupId, aiPageSize)))
{
lpStmt->StmtFreeResult();
ERROR_LOG("ERROR: StmtPrepare() pr_group_base_property_get_by_gid 失败:%d", liRet);
break;
}
if (0 != (liRet = lpStmt->StmtExcute()))
{
lpStmt->StmtFreeResult();
break;
}
if (!lpStmt->StmtSetCnt(4))
{
lpStmt->StmtFreeResult();
liRet= -1;
break;
}
// 列绑定
if (! lpStmt->StmtBindCol(li64GroupID) ||
! lpStmt->StmtBindCol(li64CreaterID) ||
! lpStmt->StmtBindCol(li64CreateDateTime) ||
! lpStmt->StmtBindCol(li8Statu))
{
lpStmt->StmtFreeResult();
liRet= -1;
break;
}
if (0 != (liRet = lpStmt->StmtBindResult()))
{
lpStmt->StmtFreeResult();
ERROR_LOG("ERROR: GetGroupBaseProperty StmtBindResult() false liRet = %d", liRet);
break;
}
if (0 != (liRet = lpStmt->StmtStoreResult()))
{
lpStmt->StmtFreeResult();
ERROR_LOG("ERROR: GetGroupBaseProperty StmtStoreResult() false liRet = %d", liRet);
break;
}
// 查询记录有多少条
UInt64 liCnt = lpStmt->StmtNumRows();
if (liCnt <= 0)
{
lpStmt->StmtFreeResult();
break;
}
while (0 == (liRet = lpStmt->StmtFetch()))
{
S_GrpBsProperty* lpTempProperty = new S_GrpBsProperty();
if (lpTempProperty)
{
lpTempProperty->m_li64GroupID = li64GroupID;
lpTempProperty->m_li8Statu = li8Statu;
lpTempProperty->m_li64CreaterID = li64CreaterID;
lpTempProperty->m_li64CreateDateTime = li64CreateDateTime;
ai64StartGroupId = li64GroupID;
aoPropertyMap.insert(std::make_pair(li64GroupID, lpTempProperty));
}
}
if (100 != liRet)
{
lpStmt->StmtFreeResult();
break;
}
// 这一步操作的合理性有待考究
if (0 != (liRet = lpStmt->StmtFreeResult()))
{
ERROR_LOG("ERROR: CImGroupDbRead::GetGroupBaseProperty StmtFreeResult() false liRet = %d", liRet);
break;
}
}
lpStmt->StmtUnInit();
}
if(MySql_SvrGoneAway == liRet)
{ ERROR_LOG("ERROR: CImGroupDbRead::GetGroupBaseProperty pr_group_base_property_get ret = %d; 重新连接数据库", ReConnect());}
return liRet;
}
/*
通过GID读取群组基本属性
@ ai64StartGroupId 起始群组ID
@ aoProperty 属性
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int CImGroupDbRead::GetGroupBasePropertyByGID( SInt64 ai64StartGroupId, S_GrpBsProperty& aoProperty)
{
CMysqStmt* lpStmt = StmtInit();
int liRet = -1;
if (lpStmt)
{
SInt8 li8Statu = 0;
SInt64 li64CreateDateTime = 0,
li64GroupID = 0,
li64CreaterID = 0;
while (TRUE)
{
if (0 != (liRet = lpStmt->StmtPrepare( " call pr_group_base_property_get_by_gid (%I64d)",ai64StartGroupId)))
{
lpStmt->StmtFreeResult();
ERROR_LOG("ERROR: GetGroupBasePropertyByGID pr_group_base_property_get_by_gid 失败:%d", liRet);
break;
}
if (0 != (liRet = lpStmt->StmtExcute()))
{
lpStmt->StmtFreeResult();
break;
}
if (!lpStmt->StmtSetCnt(4))
{
lpStmt->StmtFreeResult();
break;
liRet= -1;
break;
}
// 列绑定
if (! lpStmt->StmtBindCol(li64GroupID) ||
! lpStmt->StmtBindCol(li64CreaterID) ||
! lpStmt->StmtBindCol(li64CreateDateTime) ||
! lpStmt->StmtBindCol(li8Statu))
{
lpStmt->StmtFreeResult();
liRet= -1;
break;
}
if (0 != (liRet = lpStmt->StmtBindResult()))
{
lpStmt->StmtFreeResult();
ERROR_LOG("ERROR: GetGroupBasePropertyByGID StmtBindResult() false liRet = %d", liRet);
break;
}
if (0 != (liRet = lpStmt->StmtStoreResult()))
{
lpStmt->StmtFreeResult();
ERROR_LOG("ERROR: GetGroupBasePropertyByGID StmtStoreResult() false liRet = %d", liRet);
break;
}
// 查询记录有多少条
UInt64 liCnt = lpStmt->StmtNumRows();
if (liCnt <= 0)
{
lpStmt->StmtFreeResult();
liCnt = -1;
break;
}
if (0 == (liRet = lpStmt->StmtFetch()))
{
aoProperty.m_li64GroupID = li64GroupID;
aoProperty.m_li8Statu = li8Statu;
aoProperty.m_li64CreaterID = li64CreaterID;
aoProperty.m_li64CreateDateTime = li64CreateDateTime;
}
if (100 != liRet)
{
liRet = lpStmt->StmtFreeResult();
break;
}
// 这一步操作的合理性有待考究
liRet = lpStmt->StmtFreeResult();
}
lpStmt->StmtUnInit();
}
if(MySql_SvrGoneAway == liRet)
{ ERROR_LOG("ERROR: CImGroupDbRead::GetGroupBaseProperty pr_group_base_property_get ret = %d; 重新连接数据库", ReConnect());}
return liRet;
}
/*
读取群组基本属性
@ ai64StartGroupId 起始群组ID
@ aoDyProperty 属性表
return: -1 程序错误; 0 正常; 其他数据库操作错误
*/
int CImGroupDbRead::GetGroupDyPropertyByGID(SInt64 ai64StartGroupId, S_GrpDynamicProperty& aoDyProperty)
{
CMysqStmt* lpStmt = StmtInit();
int liRet = -1;
if (lpStmt)
{
char lszGName[101] = {0}; // 群组名称
char lszAnnouncement[101] = {0}; // 群公告
char lszDescription[101] = {0}; // 群描述
while (TRUE)
{
if (0 != (liRet = lpStmt->StmtPrepare( " call pr_group_dynamic_property_get_by_gid (%I64d)",ai64StartGroupId)))
{
lpStmt->StmtFreeResult();
ERROR_LOG("ERROR: GetGroupDyPropertyByGID pr_group_dynamic_property_get_by_gid 失败:%d", liRet);
break;
}
if (0 != (liRet = lpStmt->StmtExcute()))
{
lpStmt->StmtFreeResult();
break;
}
if (!lpStmt->StmtSetCnt(9))
{
liRet= -1;
lpStmt->StmtFreeResult();
break;
}
// 列绑定
if