/
AirLexa
/
05
Обзор
Документация
Войти
/
AirLexa
/
05
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_05/ClientManager.cpp
250 строк
8 KB
AirLexa
update: ClientManager.cpp
03 май 2026, 06:55
Верифицирован
03 май 2026, 06:55
d2ab915
Код
Авторство
О чём код?
#include "ClientManager.h" #include <iostream> using namespace std; using namespace pqxx; // подключение к БД ClientManager::ClientManager(const string& dbname, const string& user, const string& password, const string& host, int port) { try { string conn_str = "dbname=" + dbname + " user=" + user + " password=" + password + " host=" + host + " port=" + to_string(port); conn = new connection(conn_str); if (conn->is_open()) { cout << "Подключение к БД успешно!" << endl; } else { cout << "Не удалось подключиться к БД." << endl; } } catch (const exception& e) { cerr << "Ошибка подключения: " << e.what() << endl; conn = nullptr; } } ClientManager::~ClientManager() { if (conn != nullptr && conn->is_open()) { conn->close(); delete conn; } } // Создание таблиц void ClientManager::createTables() { if (!isConnected()) { throw runtime_error("Нет подключения к базе данных"); } work txn(*conn); txn.exec( "CREATE TABLE IF NOT EXISTS clients (" "client_id SERIAL PRIMARY KEY, " "first_name VARCHAR(50) NOT NULL, " "last_name VARCHAR(50) NOT NULL, " "email VARCHAR(100) UNIQUE NOT NULL);" ); txn.exec( "CREATE TABLE IF NOT EXISTS phones (" "phone_id SERIAL PRIMARY KEY, " "client_id INT REFERENCES clients(client_id) ON DELETE CASCADE, " "phone_number VARCHAR(20) UNIQUE NOT NULL);" ); txn.commit(); cout << "Таблицы успешно созданы." << endl; } // Добавление нового клиента bool ClientManager::addClient(const string& firstName, const string& lastName, const string& email) { if (!isConnected()) return false; try { work txn(*conn); txn.exec_params( "INSERT INTO clients (first_name, last_name, email) VALUES ($1, $2, $3);", firstName, lastName, email ); txn.commit(); cout << "Клиент добавлен." << endl; return true; } catch (const exception& e) { cerr << "Ошибка добавления клиента: " << e.what() << endl; return false; } } // Добавление телефона существующему клиенту bool ClientManager::addPhone(int clientId, const string& phoneNumber) { if (!isConnected()) return false; try { work txn(*conn); txn.exec_params( "INSERT INTO phones (client_id, phone_number) VALUES ($1, $2);", clientId, phoneNumber ); txn.commit(); cout << "Телефон добавлен." << endl; return true; } catch (const exception& e) { cerr << "Ошибка добавления телефона: " << e.what() << endl; return false; } } // Изменение данных клиента bool ClientManager::updateClient(int clientId, const string& firstName, const string& lastName, const string& email) { if (!isConnected()) return false; try { work txn(*conn); txn.exec_params( "UPDATE clients SET first_name = $1, last_name = $2, email = $3 WHERE client_id = $4;", firstName, lastName, email, clientId ); txn.commit(); cout << "Данные клиента обновлены." << endl; return true; } catch (const exception& e) { cerr << "Ошибка обновления клиента: " << e.what() << endl; return false; } } // Удаление телефона у клиента bool ClientManager::deletePhone(const string& phoneNumber) { if (!isConnected()) return false; try { work txn(*conn); txn.exec_params("DELETE FROM phones WHERE phone_number = $1;", phoneNumber); txn.commit(); cout << "Телефон удалён." << endl; return true; } catch (const exception& e) { cerr << "Ошибка удаления телефона: " << e.what() << endl; return false; } } // Удаление клиента bool ClientManager::deleteClient(int clientId) { if (!isConnected()) return false; try { work txn(*conn); txn.exec_params("DELETE FROM clients WHERE client_id = $1;", clientId); txn.commit(); cout << "Клиент удалён." << endl; return true; } catch (const exception& e) { cerr << "Ошибка удаления клиента: " << e.what() << endl; return false; } } // Поиск клиента по данным - возвращает вектор данных о клиентах vector<ClientData> ClientManager::searchClient(const string& query) { vector<ClientData> results; if (!isConnected()) { throw runtime_error("Нет подключения к базе данных"); } try { work txn(*conn); // Поиск клиентов по критериям result res = txn.exec_params( "SELECT DISTINCT c.client_id, c.first_name, c.last_name, c.email " "FROM clients c " "LEFT JOIN phones p ON c.client_id = p.client_id " "WHERE c.first_name ILIKE $1 " "OR c.last_name ILIKE $1 " "OR c.email ILIKE $1 " "OR p.phone_number LIKE $1;", "%" + query + "%" ); for (auto row : res) { ClientData client; client.id = row["client_id"].as<int>(); client.firstName = row["first_name"].as<string>(); client.lastName = row["last_name"].as<string>(); client.email = row["email"].as<string>(); // Получаем телефоны клиента result phones = txn.exec_params( "SELECT phone_number FROM phones WHERE client_id = $1;", client.id ); for (auto ph : phones) { client.phones.push_back(ph["phone_number"].as<string>()); } results.push_back(client); } txn.commit(); } catch (const exception& e) { throw runtime_error(string("Ошибка поиска: ") + e.what()); } return results; } // получение клиента по ID ClientData ClientManager::getClientById(int clientId) { ClientData result; result.id = -1; if (!isConnected()) { throw runtime_error("Нет подключения к базе данных"); } try { work txn(*conn); // Получаем данные клиента pqxx::result res = txn.exec_params( "SELECT client_id, first_name, last_name, email FROM clients WHERE client_id = $1;", clientId ); if (res.empty()) { throw runtime_error("Клиент с ID " + to_string(clientId) + " не найден"); } auto row = res[0]; result.id = row["client_id"].as<int>(); result.firstName = row["first_name"].as<string>(); result.lastName = row["last_name"].as<string>(); result.email = row["email"].as<string>(); // Получаем телефоны pqxx::result phonesRes = txn.exec_params( "SELECT phone_number FROM phones WHERE client_id = $1;", clientId ); for (auto ph : phonesRes) { result.phones.push_back(ph["phone_number"].as<string>()); } txn.commit(); } catch (const exception& e) { throw runtime_error(string("Ошибка получения клиента: ") + e.what()); } return result; }