add: db ! not connect

This commit is contained in:
Trumpet Cynthia 2025-03-05 16:38:01 +03:00
parent e1c8ce23c5
commit 28b55a0e21
6 changed files with 166 additions and 48 deletions

View File

@ -13,6 +13,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -O2")
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Sql)
set(MAIN_SOURCES
main.cpp
@ -37,6 +38,9 @@ set(MAIN_SOURCES
view/ui/printer_settings.ui
view/ui/updates.ui
view/ui/add_preset.ui
logic/printer_db.cpp
logic/printer_db.h
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
@ -50,13 +54,20 @@ else()
)
endif()
qt_add_resources(Calc3D "app_resources"
PREFIX "/"
FILES
view/resources.qrc
)
# qt_add_resources(Calc3D "app_resources"
# PREFIX "/"
# FILES
# view/resources.qrc
# )
target_link_libraries(Calc3D PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Core)
target_link_libraries(Calc3D PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Sql)
# путь к бд в проекте, опционально
# configure_file(
# ${CMAKE_CURRENT_SOURCE_DIR}/printers.db
# ${CMAKE_CURRENT_BINARY_DIR}/printers.db
# COPYONLY
# )
set_target_properties(Calc3D PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com

View File

@ -1,23 +0,0 @@
#pragma once
#include <memory>
#include "../model/facade.h"
class Controller {
public:
Controller(const Controller &other) = delete;
Controller(Controller &&other) = delete;
void operator=(const Controller &other) = delete;
~Controller() = default;
static std::shared_ptr<Controller> GetInstance() {
static auto instance = std::shared_ptr<Controller>(new Controller);
return instance;
}
private:
std::shared_ptr<Facade> facade;
Controller() { facade_ = s21::Facade::GetInstance(); }
};

48
src/logic/facade.h Normal file
View File

@ -0,0 +1,48 @@
#pragma once
#include <memory>
#include "printer_db.h"
class Facade {
public:
Facade(const Facade &other) = delete;
Facade(Facade &&other) = delete;
void operator=(const Facade &other) = delete;
~Facade() = default;
static std::shared_ptr<Facade> GetInstance() {
static auto instance = std::shared_ptr<Facade>(new Facade);
return instance;
}
bool addPrinter(const QString &name, double power, int age, double cost) {
return db.addPrinter(name, power, age, cost);
}
QList<QString> getPrinterList() { return db.getPrinterList(); }
bool deletePrinterByName(const QString &name) {
return db.deletePrinterByName(name);
}
bool Database::updatePrinter(const QString &name,
const QHash<QString, QVariant> &updates) {
return db.updatePrinter(name, updates);
}
private:
Database db;
Facade() {
//! TODO create if doesn't exist
QString dbPath =
QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) +
"/printers.db"; //! TODO name!
db(dbPath);
if (!db.init()) {
qFatal("Database initialization failed!");
// TODO make exc
}
}
};

83
src/logic/printer_db.cpp Normal file
View File

@ -0,0 +1,83 @@
#include "printer_db.h"
Database::Database(const QString &path) {
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(path);
}
bool Database::init() {
if (!db.open()) {
qWarning() << "Error opening database:" << db.lastError();
// TODO return ERROR
return false;
}
QSqlQuery query;
return query.exec(
"CREATE TABLE IF NOT EXISTS printers ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name TEXT NOT NULL UNIQUE,"
"power REAL NOT NULL," //! int??
"age INTEGER NOT NULL,"
"cost REAL NOT NULL");
}
bool Database::addPrinter(const QString &name, double power, int age,
double cost) {
QSqlQuery query;
query.prepare(
"INSERT INTO printers (name, power, age, cost) VALUES (:name, :power, "
":age, :cost)");
query.bindValue(":name", name);
query.bindValue(":power", power);
query.bindValue(":age", age);
query.bindValue(":cost", cost);
return query.exec();
}
QList<QString> Database::getPrinterList() {
QList<QString> printers;
QSqlQuery query("SELECT name FROM printers");
while (query.next()) {
printers.append({query.value(0).toString()});
}
return printers;
}
bool Database::deletePrinterByName(const QString &name) {
QSqlQuery query;
query.prepare("DELETE FROM printers WHERE name = :name");
query.bindValue(":name", name);
if (!query.exec()) {
// TODO exc
qWarning() << "Delete failed:" << query.lastError().text();
return false;
}
// была ли удалена хотя бы одна запись?
return query.numRowsAffected() > 0;
}
bool Database::updatePrinter(const QString &name,
const QHash<QString, QVariant> &updates) {
QStringList setClauses;
QSqlQuery query;
for (auto it = updates.begin(); it != updates.end(); ++it) {
setClauses << QString("%1 = :%2").arg(it.key(), it.key());
query.bindValue(":" + it.key(), it.value());
}
query.prepare("UPDATE printers SET " + setClauses.join(", ") +
" WHERE name = :name");
query.bindValue(":name", name);
return query.exec();
//! Как создать новое из фасада:
// !проще забрать сразу все
// QHash<QString, QVariant> updates;
// updates["power"] = 350.0;
// updates["cost"] = 27000.0;
// db->updatePrinterPartial("MyPrinter", updates);
}

18
src/logic/printer_db.h Normal file
View File

@ -0,0 +1,18 @@
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
class Database {
public:
Database(const QString &path);
bool init();
bool addPrinter(const QString &name, double power, int age, double cost);
bool deletePrinterByName(const QString &name);
QList<QString> getPrinterList();
bool updatePrinter(const QString &name,
const QHash<QString, QVariant> &updates);
private:
QSqlDatabase db;
};

View File

@ -1,19 +0,0 @@
#pragma once
#include <memory>
class Facade {
public:
Facade(const Facade &other) = delete;
Facade(Facade &&other) = delete;
void operator=(const Facade &other) = delete;
~Facade() = default;
static std::shared_ptr<Facade> GetInstance() {
static auto instance = std::shared_ptr<Facade>(new Facade);
return instance;
}
private:
Facade() {}
};