예제 #1
0
/**
 *  同步群组聊天信息
 *
 *  @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;
}
예제 #2
0
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(&params);
	params.clear();

	params["{LEFTPANEL}"] 	= buildLeftPanel(user);
	params["{UPMENU}"] 		= buildUpperMenu(user);
	params["{CONTENT}"] 	= tmpString;

	return contentTemplate->getHTMLData(&params);
}
예제 #5
0
파일: Main.cpp 프로젝트: adi97ida/Server
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;
}
예제 #6
0
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;
}
예제 #7
0
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");
}
예제 #8
0
/*
 * 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;
}
예제 #9
0
/**
 *  <#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);
    }
}
예제 #10
0
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);
	}
}
예제 #11
0
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;
}
예제 #12
0
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;
}
예제 #13
0
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);
    }
}
예제 #14
0
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
            {
예제 #15
0
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");
    }
}
예제 #16
0
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 += "/ &mdash; ";
	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(&params);
}
예제 #17
0
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(&params);

		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(&params);

		delete currPost;
	}

	params.clear();

	params["{LEFTPANEL}"] 	= buildLeftPanel(user);
	params["{UPMENU}"] 		= buildUpperMenu(user);
	params["{CONTENT}"] 	= tmpStr;

	return contentTemplate->getHTMLData(&params);
}
예제 #18
0
/**
* 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);
	//}
}
예제 #19
0
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;
}
예제 #20
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);
    }
}
예제 #21
0
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");
    }
}