CEntityGroup& CEntityGroup::operator=(CEntityGroup& right) { CBaseEntity::operator=(right); if(this != &right) { m_GUID = right.m_GUID; map<CGUID, CBaseEntity*>::iterator itr = m_mapEntityGroup.begin(); for(; itr != m_mapEntityGroup.end(); itr++) { SAFE_DELETE(itr->second); } m_mapEntityGroup.clear(); itr = right.m_mapEntityGroup.begin(); for(; itr != right.m_mapEntityGroup.end(); itr++) { CBaseEntity* tGoods = GetGame()->GetEntityManager()->NewBaseEntity(itr->second->GetCompositeFlag(), itr->first); if(itr->second->GetCurDbOperFlag()) { if(tGoods->GetCompositeType() == COM_COMPOSITE) *((CEntityGroup*)tGoods) = *((CEntityGroup*)(itr->second)); else *((CEntity*)tGoods) = *((CEntity*)(itr->second)); } m_mapEntityGroup[itr->first] = tGoods; } m_mapGuidByComFlag = right.m_mapGuidByComFlag; m_lLeafComType = right.m_lLeafComType; m_lLeafComFlag = right.m_lLeafComFlag; // 其父节点的子类型区分的数据库变量名 m_strDetailComPositeFlagName = right.m_strDetailComPositeFlagName; m_lDetailComPositeFlagType = right.m_lDetailComPositeFlagType; m_bHasDetailLeavesFlag = right.m_bHasDetailLeavesFlag; memcpy(m_szName, right.m_szName, sizeof(m_szName)); m_SessionID = right.m_SessionID; m_DeleteLeafGuid = right.m_DeleteLeafGuid; m_strDelLeafComFlag = right.m_strDelLeafComFlag; QueryDataRelease(); vector<CTempEntityProperty*>::iterator epItr = right.m_pQueryDataMgr.begin(); for(; epItr != right.m_pQueryDataMgr.end(); epItr++) { CTempEntityProperty* pEP = new CTempEntityProperty((*epItr)->GetVarName(), (*epItr)->GetDataType()); *pEP = *(*epItr); m_pQueryDataMgr.push_back(pEP); } RetQueryDataRelease(); epItr = right.m_pRetQueryDataMgr.begin(); for(; epItr != right.m_pRetQueryDataMgr.end(); epItr++) { CTempEntityProperty* pEP = new CTempEntityProperty((*epItr)->GetVarName(), (*epItr)->GetDataType()); *pEP = *(*epItr); m_pRetQueryDataMgr.push_back(pEP); } m_bIsFindByName = right.m_bIsFindByName; m_strProcedureName = right.m_strProcedureName; } return *this; }
void CEntityGroup::GetFromByteArray(BYTE* msgBuf, long& msgBufPos, long bufSize) { QueryDataRelease(); RetQueryDataRelease(); // 查询变量 long lQueryAttrNum = _GetWordFromByteArray(msgBuf, msgBufPos, bufSize); for(int j=0; j<lQueryAttrNum; j++) { char szQueryStrName[128]; _GetStringFromByteArray(msgBuf, msgBufPos, szQueryStrName, bufSize); DATA_OBJECT_TYPE objType = (DATA_OBJECT_TYPE)_GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量类型(long) long lQueryBufSize = _GetLongFromByteArray(msgBuf, msgBufPos, bufSize); CTempEntityProperty* pEP = new CTempEntityProperty(szQueryStrName, objType); if(pEP) { switch(objType) { case DATA_OBJECT_BUFFER: { if(lQueryBufSize>0) { BYTE* queryBuf = new BYTE[lQueryBufSize]; _GetBufferFromByteArray(msgBuf, msgBufPos, queryBuf, lQueryBufSize, bufSize); pEP->SetBufAttr(queryBuf, lQueryBufSize); SAFE_DELETE_ARRAY(queryBuf); } } break; case DATA_OBJECT_STRING: { char szValue[128]; memset(szValue, 0, sizeof(szValue)); _GetStringFromByteArray(msgBuf, msgBufPos, szValue, bufSize); pEP->SetStringAttr(string(szValue)); } break; case DATA_OBJECT_GUID: { CGUID tGuid; _GetBufferFromByteArray(msgBuf, msgBufPos, tGuid, bufSize); pEP->SetGuidAttr(tGuid); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { pEP->SetLongAttr(_GetLongFromByteArray(msgBuf, msgBufPos, bufSize)); } break; } DB_RELATE_TYPE relateType = (DB_RELATE_TYPE)_GetByteFromByteArray(msgBuf, msgBufPos, bufSize); pEP->SetDbRelateType(relateType); m_pQueryDataMgr.push_back(pEP); } } // 查询返回的变量 lQueryAttrNum = _GetWordFromByteArray(msgBuf, msgBufPos, bufSize); for(int j=0; j<lQueryAttrNum; j++) { char szQueryStrName[128]; _GetStringFromByteArray(msgBuf, msgBufPos, szQueryStrName, bufSize); DATA_OBJECT_TYPE objType = (DATA_OBJECT_TYPE)_GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量类型(long) CTempEntityProperty* pEP = new CTempEntityProperty(szQueryStrName, objType); if(pEP) { switch(objType) { case DATA_OBJECT_STRING: { char szValue[128]; memset(szValue, 0, sizeof(szValue)); _GetStringFromByteArray(msgBuf, msgBufPos, szValue, bufSize); pEP->SetStringAttr(string(szValue)); } break; case DATA_OBJECT_GUID: { CGUID tGuid; _GetBufferFromByteArray(msgBuf, msgBufPos, tGuid, bufSize); pEP->SetGuidAttr(tGuid); } break; case DATA_OBJECT_BOOL: case DATA_OBJECT_CHAR: case DATA_OBJECT_BYTE: case DATA_OBJECT_SHORT: case DATA_OBJECT_WORD: case DATA_OBJECT_USHORT: case DATA_OBJECT_FLOAT: case DATA_OBJECT_LONG: case DATA_OBJECT_ULONG: case DATA_OBJECT_DWORD: { pEP->SetLongAttr(_GetLongFromByteArray(msgBuf, msgBufPos, bufSize)); } break; } DB_RELATE_TYPE relateType = (DB_RELATE_TYPE)_GetByteFromByteArray(msgBuf, msgBufPos, bufSize); pEP->SetDbRelateType(relateType); m_pRetQueryDataMgr.push_back(pEP); } } // 解析消息 WORD attrNum = _GetWordFromByteArray(msgBuf, msgBufPos, bufSize); // 属性种类个数 if(attrNum) { for(int i=0; i<(int)attrNum; i++) { long lAttrEnum = _GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量类型枚举值(long) long varBufLen = _GetLongFromByteArray(msgBuf, msgBufPos, bufSize);//变量数据长度(long) CEntityProperty* ep = NULL; long bufType = GetGame()->GetEntityManager()->GetDataObjectType(GetCompositeFlag(), lAttrEnum); CDataEntityManager::EntityPropertyMapItr itr = GetDataEntityManager().GetEntityPropertyMap().find(lAttrEnum); if(itr != GetDataEntityManager().GetEntityPropertyMap().end()) ep = itr->second; 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(timeValue, 6*sizeof(DWORD)); } break; case DATA_OBJECT_STRING: { char varValue[1024]; _GetStringFromByteArray(msgBuf, msgBufPos, varValue, bufSize);//变量数据 ep->SetStringAttr(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((long)value); } break; case DATA_OBJECT_GUID: { CGUID tGUID; _GetBufferFromByteArray(msgBuf, msgBufPos, tGUID, bufSize);//变量数据 ep->SetGuidAttr(tGUID); } break; case DATA_OBJECT_BUFFER: { BYTE* buf = new BYTE[varBufLen]; _GetBufferFromByteArray(msgBuf, msgBufPos, buf, varBufLen, bufSize);//变量数据 ep->SetBufAttr(buf, varBufLen); SAFE_DELETE_ARRAY(buf); } break; } } } ////////////////////////////////////////////////////////////////////////// // 是否有数据标志位 bool isLoadFlag = false; WORD num = _GetWordFromByteArray(msgBuf, msgBufPos, bufSize); if(num) { for(int j=0; j<num; j++) { BYTE entityType = _GetByteFromByteArray(msgBuf, msgBufPos, bufSize); char comFlag[64]; memset(comFlag, 0, sizeof(comFlag)); _GetStringFromByteArray(msgBuf, msgBufPos, comFlag, bufSize); CGUID guid; _GetBufferFromByteArray(msgBuf, msgBufPos, guid, bufSize); BYTE DbOperFlag = _GetByteFromByteArray(msgBuf, msgBufPos, bufSize); BYTE DBOperType = _GetByteFromByteArray(msgBuf, msgBufPos, bufSize); if(DBOperType == DB_OPER_LOAD || DBOperType == DB_OPER_LOAD_NOCACHE) isLoadFlag = true; if(DbOperFlag != 1) continue; switch(DBOperType) { case DB_OPER_DELETE_INSERT: case DB_OPER_ONLY_MEMSAVE: { CBaseEntity* pEntity = GetChild(guid); if(pEntity) { if(pEntity->GetCompositeType() == COM_COMPOSITE) { if(!((CEntityGroup*)pEntity)->GetHasDetailLeavesFlag())// 非分层group(GoodsGroup) { ReleaseLeaf(guid); pEntity = GetGame()->GetEntityManager()->NewBaseEntity(comFlag, guid); AddChild(pEntity); } } } else { pEntity = GetGame()->GetEntityManager()->NewBaseEntity(comFlag, guid); AddChild(pEntity); } if(pEntity) { pEntity->SetCurDbOperType(DBOperType); pEntity->SetCurDbOperFlag(DbOperFlag); if(DbOperFlag == 1) { pEntity->GetFromByteArray(msgBuf, msgBufPos, bufSize); } } } break; case DB_OPER_DELETE: { CBaseEntity* pEntity = GetChild(guid); if(!pEntity) { pEntity = GetGame()->GetEntityManager()->NewBaseEntity(comFlag, guid); AddChild(pEntity); } if(pEntity) { pEntity->SetCurDbOperFlag(DbOperFlag); pEntity->SetCurDbOperType(DBOperType); if(DbOperFlag == 1) pEntity->GetFromByteArray(msgBuf, msgBufPos, bufSize); } } break; case DB_OPER_INSERT: { CBaseEntity* pEntity = GetChild(guid); if(!pEntity) { pEntity = GetGame()->GetEntityManager()->NewBaseEntity(comFlag, guid); AddChild(pEntity); } if(pEntity) { pEntity->SetCurDbOperType(DBOperType); pEntity->SetCurDbOperFlag(DbOperFlag); if(DbOperFlag == 1) pEntity->GetFromByteArray(msgBuf, msgBufPos, bufSize); } } break; case DB_OPER_SAVE: { CBaseEntity* pLeaf = GetChild(guid); if(!pLeaf) { pLeaf = GetGame()->GetEntityManager()->NewBaseEntity(comFlag, guid); AddChild(pLeaf); } if(pLeaf) { pLeaf->SetCurDbOperType(DBOperType); pLeaf->SetCurDbOperFlag(DbOperFlag); if(DbOperFlag == 1) pLeaf->GetFromByteArray(msgBuf, msgBufPos, bufSize); } } break; case DB_OPER_LOAD: case DB_OPER_LOAD_NOCACHE: { CBaseEntity* pLeaf = GetChild(guid); if(!pLeaf) { pLeaf = GetGame()->GetEntityManager()->NewBaseEntity(comFlag, guid); AddChild(pLeaf); } if(pLeaf) { pLeaf->SetCurDbOperType(DBOperType); pLeaf->SetCurDbOperFlag(DbOperFlag); if(DbOperFlag == 1) pLeaf->GetFromByteArray(msgBuf, msgBufPos, bufSize); } } break; default: { CBaseEntity* pEntity = GetGame()->GetEntityManager()->NewBaseEntity(comFlag, guid); if(pEntity) { pEntity->SetCurDbOperType(DBOperType); pEntity->SetCurDbOperFlag(DbOperFlag); if(DbOperFlag == 1) pEntity->GetFromByteArray(msgBuf, msgBufPos, bufSize); } SAFE_DELETE(pEntity); AddLogText("GetFromByteArray(): 根节点%s 子结点%s 的操作类型%d 无效!", GetCompositeFlag().c_str(), comFlag, DBOperType); } break; } } } }