196 lines
5.0 KiB
C++
196 lines
5.0 KiB
C++
//
|
||
// 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<PoUser> 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<bool, std::string> 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<std::string> 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<rapidjson::Document> 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<rapidjson::Document>
|
||
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;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|