freesky

DBTest - main.cpp

Nov 27th, 2025
446
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "main.h"
  2.  
  3. #include <QApplication>
  4. #include <QMessageBox>
  5. #include <QPlainTextEdit>
  6. #include <QSqlDatabase>
  7. #include <QSqlError>
  8. #include <QSqlQuery>
  9. #include <QSqlQueryModel>
  10. #include <QString>
  11. #include <QTableView>
  12.  
  13. int main(int argc, char *argv[]) {
  14.     QApplication a(argc, argv);
  15.  
  16.     QPlainTextEdit log;
  17.  
  18.     log.setReadOnly(true);
  19.     log.resize(800, 800);
  20.  
  21.     // try to connect
  22.     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
  23.  
  24.     db.setHostName(SQL_HOSTNAME);
  25.     db.setPort(SQL_PORT);
  26.     db.setDatabaseName(SQL_DATABASE);
  27.     db.setUserName(SQL_USERNAME);
  28.     db.setPassword(SQL_PASSWORD);
  29.  
  30.     if (!db.open())
  31.         log.appendPlainText(QString("Error during connection to SQL DB:\n%1").arg(db.lastError().text()));
  32.     else {
  33.         log.appendPlainText(QString("Successfull connection to SQL DB"));
  34.  
  35.         // just an example string to search
  36.         QString search_txt = "05";
  37.  
  38.         // SQL SELECT query to work with DATE types
  39.         QString basic_query_dates =
  40.             "SELECT DISTINCT e.id, e.name, e.type, v.ts, v.upto, v.d_left "
  41.             "FROM Equipment AS e "
  42.             "INNER JOIN Users AS u ON u.id = e.responsible_id "
  43.             "LEFT JOIN (SELECT equipment_id, MAX(ts) AS ts, MAX(upto) AS upto, DATEDIFF(MAX(upto), NOW()) AS d_left FROM EquipmentVerifications GROUP BY equipment_id) AS v ON v.equipment_id = e.id "
  44.             "LEFT JOIN Equipment_Supplies AS es ON es.equipment_id = e.id "
  45.             "LEFT JOIN Supplies AS s ON s.id = es.supply_id "
  46.             "WHERE %1 "
  47.             "ORDER BY e.name";
  48.  
  49.         // 1. try to use in-place query
  50.         QSqlQuery q1(basic_query_dates.arg("e.name LIKE '%%1%' OR s.name LIKE '%%1%' OR s.description LIKE '%%1%' OR s.sn LIKE '%%1%'").arg(search_txt));
  51.  
  52.         // dump output
  53.         log.appendPlainText(QString("\nQUERY DEBUG, DATE TYPES, IN-PLACE QUERY\n======"));
  54.  
  55.         while (q1.next())
  56.             log.appendPlainText(QString("%1\t%2\t%3\t%4\t%5\t%6").arg(
  57.                 q1.value(0).toString(),
  58.                 q1.value(1).toString(),
  59.                 q1.value(2).toString(),
  60.                 q1.value(3).toString(),
  61.                 q1.value(4).toString(),
  62.                 q1.value(5).toString()));
  63.  
  64.         q1.finish();
  65.  
  66.         // 2. try to use parameters binding
  67.         QSqlQuery q2;
  68.  
  69.         q2.prepare(basic_query_dates.arg("e.name LIKE :search OR s.name LIKE :search OR s.description LIKE :search OR s.sn LIKE :search"));
  70.         q2.bindValue(":search", QString("%%1%").arg(search_txt));
  71.         q2.exec();
  72.  
  73.         // dump output
  74.         log.appendPlainText(QString("\nQUERY DEBUG, DATE TYPES, PREPARED QUERY\n======"));
  75.  
  76.         while (q2.next())
  77.             log.appendPlainText(QString("%1\t%2\t%3\t%4\t%5\t%6").arg(
  78.                 q2.value(0).toString(),
  79.                 q2.value(1).toString(),
  80.                 q2.value(2).toString(),
  81.                 q2.value(3).toString(),
  82.                 q2.value(4).toString(),
  83.                 q2.value(5).toString()));
  84.  
  85.         q2.finish();
  86.  
  87.         // 3. try to use model + in-place query
  88.         QSqlQueryModel *model1 = new QSqlQueryModel;
  89.  
  90.         model1->setQuery(basic_query_dates.arg("e.name LIKE '%%1%' OR s.name LIKE '%%1%' OR s.description LIKE '%%1%' OR s.sn LIKE '%%1%'").arg(search_txt));
  91.  
  92.         // dump output
  93.         log.appendPlainText(QString("\nMODEL+QUERY DEBUG, DATE TYPES, IN-PLACE QUERY\n======"));
  94.  
  95.         for (int i = 0; i < model1->rowCount(); i++) {
  96.             QString tmp;
  97.  
  98.             for (int j = 0; j < model1->columnCount(); j++)
  99.                 tmp += model1->index(i, j).data(Qt::DisplayRole).toString() + "\t";
  100.  
  101.             log.appendPlainText(tmp);
  102.         }
  103.  
  104.         // 4. try to use model + prepared query
  105.         QSqlQueryModel *model2 = new QSqlQueryModel;
  106.         QSqlQuery q3;
  107.  
  108.         q3.prepare(basic_query_dates.arg("e.name LIKE :search OR s.name LIKE :search OR s.description LIKE :search OR s.sn LIKE :search"));
  109.         q3.bindValue(":search", QString("%%1%").arg(search_txt));
  110.         q3.exec();
  111.  
  112.         model2->setQuery(std::move(q3));
  113.  
  114.         // dump output
  115.         log.appendPlainText(QString("\nMODEL+QUERY DEBUG, DATE TYPES, PREPARED QUERY\n======"));
  116.  
  117.         for (int i = 0; i < model2->rowCount(); i++) {
  118.             QString tmp;
  119.  
  120.             for (int j = 0; j < model2->columnCount(); j++)
  121.                 tmp += model2->index(i, j).data(Qt::DisplayRole).toString() + "\t";
  122.  
  123.             log.appendPlainText(tmp);
  124.         }
  125.  
  126.         // 5. try to use view + model + in-place query;
  127.         QTableView *view1 = new QTableView;
  128.         view1->setModel(model1);
  129.         view1->resize(600, 200);
  130.         view1->show();
  131.         view1->setWindowTitle(QString("DATE + IN-PLACE"));
  132.  
  133.         // 6. try to use view + model + prepared query;
  134.         QTableView *view2 = new QTableView;
  135.         view2->setModel(model2);
  136.         view2->resize(600, 200);
  137.         view2->show();
  138.         view2->setWindowTitle(QString("DATE + PREPARED"));
  139.  
  140.         // SQL SELECT query to work with INT types (2234 is the replacement equivalent of NOW())
  141.         QString basic_query_ints =
  142.             "SELECT DISTINCT e.id, e.name, e.type, v.ts, v.upto, v.d_left "
  143.             "FROM Equipment AS e "
  144.             "INNER JOIN Users AS u ON u.id = e.responsible_id "
  145.             "LEFT JOIN (SELECT equipment_id, MAX(ts) AS ts, MAX(upto) AS upto, (MAX(upto) - 2234) AS d_left FROM EquipmentVerifications2 GROUP BY equipment_id) AS v ON v.equipment_id = e.id "
  146.             "LEFT JOIN Equipment_Supplies AS es ON es.equipment_id = e.id "
  147.             "LEFT JOIN Supplies AS s ON s.id = es.supply_id "
  148.             "WHERE %1 "
  149.             "ORDER BY e.name";
  150.  
  151.         // 7. try to use in-place query
  152.         QSqlQuery q4(basic_query_ints.arg("e.name LIKE '%%1%' OR s.name LIKE '%%1%' OR s.description LIKE '%%1%' OR s.sn LIKE '%%1%'").arg(search_txt));
  153.  
  154.         // dump output
  155.         log.appendPlainText(QString("\nQUERY DEBUG, INT TYPES, IN-PLACE QUERY\n======"));
  156.  
  157.         while (q4.next())
  158.             log.appendPlainText(QString("%1\t%2\t%3\t%4\t%5\t%6").arg(
  159.                 q4.value(0).toString(),
  160.                 q4.value(1).toString(),
  161.                 q4.value(2).toString(),
  162.                 q4.value(3).toString(),
  163.                 q4.value(4).toString(),
  164.                 q4.value(5).toString()));
  165.  
  166.         q4.finish();
  167.  
  168.         // 8. try to use parameters binding
  169.         QSqlQuery q5;
  170.  
  171.         q5.prepare(basic_query_ints.arg("e.name LIKE :search OR s.name LIKE :search OR s.description LIKE :search OR s.sn LIKE :search"));
  172.         q5.bindValue(":search", QString("%%1%").arg(search_txt));
  173.         q5.exec();
  174.  
  175.         // dump output
  176.         log.appendPlainText(QString("\nQUERY DEBUG, INT TYPES, PREPARED QUERY\n======"));
  177.  
  178.         while (q5.next())
  179.             log.appendPlainText(QString("%1\t%2\t%3\t%4\t%5\t%6").arg(
  180.                 q5.value(0).toString(),
  181.                 q5.value(1).toString(),
  182.                 q5.value(2).toString(),
  183.                 q5.value(3).toString(),
  184.                 q5.value(4).toString(),
  185.                 q5.value(5).toString()));
  186.  
  187.         q5.finish();
  188.  
  189.         // 9. try to use model + in-place query
  190.         QSqlQueryModel *model3 = new QSqlQueryModel;
  191.  
  192.         model3->setQuery(basic_query_ints.arg("e.name LIKE '%%1%' OR s.name LIKE '%%1%' OR s.description LIKE '%%1%' OR s.sn LIKE '%%1%'").arg(search_txt));
  193.  
  194.         // dump output
  195.         log.appendPlainText(QString("\nMODEL+QUERY DEBUG, INT TYPES, IN-PLACE QUERY\n======"));
  196.  
  197.         for (int i = 0; i < model3->rowCount(); i++) {
  198.             QString tmp;
  199.  
  200.             for (int j = 0; j < model3->columnCount(); j++)
  201.                 tmp += model3->index(i, j).data(Qt::DisplayRole).toString() + "\t";
  202.  
  203.             log.appendPlainText(tmp);
  204.         }
  205.  
  206.         // 10. try to use model + prepared query
  207.         QSqlQueryModel *model4 = new QSqlQueryModel;
  208.         QSqlQuery q6;
  209.  
  210.         q6.prepare(basic_query_ints.arg("e.name LIKE :search OR s.name LIKE :search OR s.description LIKE :search OR s.sn LIKE :search"));
  211.         q6.bindValue(":search", QString("%%1%").arg(search_txt));
  212.         q6.exec();
  213.  
  214.         model4->setQuery(std::move(q6));
  215.  
  216.         // dump output
  217.         log.appendPlainText(QString("\nMODEL+QUERY DEBUG, INT TYPES, PREPARED QUERY\n======"));
  218.  
  219.         for (int i = 0; i < model4->rowCount(); i++) {
  220.             QString tmp;
  221.  
  222.             for (int j = 0; j < model4->columnCount(); j++)
  223.                 tmp += model4->index(i, j).data(Qt::DisplayRole).toString() + "\t";
  224.  
  225.             log.appendPlainText(tmp);
  226.         }
  227.  
  228.         // 11. try to use view + model + in-place query;
  229.         QTableView *view3 = new QTableView;
  230.         view3->setModel(model3);
  231.         view3->resize(600, 200);
  232.         view3->show();
  233.         view3->setWindowTitle(QString("INT + IN-PLACE"));
  234.  
  235.         // 12. try to use view + model + prepared query;
  236.         QTableView *view4 = new QTableView;
  237.         view4->setModel(model4);
  238.         view4->resize(600, 200);
  239.         view4->show();
  240.         view4->setWindowTitle(QString("INT + PREPARED"));
  241.     }
  242.  
  243.     log.show();
  244.  
  245.     return a.exec();
  246. }
Advertisement
Add Comment
Please, Sign In to add comment