Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef DBADAPTER_H
- #define DBADAPTER_H
- #include <vector>
- #include <set>
- #include <mutex>
- using namespace std;
- struct Message {
- int32_t user_id;
- int32_t room_id;
- char *text;
- int64_t time;
- char *theme;
- bool read;
- };
- struct User {
- int32_t id;
- char *login;
- char *password;
- set<int32_t> rooms;
- };
- struct Room {
- int32_t id;
- char *name;
- set<int32_t> users;
- vector<Message*> messages;
- };
- class DBAdapter {
- vector<User> users;
- vector<Room> rooms;
- recursive_mutex lock;
- set<int32_t> *empty_set;
- public:
- DBAdapter() {
- empty_set = new set<int32_t>;
- }
- ~DBAdapter() {
- delete empty_set;
- }
- bool open();
- void close();
- bool is_user_exist(int32_t user_id);
- bool is_user_exist(char *login);
- bool is_room_exist(int32_t room_id);
- int32_t register_user(char *login, char *password);
- int32_t register_room(char *name);
- int32_t register_message(Message *message);
- //int32_t register_image(Image *image);
- void change_user_password(int32_t user_id, char *new_password);
- void change_room_name(int32_t room_id, char *new_name);
- char* get_user_login(int32_t user_id);
- int32_t get_user_id(char *login);
- char* get_room_name(int32_t room_id);
- bool check_user(char *login, char *password);
- set<int32_t>* get_user_rooms(int32_t user_id);
- set<int32_t>* get_users_in_room(int32_t room_id);
- bool is_user_in_room(int32_t user_id, int32_t room_id);
- void add_user_to_room(int32_t user_id, int32_t room_id);
- int32_t get_messages_in_room(int32_t room_id/*, ??filter??*/);
- Message* get_message(int32_t room_id, int32_t message_id);
- //int32_t get_image_room(int32_t image_id);
- void mark_message(int32_t room_id, int32_t message_id);
- };
- #endif //DBADAPTER_H
- bool DBAdapter::is_user_exist(int32_t user_id) {
- bool b;
- lock.lock();
- b = users.size() < user_id;
- lock.unlock();
- return b;
- }
- bool DBAdapter::is_user_exist(char *login) {
- bool b;
- lock.lock();
- b = get_user_id(login) != -1;
- lock.unlock();
- return b;
- }
- bool DBAdapter::is_room_exist(int32_t room_id) {
- bool b;
- lock.lock();
- b = rooms.size() < room_id;
- lock.unlock();
- return b;
- }
- int32_t DBAdapter::register_user(char *login, char *password) {
- int32_t user_id = -1;
- lock.lock();
- if (!is_user_exist(login)) {
- user_id = (int32_t)users.size();
- User user = {user_id, login, password};
- users.push_back(user);
- }
- lock.unlock();
- return user_id;
- }
- int32_t DBAdapter::register_room(char *name) {
- lock.lock();
- int32_t room_id = (int32_t)rooms.size();
- Room room = {room_id, name};
- rooms.push_back(room);
- lock.unlock();
- return room_id;
- }
- int32_t DBAdapter::register_message(Message *message) {
- int32_t id = -1;
- lock.lock();
- if (is_user_exist(message->user_id) && is_room_exist(message->room_id)) {
- id = (int32_t)rooms[message->room_id].messages.size();
- rooms[message->room_id].messages.push_back(message);
- }
- lock.unlock();
- return id;
- }
- void DBAdapter::change_user_password(int32_t user_id, char *new_password) {
- lock.lock();
- if (is_user_exist(user_id)) {
- delete[] users[user_id].password;
- users[user_id].password = new_password;
- }
- lock.unlock();
- }
- void DBAdapter::change_room_name(int32_t room_id, char *new_name) {
- lock.lock();
- if (is_room_exist(room_id)) {
- delete[] rooms[room_id].name;
- rooms[room_id].name = new_name;
- }
- lock.unlock();
- }
- char* DBAdapter::get_user_login(int32_t user_id) {
- char *login = NULL;
- lock.lock();
- if (is_user_exist(user_id)) {
- login = users[user_id].login;
- }
- lock.unlock();
- return login;
- }
- int32_t DBAdapter::get_user_id(char *login) {
- int32_t id = -1;
- lock.lock();
- for (auto i = users.begin(); i != users.end(); i++) {
- if (strcmp(i->login, login) == 0) {
- id = i->id;
- break;
- }
- }
- lock.unlock();
- return id;
- }
- char* DBAdapter::get_room_name(int32_t room_id) {
- char *name = NULL;
- lock.lock();
- if (is_room_exist(room_id)) {
- name = rooms[room_id].name;
- }
- lock.unlock();
- return name;
- }
- bool DBAdapter::check_user(char *login, char *password) {
- bool b;
- lock.lock();
- b = is_user_exist(login) && strcmp(users[get_user_id(login)].password, password) == 0;
- lock.unlock();
- return b;
- }
- set<int32_t>* DBAdapter::get_user_rooms(int32_t user_id) {
- set<int32_t> *result = empty_set;
- lock.lock();
- if (is_user_exist(user_id)) {
- result = &users[user_id].rooms;
- }
- lock.unlock();
- return result;
- }
- set<int32_t>* DBAdapter::get_users_in_room(int32_t room_id) {
- set<int32_t> *result = empty_set;
- lock.lock();
- if (is_room_exist(room_id)) {
- result = &rooms[room_id].users;
- }
- lock.unlock();
- return result;
- }
- bool DBAdapter::is_user_in_room(int32_t user_id, int32_t room_id) {
- bool b = false;
- lock.lock();
- if (is_user_exist(user_id) && is_room_exist(room_id)) {
- auto u = rooms[room_id].users;
- auto r = users[user_id].rooms;
- b = r.size() < u.size() ? r.find(room_id) != r.end() : u.find(user_id) != u.end();
- }
- lock.unlock();
- return b;
- }
- void DBAdapter::add_user_to_room(int32_t user_id, int32_t room_id) {
- lock.lock();
- if (is_user_exist(user_id) && is_room_exist(room_id)) {
- rooms[room_id].users.insert(user_id);
- users[user_id].rooms.insert(room_id);
- }
- lock.unlock();
- }
- int32_t DBAdapter::get_messages_in_room(int32_t room_id/*, ??filter??*/) {
- int32_t result = 0;
- lock.lock();
- if (is_room_exist(room_id)) {
- result = (int32_t)rooms[room_id].messages.size();
- }
- lock.unlock();
- return result;
- }
- Message* DBAdapter::get_message(int32_t room_id, int32_t message_id) {
- Message *result = NULL;
- lock.lock();
- result = rooms[room_id].messages[message_id];
- lock.unlock();
- return result;
- }
- void DBAdapter::mark_message(int32_t room_id, int32_t message_id) {
- lock.lock();
- if (is_room_exist(room_id) && get_messages_in_room(room_id) > message_id) {
- rooms[room_id].messages[message_id]->read = true;
- }
- lock.unlock();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement