/
AirLexa
/
05
Обзор
Документация
Войти
/
AirLexa
/
05
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_06/main.cpp
200 строк
6 KB
AirLexa
create: CMakeLists.txt, CMakePresets.json, main.cpp, models.h
03 май 2026, 07:11
Верифицирован
03 май 2026, 07:11
9240663
Код
Авторство
О чём код?
#include <iostream> #include <string> #include <set> #include <stdexcept> #include <windows.h> #include <Wt/Dbo/Dbo.h> #include <Wt/Dbo/backend/Postgres.h> #include "models.h" namespace dbo = Wt::Dbo; void populate(dbo::Session& session) { dbo::Transaction t(session); auto pub1 = session.add(std::make_unique<Publisher>()); pub1.modify()->name = "Питер"; auto pub2 = session.add(std::make_unique<Publisher>()); pub2.modify()->name = "O'Reilly"; auto pub3 = session.add(std::make_unique<Publisher>()); pub3.modify()->name = "Manning"; auto book1 = session.add(std::make_unique<Book>()); book1.modify()->title = "Программируем на C++"; book1.modify()->publisher = pub1; auto book2 = session.add(std::make_unique<Book>()); book2.modify()->title = "Learning SQL"; book2.modify()->publisher = pub2; auto book3 = session.add(std::make_unique<Book>()); book3.modify()->title = "C++ in Action"; book3.modify()->publisher = pub3; auto book4 = session.add(std::make_unique<Book>()); book4.modify()->title = "Python Cookbook"; book4.modify()->publisher = pub2; auto shop1 = session.add(std::make_unique<Shop>()); shop1.modify()->name = "Книжный мир"; auto shop2 = session.add(std::make_unique<Shop>()); shop2.modify()->name = "ТехноБук"; auto shop3 = session.add(std::make_unique<Shop>()); shop3.modify()->name = "ПитерБук"; auto st1 = session.add(std::make_unique<Stock>()); st1.modify()->book = book1; st1.modify()->shop = shop1; st1.modify()->count = 15; auto st2 = session.add(std::make_unique<Stock>()); st2.modify()->book = book1; st2.modify()->shop = shop2; st2.modify()->count = 8; auto st3 = session.add(std::make_unique<Stock>()); st3.modify()->book = book2; st3.modify()->shop = shop3; st3.modify()->count = 20; auto st4 = session.add(std::make_unique<Stock>()); st4.modify()->book = book2; st4.modify()->shop = shop1; st4.modify()->count = 5; auto st5 = session.add(std::make_unique<Stock>()); st5.modify()->book = book3; st5.modify()->shop = shop2; st5.modify()->count = 12; auto st6 = session.add(std::make_unique<Stock>()); st6.modify()->book = book4; st6.modify()->shop = shop1; st6.modify()->count = 30; auto st7 = session.add(std::make_unique<Stock>()); st7.modify()->book = book4; st7.modify()->shop = shop2; st7.modify()->count = 25; auto st8 = session.add(std::make_unique<Stock>()); st8.modify()->book = book4; st8.modify()->shop = shop3; st8.modify()->count = 18; auto sale1 = session.add(std::make_unique<Sale>()); sale1.modify()->price = 850.0; sale1.modify()->date_sale = "2024-01-10"; sale1.modify()->count = 2; sale1.modify()->stock = st1; auto sale2 = session.add(std::make_unique<Sale>()); sale2.modify()->price = 1200.0; sale2.modify()->date_sale = "2024-02-15"; sale2.modify()->count = 1; sale2.modify()->stock = st3; auto sale3 = session.add(std::make_unique<Sale>()); sale3.modify()->price = 999.0; sale3.modify()->date_sale = "2024-03-01"; sale3.modify()->count = 3; sale3.modify()->stock = st6; t.commit(); std::cout << "[OK] Тестовые данные успешно добавлены.\n"; } void find_shops_by_publisher(dbo::Session& session, const std::string& query) { dbo::Transaction t(session); dbo::ptr<Publisher> pub; bool is_numeric = !query.empty() && query.find_first_not_of("0123456789") == std::string::npos; if (is_numeric) { long long id = std::stoll(query); pub = session.find<Publisher>().where("id = ?").bind(id).resultValue(); } else { pub = session.find<Publisher>() .where("name = ?").bind(query) .resultValue(); } if (!pub) { std::cout << "Издатель \"" << query << "\" не найден.\n"; return; } std::cout << "\nИздатель: " << pub->name << "\n"; std::cout << "Магазины, продающие его книги:\n"; std::cout << std::string(40, '-') << "\n"; std::set<std::string> seen; bool found = false; for (const auto& book : pub->books) { for (const auto& stock : book->stocks) { std::string shop_name = stock->shop->name; if (seen.insert(shop_name).second) { std::cout << " • " << shop_name << "\n"; found = true; } } } if (!found) { std::cout << " (нет магазинов с книгами этого издателя)\n"; } t.commit(); } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); const std::string conn_str = "host=localhost port=5432 dbname=bookstore user=postgres password=secret"; try { auto postgres = std::make_unique<dbo::backend::Postgres>(conn_str); dbo::Session session; session.setConnection(std::move(postgres)); session.mapClass<Publisher>("publisher"); session.mapClass<Book> ("book"); session.mapClass<Shop> ("shop"); session.mapClass<Stock> ("stock"); session.mapClass<Sale> ("sale"); try { session.createTables(); std::cout << "[OK] Таблицы созданы.\n"; populate(session); } catch (const std::exception& e) { std::cout << "[INFO] Таблицы уже существуют, пропускаем создание.\n"; } std::cout << "\nВведите имя или id издателя: "; std::string input; std::getline(std::cin, input); if (!input.empty()) { find_shops_by_publisher(session, input); } } catch (const std::exception& e) { std::cerr << "[ERROR] " << e.what() << "\n"; return 1; } return 0; }