// // Created by dongl on 23-5-4. // #include "linkDB.h" #include "UserFriendsDB.h" // 查询好友添加权限类型 char UserFriendsDB::select_add_type(uint64_t account) { conn = LinkDB::safe_grab(); auto query = conn->query("select restrictions from im_user_friends where account=%0:account"); query.parse(); // 查看添加授权类型 0 直接添加 1 验证问题 2 账户审核 auto ret = query.store(account)[0][0][0]; // 因为 account 唯一 所以结果 至多一个 // 放回链接 LinkDB::release(conn); return ret; } // 搜索好友 搜索用户 std::optional UserFriendsDB::select_user(uint64_t account) { conn = LinkDB::safe_grab(); auto query = conn->query("select * from im_user where account=%1:account"); query.template_defaults[1] = account; query.parse(); PoUser user; auto ret = query.store(); for (const auto &row : ret) { user.account = strtol(row[0].c_str(), nullptr, 0); user.phone = strtol(row[1].c_str(), nullptr, 0); user.email = row[2].c_str(); user.username = row[3].c_str(); user.password = row[4].c_str(); user.password_salt = row[5].c_str(); user.client_info = row[6].c_str(); } // 放回链接 LinkDB::release(conn); if (ret.num_rows() < 1) { return std::nullopt; } return user; } /** * 查询 friend_key 是否 在 account内 * @param account * @param friend_key * @return */ bool UserFriendsDB::select_friend(uint64_t account, uint64_t friend_key) { conn = LinkDB::safe_grab(); auto query = conn->query("select json_extract(friends, '$.\"%2:friend_key\"') from im_user_friends where account=%1:account"); query.template_defaults[1] = account; query.template_defaults[2] = friend_key; query.parse(); auto ret = query.store(); // 放回链接 LinkDB::release(conn); if (ret[0][0] == "NULL") { return false; } return true; } // 修改好友列表数据 添加好友 /// friends :{ /// uid :info { } /// } std::tuple UserFriendsDB::add_friends(uint64_t account, uint64_t friends) { conn = LinkDB::safe_grab(); auto q = conn->query("select username from im_user where account=%1:account"); q.template_defaults[1] = friends; q.parse(); auto username = q.store(); if (username.num_rows() < 1) { LinkDB::release(conn); return {false, "未查询到账户"}; } std::string name = username[0][0].c_str(); auto query = conn->query("update im_user_friends set friends =" "JSON_SET(friends, '$.\"%2:friends\"', " "JSON_OBJECT('username', '%3:username', 'belong_grouping', 1, 'add_time', 10000, 'add_source', 1)" ")" "where account=%1:account"); query.template_defaults[1] = account; query.template_defaults[2] = friends; query.template_defaults[3] = name.c_str(); query.parse(); auto ret = query.exec(); // 放回链接 LinkDB::release(conn); return {ret, "添加失败"}; } void UserFriendsDB::insert_friends_to_be_added(uint64_t account, uint64_t friends) { conn = LinkDB::safe_grab(); // 放回链接 LinkDB::release(conn); } std::optional UserFriendsDB::select_friends_all(uint64_t account) { conn = LinkDB::safe_grab(); auto q = conn->query("select friends from im_user_friends where account=%0:account"); q.parse(); auto ret = q.store(account); if (ret.num_rows() < 1) { return std::nullopt; } std::string friends; ret[0][0].to_string(friends); // for (auto mem = document.MemberBegin(); mem != document.MemberEnd(); ++mem) { // mem->name; // } // 放回链接 LinkDB::release(conn); return friends; } std::optional UserFriendsDB::select_friends_all_json(uint64_t account) { auto temp = select_friends_all(account); rapidjson::Document document; if (temp.has_value()) { document.Parse(temp.value().c_str()); return document; } else { return std::nullopt; } } std::optional UserFriendsDB::select_friends_info(uint64_t account, uint64_t friends) { conn = LinkDB::safe_grab(); auto q = conn->query("select JSON_EXTRACT(friends, '$.\"%2:friends\"') as friend_info " "from im_user_friends where account=%1:account"); q.template_defaults[1] = account; q.template_defaults[2] = friends; q.parse(); // 查库 auto ret = q.store(); printf("%zu\n", ret.num_rows()); if (ret.num_rows() < 1) { return std::nullopt; } // 取json字符串 std::string friend_info; ret[0][0].to_string(friend_info); // 解析json rapidjson::Document document; document.Parse(friend_info.c_str()); // 放回链接 LinkDB::release(conn); return document; }