#include "mysql.hpp" #include "user.hxx" #include "user-odb.hxx" namespace bite_im { class UserTable { public: using ptr = std::shared_ptr; UserTable(const std::shared_ptr &db):_db(db){} bool insert(const std::shared_ptr &user) { try { odb::transaction trans(_db->begin()); _db->persist(*user); trans.commit(); }catch (std::exception &e) { LOG_ERROR("新增用户失败 {}:{}!", user->nickname(),e.what()); return false; } return true; } bool update(const std::shared_ptr &user) { try { odb::transaction trans(_db->begin()); _db->update(*user); trans.commit(); }catch (std::exception &e) { LOG_ERROR("更新用户失败 {}:{}!", user->nickname(), e.what()); return false; } return true; } std::shared_ptr select_by_nickname(const std::string &nickname) { std::shared_ptr res; try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; res.reset(_db->query_one(query::nickname == nickname)); trans.commit(); }catch (std::exception &e) { LOG_ERROR("通过昵称查询用户失败 {}:{}!", nickname, e.what()); } return res; } std::shared_ptr select_by_phone(const std::string &phone) { std::shared_ptr res; try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; res.reset(_db->query_one(query::phone == phone)); trans.commit(); }catch (std::exception &e) { LOG_ERROR("通过手机号查询用户失败 {}:{}!", phone, e.what()); } return res; } std::shared_ptr select_by_id(const std::string &user_id) { std::shared_ptr res; try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; res.reset(_db->query_one(query::user_id == user_id)); trans.commit(); }catch (std::exception &e) { LOG_ERROR("通过用户ID查询用户失败 {}:{}!", user_id, e.what()); } return res; } std::vector select_multi_users(const std::vector &id_list) { // select * from user where id in ('id1', 'id2', ...) if (id_list.empty()) { return std::vector(); } std::vector res; try { odb::transaction trans(_db->begin()); typedef odb::query query; typedef odb::result result; std::stringstream ss; ss << "user_id in ("; for (const auto &id : id_list) { ss << "'" << id << "',"; } std::string condition = ss.str(); condition.pop_back(); condition += ")"; result r(_db->query(condition)); for (result::iterator i(r.begin()); i != r.end(); ++i) { res.push_back(*i); } trans.commit(); }catch (std::exception &e) { LOG_ERROR("通过用户ID批量查询用户失败:{}!", e.what()); } return res; } private: std::shared_ptr _db; }; }