/** * 同步群组聊天信息 * * @param arg NULL * * @return NULL */ void* CSyncCenter::doSyncGroupChat(void* arg) { m_bSyncGroupChatRuning = true; CDBManager* pDBManager = CDBManager::getInstance(); map<uint32_t, uint32_t> mapChangedGroup; do { mapChangedGroup.clear(); CDBConn* pDBConn = pDBManager->GetDBConn("teamtalk_slave"); if(pDBConn) { string strSql = "select id, lastChated from IMGroup where status=0 and lastChated >=" + int2string(m_pInstance->getLastUpdateGroup()); CResultSet* pResult = pDBConn->ExecuteQuery(strSql.c_str()); if(pResult) { while (pResult->Next()) { uint32_t nGroupId = pResult->GetInt("id"); uint32_t nLastChat = pResult->GetInt("lastChated"); if(nLastChat != 0) { mapChangedGroup[nGroupId] = nLastChat; } } delete pResult; } pDBManager->RelDBConn(pDBConn); } else { log("no db connection for teamtalk_slave"); } m_pInstance->updateLastUpdateGroup(time(NULL)); for (auto it=mapChangedGroup.begin(); it!=mapChangedGroup.end(); ++it) { uint32_t nGroupId =it->first; list<uint32_t> lsUsers; uint32_t nUpdate = it->second; CGroupModel::getInstance()->getGroupUser(nGroupId, lsUsers); for (auto it1=lsUsers.begin(); it1!=lsUsers.end(); ++it1) { uint32_t nUserId = *it1; uint32_t nSessionId = INVALID_VALUE; nSessionId = CSessionModel::getInstance()->getSessionId(nUserId, nGroupId, IM::BaseDefine::SESSION_TYPE_GROUP, true); if(nSessionId != INVALID_VALUE) { CSessionModel::getInstance()->updateSession(nSessionId, nUpdate); } else { CSessionModel::getInstance()->addSession(nUserId, nGroupId, IM::BaseDefine::SESSION_TYPE_GROUP); } } } // } while (!m_pInstance->m_pCondSync->waitTime(5*1000)); } while (m_pInstance->m_bSyncGroupChatWaitting && !(m_pInstance->m_pCondGroupChat->waitTime(5*1000))); // } while(m_pInstance->m_bSyncGroupChatWaitting); m_bSyncGroupChatRuning = false; return NULL; }
void CSiteUser::afterFillUserData() { CDBManager* dbManager = CManagers::getInstance()->getDBManager(); std::shared_ptr<CDBRequest> dbRequest(dbManager->createDBRequest()); std::string attachStr = ""; const CDBRequestResult* result = dbRequest->selectRequest(CDBValues("attach,id"), "Files", "`userId` = " + valueToString(userId)); if (dbRequest->getIsLastQuerySuccess() && result != NULL && result->getRowsCnt() > 0) { for (int row = 0; row < result->getRowsCnt(); ++row) { attachStr += result->getStringValue(row, 0, ""); attachStr += ";"; attachStr += valueToString(result->getIntValue(row, 1, 0)); attachStr += ";"; } } std::vector<CAttachment*>* processedAttachs = CAttachment::processAttachmentString(attachStr); if (processedAttachs == NULL) return; for (auto it = processedAttachs->begin(); it != processedAttachs->end(); ++it) { CAttachment* currAttach = (*it); attachments.push_back(currAttach); } delete processedAttachs; }
void CAdviceBoard::initDB() { CDBManager* dbManager = CManagers::getInstance()->getDBManager(); std::shared_ptr<CDBRequest> dbRequestThreads(dbManager->createDBRequest()); std::shared_ptr<CDBRequest> dbRequestPosts(dbManager->createDBRequest()); if (!dbManager->getIsConnInit()) { CLog::getInstance()->addError("DB connect is not inited"); return; } const CDBRequestResult* resultThreads = dbRequestThreads->selectRequest(CDBValues("id"), "Threads"); if(dbRequestThreads->getIsLastQuerySuccess() && resultThreads != NULL && resultThreads->getRowsCnt() > 0) { int threadsCnt = resultThreads->getRowsCnt(); for(int j = 0; j < threadsCnt; j++) { int threadId = 0; threadId = resultThreads->getIntValue(j,0); if(threadId == 0) continue; const CDBRequestResult* resultPosts = dbRequestPosts->selectRequest(CDBValues("id"), "Posts", "`postThreadId` = " + valueToString(threadId)); if(dbRequestPosts->getIsLastQuerySuccess() && resultPosts != NULL && resultPosts->getRowsCnt() > 0) { int postsCnt = resultPosts->getRowsCnt(); dbRequestPosts->updateRequest("Threads", "`threadPostsCnt` = "+valueToString(postsCnt), "`id` = "+valueToString(threadId)); } } } }
std::string CSessionsPage::buildContent() const { CDBManager* dbManager = CManagers::getInstance()->getDBManager(); std::shared_ptr<CDBRequest> dbRequest(dbManager->createDBRequest()); const CUser* user = dynamic_cast<const CUser*>(currRequest->getUser()); CTemplateHelper* templateManager = CTemplateHelper::getInstance(); std::map<std::string, std::string> params; tmpString = ""; const CHTMLTemplate* contentTemplate = templateManager->findTemplate("content"); const CHTMLTemplate* sessionsTemplate = templateManager->findTemplate("sessionPage"); if(contentTemplate == NULL || sessionsTemplate == NULL) return "Missing content template"; const CDBRequestResult* result = dbRequest->selectRequest(CDBValues("*"), "Users"); //const CDBRequestResult* result = dbRequest->createRequest("SELECT * FROM `Users`;"); if(dbRequest->getIsLastQuerySuccess() && result != NULL && result->getRowsCnt() > 0) { for(int i = 0; i < result->getRowsCnt(); i++) { tmpString += "<tr><td>" + valueToString(result->getIntValue(i,0)) + "</td><td>" + "std::string(row[2])" + "</td><td> " + "unixTimeToDate(std::stol(row[8]))" + " </td></tr>"; } } params["{SESSION_LIST}"] = tmpString; tmpString = ""; tmpString += sessionsTemplate->getHTMLData(¶ms); params.clear(); params["{LEFTPANEL}"] = buildLeftPanel(user); params["{UPMENU}"] = buildUpperMenu(user); params["{CONTENT}"] = tmpString; return contentTemplate->getHTMLData(¶ms); }
int main() { WriteVersion(); #ifdef __FreeBSD__ _malloc_options = "A"; #endif CConfig Config; CNetPoller poller; CDBManager DBManager; CClientManager ClientManager; PlayerHB player_hb; CGuildManager GuildManager; CPrivManager PrivManager; CMoneyLog MoneyLog; ItemAwardManager ItemAwardManager; marriage::CManager MarriageManager; CMonarch Monarch; CBlockCountry BlockCountry; CItemIDRangeManager ItemIDRangeManager; #ifdef __AUCTION__ AuctionManager auctionManager; #endif if (!Start()) return 1; GuildManager.Initialize(); MarriageManager.Initialize(); BlockCountry.Load(); ItemIDRangeManager.Build(); #ifdef __AUCTION__ AuctionManager::instance().Initialize(); #endif sys_log(0, "Metin2DBCacheServer Start\n"); CClientManager::instance().MainLoop(); signal_timer_disable(); DBManager.Quit(); int iCount; while (1) { iCount = 0; iCount += CDBManager::instance().CountReturnQuery(SQL_PLAYER); iCount += CDBManager::instance().CountAsyncQuery(SQL_PLAYER); if (iCount == 0) break; usleep(1000); sys_log(0, "WAITING_QUERY_COUNT %d", iCount); } return 1; }
bool CInterLoginStrategy::doLogin(const std::string &strName, const std::string &strPass, IM::BaseDefine::UserInfo& user) { bool bRet = false; CDBManager* pDBManger = CDBManager::getInstance(); CDBConn* pDBConn = pDBManger->GetDBConn("teamtalk_slave"); if (pDBConn) { string strSql = "select * from IMUser where name='" + strName + "' and status=0"; CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if(pResultSet) { string strResult, strSalt; uint32_t nId, nGender, nDeptId, nStatus; string strNick, strAvatar, strEmail, strRealName, strTel, strDomain,strSignInfo; while (pResultSet->Next()) { nId = pResultSet->GetInt("id"); strResult = pResultSet->GetString("password"); strSalt = pResultSet->GetString("salt"); strNick = pResultSet->GetString("nick"); nGender = pResultSet->GetInt("sex"); strRealName = pResultSet->GetString("name"); strDomain = pResultSet->GetString("domain"); strTel = pResultSet->GetString("phone"); strEmail = pResultSet->GetString("email"); strAvatar = pResultSet->GetString("avatar"); nDeptId = pResultSet->GetInt("departId"); nStatus = pResultSet->GetInt("status"); strSignInfo = pResultSet->GetString("sign_info"); } string strInPass = strPass + strSalt; char szMd5[33]; CMd5::MD5_Calculate(strInPass.c_str(), strInPass.length(), szMd5); string strOutPass(szMd5); if(strOutPass == strResult) { bRet = true; user.set_user_id(nId); user.set_user_nick_name(strNick); user.set_user_gender(nGender); user.set_user_real_name(strRealName); user.set_user_domain(strDomain); user.set_user_tel(strTel); user.set_email(strEmail); user.set_avatar_url(strAvatar); user.set_department_id(nDeptId); user.set_status(nStatus); user.set_sign_info(strSignInfo); } delete pResultSet; } pDBManger->RelDBConn(pDBConn); } return bRet; }
void CSiteUser::attachFile(const std::string& attachStr) { CDBManager* dbManager = CManagers::getInstance()->getDBManager(); std::shared_ptr<CDBRequest> dbRequest(dbManager->createDBRequest()); CDBValues dbValues; dbValues.addValue("userId", (int)userId); dbValues.addValue("attach", attachStr); dbRequest->insertRequest(dbValues, "Files"); }
/* * IMMessage 分表 * AddFriendShip() * if nFromId or nToId is ShopEmployee * GetShopId * Insert into IMMessage_ShopId%8 */ bool CMessageModel::sendMessage(uint32_t nRelateId, uint32_t nFromId, uint32_t nToId, IM::BaseDefine::MsgType nMsgType, uint32_t nCreateTime, uint32_t nMsgId, string& strMsgContent) { bool bRet =false; if (nFromId == 0 || nToId == 0) { log("invalied userId.%u->%u", nFromId, nToId); return bRet; } CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("teamtalk_master"); if (pDBConn) { string strTableName = "IMMessage_" + int2string(nRelateId % 8); string strSql = "insert into " + strTableName + " (`relateId`, `fromId`, `toId`, `msgId`, `content`, `status`, `type`, `created`, `updated`) values(?, ?, ?, ?, ?, ?, ?, ?, ?)"; // 必须在释放连接前delete CPrepareStatement对象,否则有可能多个线程操作mysql对象,会crash CPrepareStatement* pStmt = new CPrepareStatement(); if (pStmt->Init(pDBConn->GetMysql(), strSql)) { uint32_t nStatus = 0; uint32_t nType = nMsgType; uint32_t index = 0; pStmt->SetParam(index++, nRelateId); pStmt->SetParam(index++, nFromId); pStmt->SetParam(index++, nToId); pStmt->SetParam(index++, nMsgId); pStmt->SetParam(index++, strMsgContent); pStmt->SetParam(index++, nStatus); pStmt->SetParam(index++, nType); pStmt->SetParam(index++, nCreateTime); pStmt->SetParam(index++, nCreateTime); bRet = pStmt->ExecuteUpdate(); } delete pStmt; pDBManager->RelDBConn(pDBConn); if (bRet) { uint32_t nNow = (uint32_t) time(NULL); incMsgCount(nFromId, nToId); } else { log("insert message failed: %s", strSql.c_str()); } } else { log("no db connection for teamtalk_master"); } return bRet; }
/** * <#Description#> * * @param nFromId <#nFromId description#> * @param nToId <#nToId description#> * @param nMsgId <#nMsgId description#> * @param strMsgData <#strMsgData description#> * @param nMsgType <#nMsgType description#> * @param nStatus 0获取未被删除的,1获取所有的,默认获取未被删除的 */ void CMessageModel::getLastMsg(uint32_t nFromId, uint32_t nToId, uint32_t& nMsgId, string& strMsgData, IM::BaseDefine::MsgType& nMsgType, uint32_t nStatus) { uint32_t nRelateId = CRelationModel::getInstance()->getRelationId(nFromId, nToId, false); if (nRelateId != INVALID_VALUE) { CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("teamtalk_slave"); if (pDBConn) { string strTableName = "IMMessage_" + int2string(nRelateId % 8); string strSql = "select msgId,type,content from " + strTableName + " force index (idx_relateId_status_created) where relateId= " + int2string(nRelateId) + " and status = 0 order by created desc, id desc limit 1"; CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if (pResultSet) { while (pResultSet->Next()) { nMsgId = pResultSet->GetInt("msgId"); nMsgType = IM::BaseDefine::MsgType(pResultSet->GetInt("type")); if (nMsgType == IM::BaseDefine::MSG_TYPE_SINGLE_AUDIO) { // "[语音]"加密后的字符串 strMsgData = strAudioEnc; } else { strMsgData = pResultSet->GetString("content"); } } delete pResultSet; } else { log("no result set: %s", strSql.c_str()); } pDBManager->RelDBConn(pDBConn); } else { log("no db connection_slave"); } } else { log("no relation between %lu and %lu", nFromId, nToId); } }
void CBan::readFromDB() { CDBManager* dbManager = CManagers::getInstance()->getDBManager(); //std::shared_ptr<CDBRequest> dbRequest(dbManager->createDBRequest()); std::shared_ptr<CDBRequest> dbRequest(dbManager->createDBRequest()); const CDBRequestResult* result = dbRequest->selectRequest(CDBValues("*"), "Bans", "`id` = "+valueToString(id)); if(dbRequest->getIsLastQuerySuccess() && result != NULL && result->getRowsCnt() > 0) { userId = result->getIntValue(0,1); roTime = result->getLongValue(0,2); isAccessClosed = result->getBoolValue(0,3); banCreationTime = result->getLongValue(0,4); } }
bool CGroupModel::removeGroup(uint32_t nUserId, uint32_t nGroupId, list<uint32_t>& lsCurUserId) { bool bRet = false; CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("dffxIMDB_master"); set<uint32_t> setGroupUsers; if(pDBConn) { string strSql = "select creator from IMGroup where id="+int2string(nGroupId); CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if(pResultSet) { uint32_t nCreator; while (pResultSet->Next()) { nCreator = pResultSet->GetInt("creator"); } if(0 == nCreator || nCreator == nUserId) { //设置群组不可用。 strSql = "update IMGroup set status=0 where id="+int2string(nGroupId); bRet = pDBConn->ExecuteUpdate(strSql.c_str()); } pResultSet->Clear(); } if (bRet) { strSql = "select userId from IMGroupMember where groupId="+int2string(nGroupId); CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if(pResultSet) { while (pResultSet->Next()) { uint32_t nId = pResultSet->GetInt("userId"); setGroupUsers.insert(nId); } pResultSet->Clear(); } } pDBManager->RelDBConn(pDBConn); } if(bRet) { bRet = removeMember(nGroupId, setGroupUsers, lsCurUserId); } return bRet; }
bool CGroupModel::insertNewGroup(uint32_t nUserId, const string& strGroupName, const string& strGroupAvatar, uint32_t nGroupType, uint32_t nMemberCnt, uint32_t& nGroupId) { bool bRet = false; nGroupId = INVALID_VALUE; CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("dffxIMDB_master"); if (pDBConn) { string strSql = "insert into IMGroup(`name`, `avatar`, `creator`, `type`,`userCnt`, `status`, `version`, `lastChated`, `updated`, `created`) "\ "values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; CPrepareStatement* pStmt = new CPrepareStatement(); if (pStmt->Init(pDBConn->GetMysql(), strSql)) { uint32_t nCreated = (uint32_t)time(NULL); uint32_t index = 0; uint32_t nStatus = 0; uint32_t nVersion = 1; uint32_t nLastChat = 0; pStmt->SetParam(index++, strGroupName); pStmt->SetParam(index++, strGroupAvatar); pStmt->SetParam(index++, nUserId); pStmt->SetParam(index++, nGroupType); pStmt->SetParam(index++, nMemberCnt); pStmt->SetParam(index++, nStatus); pStmt->SetParam(index++, nVersion); pStmt->SetParam(index++, nLastChat); pStmt->SetParam(index++, nCreated); pStmt->SetParam(index++, nCreated); bRet = pStmt->ExecuteUpdate(); if(bRet) { nGroupId = pStmt->GetInsertId(); } } delete pStmt; pDBManager->RelDBConn(pDBConn); } else { log("no db connection for dffxIMDB_master"); } return bRet; }
void CMessageModel::getMessageDays(uint32_t nUserId, uint32_t nPeerId, list<string>& lsDay) { uint32_t nRelateId = CRelationModel::getInstance()->getRelationId(nUserId, nPeerId, false); if (nRelateId != INVALID_VALUE) { CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("teamtalk_slave"); if (pDBConn) { string strTableName = "IMMessage_" + int2string(nRelateId % 8); string strSql = "select date_format(from_unixtime(created), '%Y-%m-%d') as day from " + strTableName + " where relateId = " + int2string(nRelateId) + " and status = 0 group by day order by day desc"; CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if (pResultSet) { while (pResultSet->Next()) { lsDay.push_back(pResultSet->GetString("day")); } delete pResultSet; } else { log("no result set: %s", strSql.c_str()); } pDBManager->RelDBConn(pDBConn); } else { log("no db connection for teamtalk_slave"); } } else { log("no relation between %lu and %lu", nUserId, nPeerId); } }
bool CGroupModel::insertNewMember(uint32_t nGroupId, set<uint32_t>& setUsers) { bool bRet = false; uint32_t nUserCnt = (uint32_t)setUsers.size(); if(nGroupId != INVALID_VALUE && nUserCnt > 0) { CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("dffxIMDB_slave"); if (pDBConn) { uint32_t nCreated = (uint32_t)time(NULL); // 获取 已经存在群里的用户 string strClause; bool bFirst = true; for (auto it=setUsers.begin(); it!=setUsers.end(); ++it) { if(bFirst) { bFirst = false; strClause = int2string(*it); } else { strClause += ("," + int2string(*it)); } } string strSql = "select userId from IMGroupMember where groupId=" + int2string(nGroupId) + " and userId in (" + strClause + ")"; CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); set<uint32_t> setHasUser; if(pResultSet) { while (pResultSet->Next()) { setHasUser.insert(pResultSet->GetInt("userId")); } pResultSet->Clear(); } else { log("no result for sql:%s", strSql.c_str()); } pDBManager->RelDBConn(pDBConn); pDBConn = pDBManager->GetDBConn("dffxIMDB_master"); if (pDBConn) { CacheManager* pCacheManager = CacheManager::getInstance(); CacheConn* pCacheConn = pCacheManager->GetCacheConn("group_member"); if (pCacheConn) { // 设置已经存在群中人的状态 if (!setHasUser.empty()) { strClause.clear(); bFirst = true; for (auto it=setHasUser.begin(); it!=setHasUser.end(); ++it) { if(bFirst) { bFirst = false; strClause = int2string(*it); } else { strClause += ("," + int2string(*it)); } } strSql = "update IMGroupMember set status=0, updated="+int2string(nCreated)+" where groupId=" + int2string(nGroupId) + " and userId in (" + strClause + ")"; pDBConn->ExecuteUpdate(strSql.c_str()); } strSql = "insert into IMGroupMember(`groupId`, `userId`, `status`, `created`, `updated`) values\ (?,?,?,?,?)"; //插入新成员 auto it = setUsers.begin(); uint32_t nStatus = 0; uint32_t nIncMemberCnt = 0; for (;it != setUsers.end();) { uint32_t nUserId = *it; if(setHasUser.find(nUserId) == setHasUser.end()) { CPrepareStatement* pStmt = new CPrepareStatement(); if (pStmt->Init(pDBConn->GetMysql(), strSql)) { uint32_t index = 0; pStmt->SetParam(index++, nGroupId); pStmt->SetParam(index++, nUserId); pStmt->SetParam(index++, nStatus); pStmt->SetParam(index++, nCreated); pStmt->SetParam(index++, nCreated); pStmt->ExecuteUpdate(); ++nIncMemberCnt; delete pStmt; } else { setUsers.erase(it++); delete pStmt; continue; } } ++it; } if(nIncMemberCnt != 0) { strSql = "update IMGroup set userCnt=userCnt+" + int2string(nIncMemberCnt) + " where id="+int2string(nGroupId); pDBConn->ExecuteUpdate(strSql.c_str()); } //更新一份到redis中 string strKey = "group_member_"+int2string(nGroupId); for(auto it = setUsers.begin(); it!=setUsers.end(); ++it) { pCacheConn->hset(strKey, int2string(*it), int2string(nCreated)); } pCacheManager->RelCacheConn(pCacheConn); bRet = true; } else { log("no cache connection"); } pDBManager->RelDBConn(pDBConn); } else {
void CGroupModel::getGroupInfo(map<uint32_t,IM::BaseDefine::GroupVersionInfo>& mapGroupId, list<IM::BaseDefine::GroupInfo>& lsGroupInfo) { if (!mapGroupId.empty()) { CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("dffxIMDB_slave"); if (pDBConn) { string strClause; bool bFirst = true; for(auto it=mapGroupId.begin(); it!=mapGroupId.end(); ++it) { if(bFirst) { bFirst = false; strClause = int2string(it->first); } else { strClause += ("," + int2string(it->first)); } } string strSql = "select * from IMGroup where id in (" + strClause + ") order by updated desc"; CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if(pResultSet) { while (pResultSet->Next()) { uint32_t nGroupId = pResultSet->GetInt("id"); uint32_t nVersion = pResultSet->GetInt("version"); if(mapGroupId[nGroupId].version() < nVersion) { IM::BaseDefine::GroupInfo cGroupInfo; cGroupInfo.set_group_id(nGroupId); cGroupInfo.set_version(nVersion); cGroupInfo.set_group_name(pResultSet->GetString("name")); cGroupInfo.set_group_avatar(pResultSet->GetString("avatar")); IM::BaseDefine::GroupType nGroupType = IM::BaseDefine::GroupType(pResultSet->GetInt("type")); if(IM::BaseDefine::GroupType_IsValid(nGroupType)) { cGroupInfo.set_group_type(nGroupType); cGroupInfo.set_group_creator_id(pResultSet->GetInt("creator")); lsGroupInfo.push_back(cGroupInfo); } else { log("invalid groupType. groupId=%u, groupType=%u", nGroupId, nGroupType); } } } pResultSet->Clear(); } else { log("no result set for sql:%s", strSql.c_str()); } pDBManager->RelDBConn(pDBConn); if(!lsGroupInfo.empty()) { fillGroupMember(lsGroupInfo); } } else { log("no db connection for dffxIMDB_slave"); } } else { log("no ids in map"); } }
std::string CCatPage::buildContent() const { CTemplateHelper* templateManager = CTemplateHelper::getInstance(); CDBManager* dbManager = CManagers::getInstance()->getDBManager(); std::shared_ptr<CDBRequest> dbRequest(dbManager->createDBRequest()); std::map<std::string, std::string> params; tmpString = ""; const CUser* user = dynamic_cast<const CUser*>(currRequest->getUser()); CConfigHelper* settingsManager = CConfigHelper::getInstance(); const CHTMLTemplate* contentTemplate = templateManager->findTemplate("content"); if(contentTemplate == NULL) return "Missing content template"; const CMenuCategory* currCategory = CMenu::getInstance()->findCategoryByName(getPageName()); if(currCategory == NULL) return "Cant find this category"; if(!user->getIsValid())return "User not valid"; const std::vector<int> threadsId = currCategory->getThreadsId(settingsManager->getIntParamValue("defaulThreadsCnt", 10)); const std::vector<int>* fixedThreadsId = user->getFixedThreads(); tmpString += "<input type='hidden' name='category_id' value='"; tmpString += valueToString(currCategory->getId()); tmpString += "' /> \n"; tmpString += "<input type='hidden' name='return_page' value='"; tmpString += getPageName(); tmpString += "' /> \n" ; tmpString += "<h1>/"; tmpString += htmlspecialchars(currCategory->getName()); tmpString += "/ — "; tmpString += htmlspecialchars(currCategory->getDescription()); tmpString += "</h1> \n"; if(currCategory->getThreadCreationAccessLevel() <= user->getUserType(currCategory->getId())) { tmpString += buildNewThreadForm(getPageName(), currCategory->getId(), user); tmpString += "\n"; } if(currCategory->getPostCreationAccessLevel() <= user->getUserType(currCategory->getId())) { tmpString += buildNewPostForm(getPageName(), user); tmpString += "\n"; } // GLOBAL FIXED THREADS int threadsCnt = 0; int hiddenthreadsCnt = 0; const CDBRequestResult* result = dbRequest->selectRequest(CDBValues("id"),"Threads", "`threadCatId` = "+valueToString(currCategory->getId())+" AND `isFixed` = 1"); if(dbRequest->getIsLastQuerySuccess() && result != NULL && result->getRowsCnt() > 0) { for(int i = 0; i < result->getRowsCnt(); i++) { int threadId = 0; threadId = result->getIntValue(i, 0); const CThread* currThread = new CThread(threadId); if(!currThread->getIsValid() || currThread->getIsHidden()) { if(currThread->getIsHidden()) hiddenthreadsCnt++; delete currThread; continue; } threadsCnt++; tmpString += buildThread(currThread, user); tmpString += "\n"; delete currThread; } } // USER FIXED THREADS for(unsigned int i = 0; i < fixedThreadsId->size(); i++) { const CThread* currThread = new CThread((*fixedThreadsId)[i]); if(!currThread->getIsValid() || currThread->getIsFixed() || currThread->getCatId() != currCategory->getId() || currThread->getIsHidden()) { delete currThread; continue; } threadsCnt++; tmpString += buildThread(currThread, user); tmpString += "\n"; delete currThread; } tmpString += "<br> \n"; // ALL OTHER THREADS int minThreadPosition = INT_MAX; for(unsigned int i = 0; i < threadsId.size(); i++) { const CThread* currThread = new CThread(threadsId[i]); if(currThread->getIsValid() && currThread->getIsHidden() && !currThread->getIsFixed()) hiddenthreadsCnt++; if(!currThread->getIsValid() || user->getIsThreadFixed(threadsId[i]) || currThread->getIsFixed() || currThread->getIsHidden()) { delete currThread; continue; } threadsCnt++; if(currThread->getPosition() < minThreadPosition) minThreadPosition = currThread->getPosition(); tmpString += buildThread(currThread, user); tmpString += "\n"; delete currThread; } tmpString += "<input type='hidden' name='all_threads_cnt' value='"; tmpString += valueToString(currCategory->getAllThreadsCnt() - hiddenthreadsCnt); tmpString += "' /> \n"; tmpString += "<input type='hidden' name='min_thread_pos' value='"; tmpString += valueToString(minThreadPosition); tmpString += "' /> \n"; tmpString += "<input type='hidden' id='thCnt' name='curr_threads_cnt' value='"; tmpString += valueToString(threadsCnt); tmpString += "' /> \n"; params["{LEFTPANEL}"] = buildLeftPanel(user); params["{UPMENU}"] = buildUpperMenu(user); params["{CONTENT}"] = tmpString; return contentTemplate->getHTMLData(¶ms); }
std::string CEditPage::buildContent() const { CTemplateHelper* templateManager = CTemplateHelper::getInstance(); std::map<std::string, std::string> params; std::string tmpStr = ""; const CUser* user = dynamic_cast<const CUser*>(currRequest->getUser()); if(!user->getIsValid() || !isValidId) return ""; const CHTMLTemplate* contentTemplate = templateManager->findTemplate("content"); const CHTMLTemplate* editPageTemplate = templateManager->findTemplate("editPage"); if(contentTemplate == NULL || editPageTemplate == NULL) return "Missing content template"; if(isThreadId) { const CThread* currThread = new CThread(id, false); if(!currThread->getIsValid() || (user->getUserId() != currThread->getUserId() && !user->getIsModerInAnyCategories())) { delete currThread; return ""; } params["{RETURNPAGE}"] = CMenu::getInstance()->findCategoryById(currThread->getCatId())->getName(); params["{EDITTYPE}"] = isThreadId ? "thread" : "post"; params["{ID}"] = idStr; params["{USERID}"] = valueToString(user->getUserId()); params["{TEXT}"] = currThread->getText(); params["{isHIDDEN}"] = currThread->getIsHidden() ? "true" : "false"; params["{isTHREAD}"] = "true"; //params["{ATTACHMENTS}"] = currThread->getAttachmentString(); tmpStr = editPageTemplate->getHTMLData(¶ms); delete currThread; } else { const CPost* currPost = new CPost(id); if(!currPost->getIsValid() || (user->getUserId() != currPost->getUserId() && !user->getIsModerInAnyCategories())) { delete currPost; return ""; } int catId = 0; CDBManager* dbManager = CManagers::getInstance()->getDBManager(); std::shared_ptr<CDBRequest> dbRequest(dbManager->createDBRequest()); const CDBRequestResult* result = dbRequest->selectRequest(CDBValues("threadCatId"), "Threads", "`id`="+valueToString(currPost->getThreadId()), "LIMIT 1"); //MYSQL_RES* result = DBRequest.createRequest("SELECT `threadCatId` FROM `Threads` WHERE `id`="+valueToString(currPost->getThreadId())+" LIMIT 1;"); if(dbRequest->getIsLastQuerySuccess() && result != NULL && result->getRowsCnt() > 0) { try{ catId = result->getIntValue(0,0); } catch(...){ catId = 0; } } const CMenuCategory* menuCat = CMenu::getInstance()->findCategoryById(catId); std::string returnPage = "index"; if(menuCat != NULL) returnPage = menuCat->getName(); params["{RETURNPAGE}"] = returnPage; params["{EDITTYPE}"] = isThreadId ? "thread" : "post"; params["{ID}"] = idStr; params["{USERID}"] = valueToString(user->getUserId()); params["{TEXT}"] = currPost->getText(); params["{isHIDDEN}"] = "false"; params["{isTHREAD}"] = "false"; //params["{ATTACHMENTS}"] = currPost->getAttachmentString(); tmpStr = editPageTemplate->getHTMLData(¶ms); delete currPost; } params.clear(); params["{LEFTPANEL}"] = buildLeftPanel(user); params["{UPMENU}"] = buildUpperMenu(user); params["{CONTENT}"] = tmpStr; return contentTemplate->getHTMLData(¶ms); }
/** * Called by libevent when there is data to read. */ void buffered_on_read(struct bufferevent *bev, void *arg) { client_t *client = (client_t *)arg; char data[BUF_MAX_SIZE] = { 0 }; int nbytes; nbytes = EVBUFFER_LENGTH(bev->input); evbuffer_remove(bev->input, data, nbytes); //解析data string sdata = data; printf("recv sdata : %s\n", sdata.c_str()); Json::Reader reader; Json::Value value, return_item; Json::FastWriter writer_item; if (reader.parse(sdata, value) && (!value["FunctionName"].isNull())) { CDBManager MyDB; MyDB.initDB("localhost", "root", "123456", "JiaTuanSql"); string sFunctionName = value["FunctionName"].asString(); if ("register" == sFunctionName) { if (MyDB.user_register_func(value["PhoneNO"].asString(), value["Pwd"].asString())) { return_item["error_code"] = 0; } else { return_item["error_code"] = -111; return_item["error_desc"] = "register failed,maybe user_login duplicate."; } } else if ("login" == sFunctionName) { if (MyDB.user_login_func(value["User_login"].asString(), value["User_pass"].asString())) { return_item["error_code"] = 0; } else { return_item["error_code"] = -121; return_item["error_desc"] = "login failed,maybe the account or password mistake."; } } } else { return_item["error_code"] = -11; return_item["error_desc"] = "Error:json data parse."; } sdata = writer_item.write(return_item); printf("send sdata : %s\n", sdata.c_str()); evbuffer_add(client->output_buffer, sdata.c_str(), sdata.size()); if (bufferevent_write_buffer(bev, client->output_buffer)) { errorOut("Error sending data to client on fd %d\n", client->fd); closeClient(client); } ///* Copy the data from the input buffer to the output buffer in 4096-byte chunks. //* There is a one-liner to do the whole thing in one shot, but the purpose of this server //* is to show actual real-world reading and writing of the input and output buffers, //* so we won't take that shortcut here. */ //while ((nbytes = EVBUFFER_LENGTH(bev->input)) > 0) { // /* Remove a chunk of data from the input buffer, copying it into our local array (data). */ // if (nbytes > 4096) nbytes = 4096; // evbuffer_remove(bev->input, data, nbytes); // /* Add the chunk of data from our local array (data) to the client's output buffer. */ // evbuffer_add(client->output_buffer, data, nbytes); //} ///* Send the results to the client. This actually only queues the results for sending. //* Sending will occur asynchronously, handled by libevent. */ //if (bufferevent_write_buffer(bev, client->output_buffer)) { // errorOut("Error sending data to client on fd %d\n", client->fd); // closeClient(client); //} }
int main(int argc, char* argv[]) { if ((argc == 2) && (strcmp(argv[1], "-v") == 0)) { cout << "HttpMsgServer " << endl; cout << "Server Build:" << __DATE__ << __TIME__ << endl; return ERR_SUCCESS; } signal(SIGPIPE, SIG_IGN); srand(time(NULL)); //日志类初始化 if (!Logger.Init(2000, 0, 0)){ cout <<"log init failed!!!"<< endl; return -1; } /* 设置打印级别 */ Logger.SetLogLevel(0x0040, true); Logger.Log(INFO, "The Server max files can open: %d ", getdtablesize()); CConfigFileReader* configFile = new CConfigFileReader("httpsvr.conf"); char* listenIp = configFile->GetConfigName("ListenIP"); char* strListenPort = configFile->GetConfigName("ListenPort"); char* strThreadNum = configFile->GetConfigName("ThreadNum"); //初始化数据库连接及管理类 CDBManager* pDBManager = CDBManager::getInstance(configFile); if (!pDBManager) { Logger.Log(ERROR, "DBManager init failed"); return ERR_FAILED; } pDBManager->Init(); if (!listenIp || !strListenPort) { Logger.Log(ERROR, "config file miss, exit "); return ERR_FAILED; } int ret = netlib_init(); if (ret == NETLIB_ERROR){ return ret; } uint16_t listenPort = atoi(strListenPort); CStrExplode listen_ip_list(listenIp, ';'); for (uint32_t i = 0; i < listen_ip_list.GetItemCnt(); i++) { ret = netlib_listen(listen_ip_list.GetItem(i), listenPort, HttpCallback, NULL); if (ret == NETLIB_ERROR) return ret; } cout << "server start listen on: " << listenIp << listenPort << endl; uint32_t threadNum = atoi(strThreadNum); InitHttpConn(threadNum);//初始化线程,增加心跳定时器 cout << "now enter the event loop!" << endl; writePid(); netlib_eventloop(); return 0; }
void CMessageModel::getMessageDuringTime(uint32_t nUserId, uint32_t nPeerId, uint32_t nStartTime, uint32_t nEndTime, uint32_t nOffset, uint32_t nCount, list<IM::BaseDefine::MsgInfo>& lsMsg) { uint32_t nRelateId = CRelationModel::getInstance()->getRelationId(nUserId, nPeerId, false); if (nRelateId != INVALID_VALUE) { CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("teamtalk_slave"); if (pDBConn) { string strTableName = "IMMessage_" + int2string(nRelateId % 8); string strSql; if (nCount == 0) { strSql = "select * from " + strTableName + " force index (idx_relateId_status_created) where relateId= " + int2string(nRelateId) + " and status = 0 and created >= " + int2string(nStartTime) + " and created <= " + int2string(nEndTime) + " order by created desc"; } else { strSql = "select * from " + strTableName + " force index (idx_relateId_status_created) where relateId= " + int2string(nRelateId) + " and status = 0 and created >= " + int2string(nStartTime) + " and created <= " + int2string(nEndTime) + " order by created desc limit " + int2string(nOffset) + "," + int2string(nCount); } CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if (pResultSet) { while (pResultSet->Next()) { IM::BaseDefine::MsgInfo cMsg; cMsg.set_msg_id(pResultSet->GetInt("msgId")); cMsg.set_from_session_id(pResultSet->GetInt("fromId")); cMsg.set_create_time(pResultSet->GetInt("created")); IM::BaseDefine::MsgType nMsgType = IM::BaseDefine::MsgType(pResultSet->GetInt("type")); if(IM::BaseDefine::MsgType_IsValid(nMsgType)) { cMsg.set_msg_type(nMsgType); cMsg.set_msg_data(pResultSet->GetString("content")); lsMsg.push_back(cMsg); } else { log("invalid msgType. userId=%u, peerId=%u, startTime=%u, endTime=%u, offset=%u, size=%u, msgType=%u, msgId=%u", nUserId, nPeerId, nStartTime, nEndTime, nOffset, nCount, nMsgType, pResultSet->GetInt("msgId")); } } delete pResultSet; } else { log("no result set: %s", strSql.c_str()); } pDBManager->RelDBConn(pDBConn); if (!lsMsg.empty()) { CAudioModel::getInstance()->readAudios(lsMsg); } } else { log("no db connection for teamtalk_slave"); } } else { log("no relation between %lu and %lu", nUserId, nPeerId); } }
void CMessageModel::getMsgByMsgId(uint32_t nUserId, uint32_t nPeerId, const list<uint32_t> &lsMsgId, list<IM::BaseDefine::MsgInfo> &lsMsg) { if(lsMsgId.empty()) { return ; } uint32_t nRelateId = CRelationModel::getInstance()->getRelationId(nUserId, nPeerId, false); if(nRelateId == INVALID_VALUE) { log("invalid relation id between %u and %u", nUserId, nPeerId); return; } CDBManager* pDBManager = CDBManager::getInstance(); CDBConn* pDBConn = pDBManager->GetDBConn("teamtalk_slave"); if (pDBConn) { string strTableName = "IMMessage_" + int2string(nRelateId % 8); string strClause ; bool bFirst = true; for(auto it= lsMsgId.begin(); it!=lsMsgId.end();++it) { if (bFirst) { bFirst = false; strClause = int2string(*it); } else { strClause += ("," + int2string(*it)); } } string strSql = "select * from " + strTableName + " where relateId=" + int2string(nRelateId) + " and status=0 and msgId in (" + strClause + ") order by created desc, id desc limit 100"; CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str()); if (pResultSet) { while (pResultSet->Next()) { IM::BaseDefine::MsgInfo msg; msg.set_msg_id(pResultSet->GetInt("msgId")); msg.set_from_session_id(pResultSet->GetInt("fromId")); msg.set_create_time(pResultSet->GetInt("created")); IM::BaseDefine::MsgType nMsgType = IM::BaseDefine::MsgType(pResultSet->GetInt("type")); if(IM::BaseDefine::MsgType_IsValid(nMsgType)) { msg.set_msg_type(nMsgType); msg.set_msg_data(pResultSet->GetString("content")); lsMsg.push_back(msg); } else { log("invalid msgType. userId=%u, peerId=%u, msgType=%u, msgId=%u", nUserId, nPeerId, nMsgType, msg.msg_id()); } } delete pResultSet; } else { log("no result set for sql:%s", strSql.c_str()); } pDBManager->RelDBConn(pDBConn); if(!lsMsg.empty()) { CAudioModel::getInstance()->readAudios(lsMsg); } } else { log("no db connection for teamtalk_slave"); } }