通信
4.服务器链表设计
下:主要实现了获取每个群的成员,并且存到链表里
chat_databases.h .cpp
class ChatDataBases
{
void my_database_get_group_member(const std::string groupName, std::string &member); //第一个参数群名,第二个是获取到的member数据
};
*****************************************
void ChatDataBases::my_database_get_group_member(const std::string groupName, std::string &member)
{
//这里封装一下sql语句,因为要根据传进来的参数进行执行
char sql[1024] = {0};
sprintf(sql,"select member from %s;",groupName.c_str()); //sprintf接收的是char *
if (mysql_query(mysql,sql) != 0 )
{
std::cout << "mysql_query error " << std::endl;
}
MYSQL_RES *res = mysql_store_result(mysql);
if (!res)
{
std::cout << "mysql_store_result error" << std::endl;
}
//查询出来下面的结果,只有一行数据,直接存起来就行
/*
mysql> select member from 学习交流群1 ;
+-----------------------------+
| member |
+-----------------------------+
| 肥猪|狗杰|比凯|莎边 |
+-----------------------------+
*/
MYSQL_ROW row = mysql_fetch_row(res);
if (row[0]) //将 row[0] 的值拼接到 member 字符串时,如果 row[0] 的值为 NULL,那么程序会崩溃。在执行拼接之前先判断一下
{
member += row[0];
}
}
chatlist.cpp
ChatInfo::ChatInfo()
{
onlineUser = new std::list<User>; //空
group_info = new std::list<Group>; //群
//往group_info链表里添加群信息
//这里需要数据库的保存的群信息,所以要先创建好操作数据库的文件chat_databases
//操作数据库
mydatabase = new ChatDataBases();
mydatabase->my_database_connect("chatgroup"); //连接
std::string group_name[MAXGROUPNUM];
int groupNum = mydatabase->my_database_get_group_name(group_name);
//测试
// std::cout << "群组数量为:" << groupNum << std::endl;
// for (size_t i = 0; i < groupNum; ++i)
// {
// std::cout << "群名" << i<< ": " << group_name[i] << std::endl;
// }
//一个群就是一个节点
for (size_t i = 0; i < groupNum; i++)
{
Group eachGroup;
eachGroup.name = group_name[i];
eachGroup.memberList = new std::list<GroupUser>; //成员列表
//这里需要查询数据库,去查到每个群的群成员是什么 就是chatgroup的member字段的数据
//然后添加到memberList链表当中
std::string member; //接收member字段的数据 这样的格式:肥猪|狗杰|比凯|莎边
mydatabase->my_database_get_group_member(group_name[i], member);
//测试
// std::cout << member << std::endl;
//这里解析 肥猪|狗杰|比凯|莎边 然后存储 使用stl
//1.创建一个字符串流对象,用于分割字符串
std::stringstream smember(member);
//2.分割下来的字符串用这个来存
std::string element;
//3.分割
while (std::getline(smember, element, '|')) //流入的字符串对象
{
GroupUser groupMemberName;
groupMemberName.name = element;
eachGroup.memberList->push_back(groupMemberName);
//测试
//std::cout << element << std::endl;
}
group_info->push_back(eachGroup);
}
//测试所有数据 打印群名字 后面是每个群的群成员
// for(const auto& elem : *group_info)
// {
// std::cout <<"群名:" << elem.name << std::endl;
// std::cout << "成员:";
// for(const auto& selem : *elem.memberList)
// {
// std::cout<< selem.name << " ";
// }
// std::cout << std::endl;
// }
std::cout <<"链表初始化成功\n"<< std::endl;
}