// 初始化属性配置 void CDBFactionMember::InitProperty() { CDataEntityManager* pdeManager = NULL; std::map<string, CDataEntityManager*>::iterator itr = GetGame()->GetDBEntityManager()->GetObjAttrDef().find(string("faction_member")); if(itr != GetGame()->GetDBEntityManager()->GetObjAttrDef().end()) pdeManager = itr->second; if(pdeManager) { CDataEntityManager::EntityPropertyMapItr attrItr = pdeManager->GetEntityPropertyMap().begin(); for(; attrItr != pdeManager->GetEntityPropertyMap().end(); attrItr++) { CEntityProperty* ep = m_DataEntityManager.CreateEntityProperty(attrItr->first, attrItr->second->GetDBTableName(), attrItr->second->GetDataType()); if(ep) { ep->SetDbFlag(attrItr->second->GetDbFlag()); if(ep->GetDataType() == DATA_OBJECT_TIME) { long timeBuf[6] = {0}; timeBuf[0] = 1990; timeBuf[1] = 1; timeBuf[2] = 1; ep->SetBufAttr(0, (void*)&timeBuf[0], sizeof(DWORD)*6); } } } } }
// 清除子背包对象 //void CDBPlayer::ClearSubpackObjMap(long subPos) //{ //map<long, set<CGUID>>::iterator placeItr = p_GoodsGroup->GetDirtyGoodsMap().find((long)PEI_PACK); //if(placeItr != p_GoodsGroup->GetDirtyGoodsMap().end()) //{ // set<CGUID>::iterator goodsItr = placeItr->second.begin(); // while( goodsItr != placeItr->second.end() ) // { // CDBGoods* packGoods = p_GoodsGroup->FindGoods(*goodsItr); // if(packGoods) // { // long pos = packGoods->GetLongAttr(string("position"), 0); // if(pos == PEI_PACK1+subPos) // { // if(!p_GoodsGroup->DelGoods(*goodsItr, (long)PEI_PACK)) // { // char szPlayerID[128]; // char szGoodsID[128]; // GetExID().tostring(szPlayerID); // (*goodsItr).tostring(szGoodsID); // AddLogText("CDBPlayer::ClearSubpackObjMap del goods Err!Player[%s], goods[%s], pos[%d]!", szPlayerID, szGoodsID, pos); // } // placeItr->second.erase((*goodsItr)); // break; // } // } // goodsItr++; // } // if(placeItr->second.size() == 0) // 已清空 // { // p_GoodsGroup->GetDirtyGoodsMap().erase(placeItr); // } //} //} // 初始化属性配置 void CDBPlayer::InitProperty() { CDataEntityManager* pdeManager = NULL; std::map<string, CDataEntityManager*>::iterator itr = GetGame()->GetDBEntityManager()->GetObjAttrDef().find(string("player")); if(itr != GetGame()->GetDBEntityManager()->GetObjAttrDef().end()) pdeManager = itr->second; if(pdeManager) { CDataEntityManager::EntityPropertyMapItr attrItr = pdeManager->GetEntityPropertyMap().begin(); for(; attrItr != pdeManager->GetEntityPropertyMap().end(); attrItr++) { CEntityProperty* pe = m_DataEntityManager.CreateEntityProperty(attrItr->first, attrItr->second->GetDBTableName(), attrItr->second->GetDataType()); if(pe) { if(pe->GetDataType() == DATA_OBJECT_TIME) { long timeBuf[6] = {0}; timeBuf[0] = 1990; timeBuf[1] = 1; timeBuf[2] = 1; pe->SetBufAttr(0, (void*)&timeBuf[0], sizeof(DWORD)*6); } } } } else { AddLogText("CDBPlayer::InitProperty() Err,未找到相关配置信息!"); } }
void CDBPlayer::Load(long msgid, BYTE* msgBuf, long& msgBufPos, long bufSize) { m_mapDirtyAttrData.clear(); WORD attrNum = _GetWordFromByteArray(msgBuf, msgBufPos, bufSize); // 属性种类个数 char varName[1024]; for(int i=0; i<(int)attrNum; i++) { //--新格式 //变量名字符串长度(long) //变量名字符串 //变量类型(long) //变量数据长度(long) //变量数据 long varNameLen = _GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量名字符串长度(long) _GetStringFromByteArray(msgBuf, msgBufPos, varName, bufSize);//变量名字符串 m_mapDirtyAttrData.insert(string(varName)); long bufType = _GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量类型(long) long varBufLen = _GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量数据长度(long) CEntityProperty* ep = NULL; CDataEntityManager::EntityPropertyMapItr itr = GetDataEntityManager().GetEntityPropertyMap().find(varName); if(itr != GetDataEntityManager().GetEntityPropertyMap().end()) ep = itr->second; else { CDataEntityManager* pdeManager = NULL; std::map<string, CDataEntityManager*>::iterator itr = GetGame()->GetDBEntityManager()->GetObjAttrDef().find(string("player")); if(itr != GetGame()->GetDBEntityManager()->GetObjAttrDef().end()) pdeManager = itr->second; if(pdeManager) { CEntityProperty* templateEP = pdeManager->GetEntityProperty(varName); if(templateEP) ep = GetDataEntityManager().CreateEntityProperty(varName, templateEP->GetDBTableName(), templateEP->GetDataType()); else AddLogText("根据属性名[%s]查找属性指针为空!", varName); } } assert(ep != NULL); switch((DATA_OBJECT_TYPE)bufType) { case DATA_OBJECT_TIME: { // 6个long值 : 年 月 日 时 分 秒 BYTE timeValue[6*sizeof(DWORD)]; memset(timeValue, 0, 6*sizeof(DWORD)); _GetBufferFromByteArray(msgBuf, msgBufPos, timeValue, 6*sizeof(DWORD), bufSize); ep->SetBufAttr(0, timeValue, 6*sizeof(DWORD)); } break; case DATA_OBJECT_STRING: { char varValue[1024]; _GetStringFromByteArray(msgBuf, msgBufPos, varValue, bufSize);//变量数据 ep->SetStringAttr(0, string((char*)varValue)); } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_SHORT: case DATA_OBJECT_ULONG: case DATA_OBJECT_USHORT: case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: case DATA_OBJECT_WORD: case DATA_OBJECT_DWORD: { long value = _GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量数据 ep->SetLongAttr(0, (long)value); } break; case DATA_OBJECT_GUID: { CGUID tGUID; _GetBufferFromByteArray(msgBuf, msgBufPos, tGUID, bufSize);//变量数据 ep->SetGuidAttr(0, tGUID); } break; case DATA_OBJECT_BUFFER: { BYTE* buf = new BYTE[varBufLen]; _GetBufferFromByteArray(msgBuf, msgBufPos, buf, varBufLen, bufSize);//变量数据 ep->SetBufAttr(0, buf, varBufLen); SAFE_DELETE_ARRAY(buf); } break; } } }
void CDBPlayer::AddEntityDataToMsg(DB_OPERATION_TYPE opType, vector<BYTE>& pBA) { // 传递来的消息前面已经加入了 // OPEntityID: 4byte, 操作实体的ID值 // DBOP Type: 1byte, 数据库操作类型(枚举值) // MSG ID: 4byte, 该消息的MSGID // Entity Num: 2byte, 该实体个数 WORD attrNum = m_mapDirtyAttrData.size(); _AddToByteArray(&pBA, m_GUID); // 实体ID _AddToByteArray(&pBA, (WORD)attrNum); // 属性种类个数 //--新格式 //变量名字符串长度(long) //变量名字符串 //变量类型(long) //变量数据长度(long) //变量数据 set<string>::iterator itr = m_mapDirtyAttrData.begin(); for(; itr != m_mapDirtyAttrData.end(); itr++) { CEntityProperty* ep = GetDataEntityManager().GetEntityProperty(*itr); if(ep) { _AddToByteArray(&pBA, (long)(*itr).size());//变量名字符串长度(long) _AddToByteArray(&pBA, (*itr).c_str());//变量名字符串 _AddToByteArray(&pBA, (long)ep->GetDataType());//变量类型(long) _AddToByteArray(&pBA, (long)ep->GetBufSize(0));//变量数据长度(long) switch(ep->GetDataType()) { case DATA_OBJECT_TIME: { // 6个long值 : 年 月 日 时 分 秒 BYTE timeValue[6*sizeof(DWORD)]; memset(timeValue, 0, 6*sizeof(DWORD)); ep->GetBufAttr(0, (void*)timeValue, 6*sizeof(DWORD)); _AddToByteArray(&pBA, timeValue, 6*sizeof(DWORD)); } break; case DATA_OBJECT_STRING: { _AddToByteArray(&pBA, ep->GetStringAttr(0));//变量数据 } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_SHORT: case DATA_OBJECT_ULONG: case DATA_OBJECT_USHORT: case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: case DATA_OBJECT_WORD: case DATA_OBJECT_DWORD: { _AddToByteArray(&pBA, (long)ep->GetLongAttr(0));//变量数据 } break; case DATA_OBJECT_GUID: { CGUID tGUID; ep->GetGuidAttr(0, tGUID); _AddToByteArray(&pBA, tGUID);//变量数据 } break; case DATA_OBJECT_BUFFER: { long bufSize = ep->GetBufSize(0); if(bufSize) { BYTE* buf = new BYTE[bufSize]; ep->GetBufAttr(0, (void*)buf, bufSize); _AddToByteArray(&pBA, buf, bufSize);//变量数据 SAFE_DELETE_ARRAY(buf); } } break; } } } m_mapDirtyAttrData.clear(); }
//! 保存个人房屋内的物品信息 bool CRsDupRgn::SaveDupRgnObj(const CGUID& ownerID, map<CGUID,CDBRgnGoods*>& goodsGroup, _ConnectionPtr& cn) { if(cn == NULL) { AddLogText(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_CNPTRNULL)); return false; } _RecordsetPtr rs; // 比物品个数多分配2048字节 char *sql = new char[1024 * (goodsGroup.size()+2)]; string iniName = "phrgnobj"; string tableName = "CSL_DUPRGN_GOODS"; try { TESTHR(CreateRs(rs)); char szGUID[128]; ownerID.tostring(szGUID); sprintf(sql, "DELETE FROM CSL_DUPRGN_GOODS WHERE DupRgnGUID='%s'", szGUID); // 先删除该个人房屋的成员 if(!ExecuteCn(sql, cn)) { PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_DELRGNOBJFAIL)); return false; } // 清空sql语句 memset(sql, 0, 1024 * (goodsGroup.size()+2)); // 生成语句头 strcpy(sql, "INSERT INTO CSL_DUPRGN_GOODS("); CDataEntityManager* pObjAttrDef = NULL; std::map<string, CDataEntityManager*>::iterator itr = GetGame()->GetDBEntityManager()->GetObjAttrDef().find(iniName); if(itr != GetGame()->GetDBEntityManager()->GetObjAttrDef().end()) pObjAttrDef = itr->second; if(!pObjAttrDef) return false; //! 生成语句身 CDataEntityManager::EntityPropertyMapItr attrItr = pObjAttrDef->GetEntityPropertyMap().begin(); for (; attrItr != pObjAttrDef->GetEntityPropertyMap().end(); attrItr++) { if(attrItr->second->GetDBTableName() == tableName) { CWrapDataObject* wdo = attrItr->second->GetDataObject(0); if(wdo) { // 添加属性字段名 strcat(sql, attrItr->second->GetEPName().c_str()); strcat(sql, ","); } } } long sqlLen = strlen(sql); sql[sqlLen-1] = '\0'; strcat(sql, ") select "); map<CGUID,CDBRgnGoods*>::iterator goodsItr = goodsGroup.begin(); for(; goodsItr != goodsGroup.end(); goodsItr++) { //! 生成语句身 attrItr = pObjAttrDef->GetEntityPropertyMap().begin(); for (; attrItr != pObjAttrDef->GetEntityPropertyMap().end(); attrItr++) { if(attrItr->second) { if(attrItr->second->GetDBTableName() == tableName) { // 添加属性字段值 CEntityProperty* ep = (goodsItr->second)->GetDataEntityManager().GetEntityProperty(attrItr->second->GetEPName()); if(ep) { if(ep->GetDBTableName() == tableName) { switch(ep->GetDataType()) { case DATA_OBJECT_TIME: { char szTimeValue[2048]; DWORD timeValue[6] = {0}; ep->GetBufAttr(0, (void*)&timeValue[0], sizeof(DWORD)*6); sprintf(szTimeValue, "%d-%d-%d %d:%d:%d", timeValue[0], timeValue[1], timeValue[2], timeValue[3], timeValue[4], timeValue[5]); //rs->PutCollect((*epItr).c_str(), szTimeValue); strcat(sql, "'"); strcat(sql, szTimeValue); strcat(sql, "',"); } break; case DATA_OBJECT_STRING: { //rs->PutCollect((*epItr).c_str(), ); strcat(sql, "'"); const char* pStr = ep->GetStringAttr(0); if(pStr) strcat(sql, pStr); else strcat(sql, ""); strcat(sql, "',"); } break; case DATA_OBJECT_BUFFER: { //SaveBufferField((*goodsItr), (*epItr).c_str(), rs); } break; case DATA_OBJECT_GUID: { CGUID tGUID; ep->GetGuidAttr(0, tGUID); char szGuid[128]; tGUID.tostring(szGuid); //rs->PutCollect((*epItr).c_str(), szGuid); strcat(sql, "'"); strcat(sql, szGuid); strcat(sql, "',"); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: { //rs->PutCollect((*epItr).c_str(), (BYTE)ep->GetLongAttr(0)); char value[32]; memset(value, 0, sizeof(value)); itoa((BYTE)ep->GetLongAttr(0), value, 10); strcat(sql, value); strcat(sql, ","); } break; case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: { //rs->PutCollect((*epItr).c_str(), (WORD)ep->GetLongAttr(0)); char value[32]; memset(value, 0, sizeof(value)); itoa((WORD)ep->GetLongAttr(0), value, 10); strcat(sql, value); strcat(sql, ","); } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { //rs->PutCollect((*epItr).c_str(), (DWORD)ep->GetLongAttr(0)); char value[32]; memset(value, 0, sizeof(value)); itoa((DWORD)ep->GetLongAttr(0), value, 10); strcat(sql, value); strcat(sql, ","); } break; } } } } } } sqlLen = strlen(sql); sql[sqlLen-1] = '\0'; strcat(sql, " union all select "); } sqlLen = strlen(sql); sql[sqlLen-17] = '\0'; TESTHR(ExecuteCn(sql, cn)); SAFE_DELETE_ARRAY(sql); return true; } catch (_com_error &e) { SAFE_DELETE_ARRAY(sql); ReleaseRs(rs); PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_SAVERGNGOODSFAIL), e); return false; } SAFE_DELETE_ARRAY(sql); return false; }
//! 保存个人房屋信息 void CRsDupRgn::SaveDupRgn(CDBDupRgn* dupRgn, _ConnectionPtr& cn) { if(cn == NULL) { AddLogText(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_FINDDUPRGNPROPERTYERR)); return; } _RecordsetPtr rs; char sql[1024] = ""; try { TESTHR(CreateRs(rs)); char szGUID[128]; dupRgn->GetExID().tostring(szGUID); sprintf(sql, "select * from dbo.CSL_DUPRGN_PROPERTY where guid='%s'", szGUID); TESTHR(OpenRs(sql, rs, cn, adOpenDynamic, adLockOptimistic)); bool isNewCreated = false; if(rs->GetadoEOF()) // 没有记录,创建一个 { rs->AddNew(); isNewCreated = true; } set<string>::iterator epItr = dupRgn->GetDirtyAttrDataMap().begin(); for(; epItr != dupRgn->GetDirtyAttrDataMap().end(); epItr++) { CEntityProperty* ep = dupRgn->GetDataEntityManager().GetEntityProperty(*epItr); if(ep) { if(ep->GetDBTableName() == "CSL_DUPRGN_PROPERTY") { switch(ep->GetDataType()) { case DATA_OBJECT_TIME: { char szTimeValue[2048]; DWORD timeValue[6] = {0}; ep->GetBufAttr(0, (void*)timeValue, 6*sizeof(DWORD)); if(szTimeValue[0] != 0 && szTimeValue[1] != 0 && szTimeValue[2] != 0 && szTimeValue[3] != 0 && szTimeValue[4] != 0 && szTimeValue[5] != 0) { sprintf(szTimeValue, "%d-%d-%d %d:%d:%d", timeValue[0], timeValue[1], timeValue[2], timeValue[3], timeValue[4], timeValue[5]); rs->PutCollect((*epItr).c_str(), szTimeValue); } } break; case DATA_OBJECT_STRING: { const char* pStr = ep->GetStringAttr(0); if(pStr) rs->PutCollect((*epItr).c_str(), pStr); } break; case DATA_OBJECT_BUFFER: { SaveBufferField((CBaseDBEntity*)dupRgn, (*epItr).c_str(), rs); } break; case DATA_OBJECT_GUID: { CGUID tGUID; ep->GetGuidAttr(0, tGUID); char szGUID[128]; tGUID.tostring(szGUID); if( (ep->GetDbFlag() == 0) ) // 0:非主键,1:主键 rs->PutCollect((*epItr).c_str(), szGUID); else if(isNewCreated) // 是主键但是是刚创建对象 rs->PutCollect((*epItr).c_str(), szGUID); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: { rs->PutCollect((*epItr).c_str(), (BYTE)ep->GetLongAttr(0)); } break; case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: { rs->PutCollect((*epItr).c_str(), (WORD)ep->GetLongAttr(0)); } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { rs->PutCollect((*epItr).c_str(), (DWORD)ep->GetLongAttr(0)); } break; } } } } rs->Update(); ReleaseRs(rs); return; } catch (_com_error &e) { ReleaseRs(rs); PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_SAVERGNOBJFAIL), e); return; } return; }
//! 数据库里添加系统信件 void CRsMail::InsertSysMailToGroup(CDBMail* pMail, MAIL_LEVEL_OPER_FLAG levelOpFlag, long level, long sex, long* countryIDArray, long countryNum, _ConnectionPtr& cn) { if(!pMail || cn == NULL || !countryIDArray) return; // 产生sql语句 char sql[1024]; _RecordsetPtr rs; _RecordsetPtr mailRs; try { // 记录收信人ID vector<CGUID> vecRecieverID; TESTHR(CreateRs(rs)); sprintf(sql, "select * FROM baseproperty WHERE "); if(level != -1) { if(levelOpFlag == MAIL_LEVEL_GREATANDEQUAL) strcat(sql, "Levels >= "); else if(levelOpFlag == MAIL_LEVEL_LESSANDEQUAL) strcat(sql, "Levels <= "); char szNum[128]; itoa(level, szNum, 10); strcat(sql, szNum); } else if(sex != -1) { if( (sex != -1)) strcat(sql, ", AND "); strcat(sql, "Sex = "); char szNum[128]; itoa(sex, szNum, 10); strcat(sql, szNum); } else if(countryIDArray != NULL && countryNum != 0) { if( (sex != -1) || (level != -1)) strcat(sql, ", AND "); for(int i=0; i<countryNum; i++) { strcat(sql, "(Country = "); char szNum[128]; itoa(countryIDArray[i], szNum, 10); strcat(sql, szNum); strcat(sql, ", OR "); } long sqlLen = strlen(sql); sql[sqlLen-5] = '\0'; strcat(sql, ")"); } TESTHR(OpenRs(sql, rs, cn)); while(!rs->GetadoEOF()) { CGUID tGuid((_bstr_t)rs->GetCollect("guid")); vecRecieverID.push_back(tGuid); rs->MoveNext(); } ReleaseRs(rs); TESTHR(CreateRs(mailRs)); sprintf(sql, "select * FROM CSL_MAIL WHERE PlayerID='{00000000-0000-0000-0000-000000000000}'"); TESTHR(OpenRs(sql, mailRs, cn)); for(int i=0; i<vecRecieverID.size(); i++) { rs->AddNew(); CDataEntityManager::EntityPropertyMapItr epItr = pMail->GetDataEntityManager().GetEntityPropertyMap().begin(); for(; epItr != pMail->GetDataEntityManager().GetEntityPropertyMap().end(); epItr++) { CEntityProperty* ep = epItr->second; if(ep) { if(ep->GetDBTableName() == "CSL_MAIL") { switch(ep->GetDataType()) { case DATA_OBJECT_TIME: { char szTimeValue[2048]; DWORD timeValue[6] = {0}; ep->GetBufAttr(0, (void*)timeValue, 6*sizeof(DWORD)); if(szTimeValue[0] != 0 && szTimeValue[1] != 0 && szTimeValue[2] != 0 && szTimeValue[3] != 0 && szTimeValue[4] != 0 && szTimeValue[5] != 0) { sprintf(szTimeValue, "%d-%d-%d %d:%d:%d", timeValue[0], timeValue[1], timeValue[2], timeValue[3], timeValue[4], timeValue[5]); rs->PutCollect(epItr->first.c_str(), szTimeValue); } } break; case DATA_OBJECT_STRING: { rs->PutCollect(epItr->first.c_str(), ep->GetStringAttr(0)); } break; case DATA_OBJECT_BUFFER: { SaveBufferField((CBaseDBEntity*)pMail, epItr->first.c_str(), rs); } break; case DATA_OBJECT_GUID: { CGUID tGUID; ep->GetGuidAttr(0, tGUID); char szGUID[128]; tGUID.tostring(szGUID); rs->PutCollect(epItr->first.c_str(), szGUID); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: { rs->PutCollect(epItr->first.c_str(), (BYTE)ep->GetLongAttr(0)); } break; case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: { rs->PutCollect(epItr->first.c_str(), (WORD)ep->GetLongAttr(0)); } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { rs->PutCollect(epItr->first.c_str(), (DWORD)ep->GetLongAttr(0)); } break; } } } } } if(vecRecieverID.size()) mailRs->Update(); ReleaseRs(mailRs); return; } catch (_com_error &e) { PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_DELRGNOBJFAIL), e); ReleaseRs(rs); ReleaseRs(mailRs); return; } ReleaseRs(rs); ReleaseRs(mailRs); return; }
//! 保存个人房屋内的物品信息 DB_OPERATION_RESULT_TYPE CRsMail::SaveMailGoods(const CGUID& ownerID, set<CDBMailGoods*>& goodsGroup, _ConnectionPtr& cn) { if(cn == NULL) { AddLogText(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_CNPTRNULL)); return DB_OPER_RESULT_ERROR; } _RecordsetPtr rs; char sql[1024] = ""; string iniName = "mailgoods"; string tableName = "CSL_MAIL_GOODS"; try { TESTHR(CreateRs(rs)); char szGUID[128]; ownerID.tostring(szGUID); sprintf(sql, "DELETE FROM CSL_MAIL_GOODS WHERE MailID='%s'", szGUID); // 先删除该个人房屋的成员 if(!ExecuteCn(sql, cn)) { PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_DELRGNOBJFAIL)); return DB_OPER_RESULT_ERROR; } TESTHR(CreateRs(rs)); // 先查找该个人房屋的成员 sprintf(sql, "SELECT * FROM CSL_MAIL_GOODS WHERE MailID='%s'", szGUID); TESTHR(OpenRs(sql, rs, cn, adOpenForwardOnly, adLockOptimistic)); set<CDBMailGoods*>::iterator goodsItr = goodsGroup.begin(); for(; goodsItr != goodsGroup.end(); goodsItr++) { rs->AddNew(); //! 生成语句身 CDataEntityManager::EntityPropertyMapItr attrItr = (*goodsItr)->GetDataEntityManager().GetEntityPropertyMap().begin(); for (; attrItr != (*goodsItr)->GetDataEntityManager().GetEntityPropertyMap().end(); attrItr++) { if(attrItr->second) { // 添加属性字段值 CEntityProperty* ep = attrItr->second; if(ep) { if(ep->GetDBTableName() == tableName) { switch(ep->GetDataType()) { case DATA_OBJECT_TIME: { char szTimeValue[2048]; DWORD timeValue[6] = {0}; ep->GetBufAttr(0, (void*)&timeValue[0], sizeof(DWORD)*6); sprintf(szTimeValue, "%d-%d-%d %d:%d:%d", timeValue[0], timeValue[1], timeValue[2], timeValue[3], timeValue[4], timeValue[5]); rs->PutCollect(attrItr->first.c_str(), szTimeValue); } break; case DATA_OBJECT_STRING: { rs->PutCollect(attrItr->first.c_str(), ep->GetStringAttr(0)); } break; case DATA_OBJECT_BUFFER: { SaveBufferField((*goodsItr), attrItr->first.c_str(), rs); } break; case DATA_OBJECT_GUID: { CGUID tGUID; ep->GetGuidAttr(0, tGUID); char szGuid[128]; tGUID.tostring(szGuid); rs->PutCollect(attrItr->first.c_str(), szGuid); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: { rs->PutCollect(attrItr->first.c_str(), (BYTE)ep->GetLongAttr(0)); } break; case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: { rs->PutCollect(attrItr->first.c_str(), (WORD)ep->GetLongAttr(0)); } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { rs->PutCollect(attrItr->first.c_str(), (DWORD)ep->GetLongAttr(0)); } break; } } } } } } if(goodsGroup.size()) rs->Update(); return DB_OPER_RESULT_OK; } catch (_com_error &e) { ReleaseRs(rs); PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_SAVERGNGOODSFAIL), e); return DB_OPER_RESULT_ERROR; } return DB_OPER_RESULT_ERROR; }
//! 保存个人房屋信息 void CRsMail::SaveMail(CDBMail* mail, _ConnectionPtr& cn) { if(cn == NULL) { AddLogText(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_FINDDUPRGNPROPERTYERR)); return; } if(!mail) return; _RecordsetPtr rs; char sql[500] = ""; try { TESTHR(CreateRs(rs)); char szGUID[128]; mail->GetExID().tostring(szGUID); TESTHR(OpenRs("CSL_MAIL", rs, cn, adOpenForwardOnly, adLockOptimistic)); if(!rs->GetadoEOF()) // 没有记录,创建一个 { ReleaseRs(rs); AddLogText("Create mail[%s] Err,RS is NULL!", szGUID); } bool isNewCreated = false; BYTE phNum = rs->GetRecordCount(); if(phNum == 0xff) // 没有记录,创建一个 { rs->AddNew(); isNewCreated = true; } set<string>::iterator epItr = mail->GetDirtyAttrDataMap().begin(); for(; epItr != mail->GetDirtyAttrDataMap().end(); epItr++) { CEntityProperty* ep = mail->GetDataEntityManager().GetEntityProperty(*epItr); if(ep) { if(ep->GetDBTableName() == "CSL_MAIL") { switch(ep->GetDataType()) { case DATA_OBJECT_TIME: { char szTimeValue[2048]; DWORD timeValue[6] = {0}; ep->GetBufAttr(0, (void*)timeValue, 6*sizeof(DWORD)); if(szTimeValue[0] != 0 && szTimeValue[1] != 0 && szTimeValue[2] != 0 && szTimeValue[3] != 0 && szTimeValue[4] != 0 && szTimeValue[5] != 0) { sprintf(szTimeValue, "%d-%d-%d %d:%d:%d", timeValue[0], timeValue[1], timeValue[2], timeValue[3], timeValue[4], timeValue[5]); rs->PutCollect((*epItr).c_str(), szTimeValue); } } break; case DATA_OBJECT_STRING: { rs->PutCollect((*epItr).c_str(), ep->GetStringAttr(0)); } break; case DATA_OBJECT_BUFFER: { SaveBufferField((CBaseDBEntity*)mail, (*epItr).c_str(), rs); } break; case DATA_OBJECT_GUID: { CGUID tGUID; ep->GetGuidAttr(0, tGUID); char szGUID[128]; tGUID.tostring(szGUID); if( (ep->GetDbFlag() == 0) ) // 0:非主键,1:主键 rs->PutCollect((*epItr).c_str(), szGUID); else if(isNewCreated) // 是主键但是是刚创建对象 rs->PutCollect((*epItr).c_str(), szGUID); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: { rs->PutCollect((*epItr).c_str(), (BYTE)ep->GetLongAttr(0)); } break; case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: { rs->PutCollect((*epItr).c_str(), (WORD)ep->GetLongAttr(0)); } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { rs->PutCollect((*epItr).c_str(), (DWORD)ep->GetLongAttr(0)); } break; } } } } rs->Update(); ReleaseRs(rs); return; } catch (_com_error &e) { ReleaseRs(rs); PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_SAVERGNOBJFAIL), e); return; } return; }
DB_OPERATION_RESULT_TYPE CRsMail::SavePlayerMails(CDBMailGroup* mailGroup, _ConnectionPtr& cn) { if(cn == NULL) { AddLogText(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_FINDDUPRGNPROPERTYERR)); return DB_OPER_RESULT_ERROR; } if(!mailGroup) return DB_OPER_RESULT_OK; _RecordsetPtr rs; char sql[1024] = ""; try { TESTHR(CreateRs(rs)); char szGUID[128]; mailGroup->GetOwnerGUID().tostring(szGUID); sprintf(sql, "SELECT * FROM CSL_MAIL WHERE PlayerID='%s'", szGUID); TESTHR(OpenRs(sql, rs, cn, adOpenForwardOnly, adLockOptimistic)); set<CDBMail*>::iterator itr = mailGroup->GetMailGroupSet().begin(); for(; itr != mailGroup->GetMailGroupSet().end(); itr++) { CDBMail* mail = *itr; rs->AddNew(); set<string>::iterator epItr = mail->GetDirtyAttrDataMap().begin(); for(; epItr != mail->GetDirtyAttrDataMap().end(); epItr++) { CEntityProperty* ep = mail->GetDataEntityManager().GetEntityProperty(*epItr); if(ep) { if(ep->GetDBTableName() == "CSL_MAIL") { switch(ep->GetDataType()) { case DATA_OBJECT_TIME: { char szTimeValue[2048]; DWORD timeValue[6] = {0}; ep->GetBufAttr(0, (void*)timeValue, 6*sizeof(DWORD)); if(szTimeValue[0] != 0 && szTimeValue[1] != 0 && szTimeValue[2] != 0 && szTimeValue[3] != 0 && szTimeValue[4] != 0 && szTimeValue[5] != 0) { sprintf(szTimeValue, "%d-%d-%d %d:%d:%d", timeValue[0], timeValue[1], timeValue[2], timeValue[3], timeValue[4], timeValue[5]); rs->PutCollect((*epItr).c_str(), szTimeValue); } } break; case DATA_OBJECT_STRING: { rs->PutCollect((*epItr).c_str(), ep->GetStringAttr(0)); } break; case DATA_OBJECT_BUFFER: { SaveBufferField((CBaseDBEntity*)mail, (*epItr).c_str(), rs); } break; case DATA_OBJECT_GUID: { CGUID tGUID; ep->GetGuidAttr(0, tGUID); char szGUID[128]; tGUID.tostring(szGUID); rs->PutCollect((*epItr).c_str(), szGUID); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: { rs->PutCollect((*epItr).c_str(), (BYTE)ep->GetLongAttr(0)); } break; case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: { rs->PutCollect((*epItr).c_str(), (WORD)ep->GetLongAttr(0)); } break; case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { rs->PutCollect((*epItr).c_str(), (DWORD)ep->GetLongAttr(0)); } break; } } } } SaveMailGoods(mail->GetExID(), mail->GetGoodsGroupPtr()->GetGoodsGroupSet(), cn); } rs->Update(); ReleaseRs(rs); return DB_OPER_RESULT_OK; } catch (_com_error &e) { ReleaseRs(rs); PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_SAVERGNOBJFAIL), e); return DB_OPER_RESULT_ERROR; } return DB_OPER_RESULT_ERROR; }