Compare commits

...

27 Commits

Author SHA1 Message Date
Valentino Orlandi 01ee5a81e5
Updated translation resources 2024-04-22 20:04:04 +02:00
Valentino Orlandi 1cb69b0a31
Updated translation files 2024-04-22 20:03:58 +02:00
Valentino Orlandi 9abeab6257
Updated default conf file 2024-04-22 20:02:31 +02:00
Valentino Orlandi bd8f40802a
Updated Crapview
Added new methods and data members
2024-04-22 20:02:14 +02:00
Valentino Orlandi 601862c2a0
Updated MainWindow
Added slots for the new configs
2024-04-22 20:01:11 +02:00
Valentino Orlandi 2da551b4c0
Updated ConfigsPage enum 2024-04-22 20:00:17 +02:00
Valentino Orlandi 997d1c8eb3
Updated resources
Added icons for the new configs page
2024-04-22 19:59:46 +02:00
Valentino Orlandi 225110473a
Updated UI
Added page in the Configs to tweak the Relational stats chart
2024-04-22 19:58:45 +02:00
Valentino Orlandi 4339d0366e
Updated MainWindow
Updated readConfigs and writeConfigs methods
2024-04-22 00:25:12 +02:00
Valentino Orlandi d2115ce3e0
Updated default conf file 2024-04-22 00:22:21 +02:00
Valentino Orlandi 4dbfc272be
Improved and updated Crapview
Improved and updated DbQuery.
Added new methods and data members.
2024-04-21 23:37:33 +02:00
Valentino Orlandi e59d5fcf27
Updated MainWindow
Added slots for the new configs
2024-04-21 23:33:51 +02:00
Valentino Orlandi 88f4c899b1
Updated ConfigsPage enum with new values 2024-04-21 23:31:55 +02:00
Valentino Orlandi be433248ef
Updated main stylesheet 2024-04-21 23:31:05 +02:00
Valentino Orlandi 969666f4b2
Updated resources
Added icons for the new configs pages
2024-04-21 23:30:24 +02:00
Valentino Orlandi ae6867d84b
Updated UI
Added pages to the Configs section for tweaking the stats charts
2024-04-21 23:27:09 +02:00
Valentino Orlandi fcfc52f1ba
Improvements and updates
Using ConfigsPage enum instead of plain int
2024-04-21 11:34:43 +02:00
Valentino Orlandi 0fc4281066
Added Crapconf lib 2024-04-21 11:33:16 +02:00
Valentino Orlandi b418eca43a
Code improvements 2024-04-20 23:54:44 +02:00
Valentino Orlandi abb2662b98
Fixed compiler warning
Fixed possibly uninitialized values warning
2024-04-20 20:35:59 +02:00
Valentino Orlandi 56c2ced6e5
Improved tests suite
Added tests for ArrayOps
2024-04-20 20:32:33 +02:00
Valentino Orlandi c2b0e89bd6
Added IsStdArray concept to ArrayOps 2024-04-20 20:28:39 +02:00
Valentino Orlandi 8b656049ce
Fixed typo in ArrayOps 2024-04-20 18:42:39 +02:00
Valentino Orlandi 969a5f58d0
Code improvements 2024-04-16 20:05:36 +02:00
Valentino Orlandi fa0ea678d1
Updated CMakeLists.txt
Improved Release build with IPO
2024-04-16 20:04:25 +02:00
Valentino Orlandi cc0dcadc75
Updated HOW_TO_COMPILE 2024-03-01 23:25:53 +01:00
Valentino Orlandi 5d2b4aa24e
Updated build scripts
Changed build type from MinSizeRel to Release
2024-03-01 23:24:36 +01:00
57 changed files with 2238 additions and 370 deletions

View File

@ -5,7 +5,7 @@
### Requirements / Dependencies
- C++ 20
- Qt6 *(Framework 6.2+, Linguist, Widgets, Charts, Sql, Network)*
- Qt6 *(Framework 6.6+, Linguist, Widgets, Charts, Sql, Network)*
- CMake
- gcc / clang / msvc<br/><br/>
@ -16,7 +16,7 @@
- Prepare a build folder:
<br/>`mkdir build && cd build`<br/><br/>
- Prepare **CMake**'s build files:
<br/>`cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel`<br/><br/>
<br/>`cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release`<br/><br/>
- Use **CMake** to compile the entire project:
<br/>`cmake --build ./ --target all`<br/><br/>

View File

@ -67,3 +67,8 @@ IisBlacklistClientUsed=true
[Crapview]
CrapviewDialogsLevel=1
CrapviewSpeedTimeInterval=1
CrapviewSpeedTimeFormat=hh:mm
CrapviewCountPieSize=0.6
CrapviewCountMaxSlices=15
CrapviewRelationalTimeFormat=hh:mm

View File

@ -21,6 +21,14 @@ else()
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
endif()
if(CMAKE_BUILD_TYPE EQUAL "RELEASE")
include(CheckIPOSupported)
check_ipo_supported(RESULT supported)
if(supported)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
endif()
find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core Widgets Charts LinguistTools Sql Network)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets Charts LinguistTools Sql Network)
@ -119,6 +127,8 @@ set(PROJECT_SOURCES
modules/warnlists/modules/warnlist_item.h
modules/warnlists/modules/warnlist_item.cpp
modules/crapconf/lib.h
modules/craplog/lib.h
modules/craplog/craplog.h
modules/craplog/craplog.cpp

View File

@ -33,6 +33,8 @@
#include "modules/crapview/lib.h"
#include "modules/crapview/modules/filters.h"
#include "modules/crapconf/lib.h"
#include "tools/crappath/crappath.h"
#include "tools/crapnote/crapnote.h"
@ -221,6 +223,11 @@ MainWindow::MainWindow(QWidget *parent)
// charts
this->ui->box_ConfCharts_Theme->setCurrentIndex( static_cast<int>(GlobalConfigs::charts_theme) );
this->refreshChartsPreview();
this->ui->box_ConfCharts_Speed_TimeInterval->setCurrentText( QString::number(this->crapview.getSpeedTimeInterval()) );
this->ui->box_ConfCharts_Speed_TimeFormat->setCurrentText( this->crapview.getSpeedTimeFormat() );
this->ui->doubleSpinBox_ConfCharts_Count_PieSize->setValue( this->crapview.getCountPieSize() );
this->ui->spinBox_ConfCharts_Count_MaxSlices->setValue( this->crapview.getCountMaxSlices() );
this->ui->box_ConfCharts_Relat_TimeFormat->setCurrentText( this->crapview.getRelatTimeFormat() );
// databases
this->ui->inLine_ConfDatabases_Data_Path->setText( QString::fromStdString( this->db_data_path ) );
this->ui->button_ConfDatabases_Data_Save->setEnabled( false );
@ -847,6 +854,56 @@ void MainWindow::readConfigs()
invalid_lines.append( QString::fromStdString( line ) );
}
} else if ( var == "CrapviewSpeedTimeInterval" ) {
try {
const qint64 value{ std::stoll( val ) };
if ( const int index{this->ui->box_ConfCharts_Speed_TimeInterval->findText( QString::fromStdString( val ) )}; index >= 0 ) {
this->crapview.setSpeedTimeInterval( value );
} else {
invalid_lines.append( QString::fromStdString( line ) );
}
} catch ( ... ) { // std::exception
invalid_lines.append( QString::fromStdString( line ) );
}
} else if ( var == "CrapviewSpeedTimeFormat" ) {
if ( val == "hh:mm" || val == "hh" ) {
this->crapview.setSpeedTimeFormat( QString::fromStdString( val ) );
} else {
invalid_lines.append( QString::fromStdString( line ) );
}
} else if ( var == "CrapviewCountPieSize" ) {
try {
const qreal value{ std::stod( val ) };
if ( value >= 0.6 && value <= 0.8 ) {
this->crapview.setCountPieSize( value );
} else {
invalid_lines.append( QString::fromStdString( line ) );
}
} catch ( ... ) { // std::exception
invalid_lines.append( QString::fromStdString( line ) );
}
} else if ( var == "CrapviewCountMaxSlices" ) {
try {
const int value{ std::stoi( val ) };
if ( value >= 1 && value <= 31 ) {
this->crapview.setCountMaxSlices( value );
} else {
invalid_lines.append( QString::fromStdString( line ) );
}
} catch ( ... ) { // std::exception
invalid_lines.append( QString::fromStdString( line ) );
}
} else if ( var == "CrapviewRelationalTimeFormat" ) {
if ( val == "hh:mm" || val == "hh" ) {
this->crapview.setRelatTimeFormat( QString::fromStdString( val ) );
} else {
invalid_lines.append( QString::fromStdString( line ) );
}
}/* else {
// not valid
}*/
@ -1063,6 +1120,11 @@ void MainWindow::writeConfigs()
//// CRAPVIEW ////
configs += "\n\n[Crapview]";
configs += "\nCrapviewDialogsLevel=" + toString( this->crapview.getDialogsLevel() );
configs += "\nCrapviewSpeedTimeInterval=" + std::to_string( this->crapview.getSpeedTimeInterval() );
configs += "\nCrapviewSpeedTimeFormat=" + this->crapview.getSpeedTimeFormat().toStdString();
configs += "\nCrapviewCountPieSize=" + std::to_string( this->crapview.getCountPieSize() );
configs += "\nCrapviewCountMaxSlices=" + std::to_string( this->crapview.getCountMaxSlices() );
configs += "\nCrapviewRelationalTimeFormat=" + this->crapview.getRelatTimeFormat().toStdString();
// write on file
try {
@ -1439,6 +1501,14 @@ void MainWindow::updateUiIcons()
icon_name += "conf_dialogs";
} else if ( text == tr("Charts") ) {
icon_name += "conf_charts";
} else if ( text == tr("Appearance") ) {
icon_name += "conf_charts_style";
} else if ( text == tr("Speed") ) {
icon_name += "conf_speed";
} else if ( text == tr("Count") ) {
icon_name += "conf_count";
} else if ( text == tr("Relational") ) {
icon_name += "conf_relational";
} else if ( text == tr("TextBrowser") ) {
icon_name += "conf_textbrowser";
} else if ( text == tr("Databases") ) {
@ -1559,9 +1629,10 @@ void MainWindow::updateUiFonts()
const QFont& small_font{ this->fonts.at( "main_small" ) };
const QFont& font{ this->fonts.at( "main" ) };
const QFont& big_font{ this->fonts.at( "main_big" ) };
QFont menu_font{ this->fonts.at( "main_small" ) };
const QFont& tb_font{ this->TB.getFont() };
QFont menu_font{ small_font };
menu_font.setPointSizeF( this->font_size_small+1.5 );
QFont header_font{ this->fonts.at( "main_small" ) };
QFont header_font{ small_font };
header_font.setPointSizeF( this->font_size_small+2 );
// menu
this->ui->menuLanguage->setFont( menu_font );
@ -1588,7 +1659,7 @@ void MainWindow::updateUiFonts()
this->ui->listLogFiles->setFont( font );
this->ui->listLogFiles->headerItem()->setFont( 0, header_font );
this->ui->listLogFiles->headerItem()->setFont( 1, header_font );
this->ui->textLogFiles->setFont( this->TB.getFont() );
this->ui->textLogFiles->setFont( tb_font );
// log files parse
this->ui->label_MakeStats_Size->setFont( font );
this->ui->label_MakeStats_Lines->setFont( font );
@ -1750,11 +1821,21 @@ void MainWindow::updateUiFonts()
this->ui->label_ConfTextBrowser_ColorScheme->setFont( big_font );
this->ui->box_ConfTextBrowser_ColorScheme->setFont( font );
this->ui->label_ConfTextBrowser_Preview->setFont( big_font );
this->ui->textBrowser_ConfTextBrowser_Preview->setFont( this->TB.getFont() );
this->ui->textBrowser_ConfTextBrowser_Preview->setFont( tb_font );
// conf charts
this->ui->label_ConfCharts_Theme->setFont( big_font );
this->ui->box_ConfCharts_Theme->setFont( font );
this->ui->label_ConfCharts_Preview->setFont( big_font );
this->ui->label_ConfCharts_Speed_TimeInterval->setFont( big_font );
this->ui->box_ConfCharts_Speed_TimeInterval->setFont( font );
this->ui->label_ConfCharts_Speed_TimeFormat->setFont( big_font );
this->ui->box_ConfCharts_Speed_TimeFormat->setFont( font );
this->ui->label_ConfCharts_Count_PieSize->setFont( big_font );
this->ui->doubleSpinBox_ConfCharts_Count_PieSize->setFont( font );
this->ui->label_ConfCharts_Count_MaxSlices->setFont( big_font );
this->ui->spinBox_ConfCharts_Count_MaxSlices->setFont( font );
this->ui->label_ConfCharts_Relat_TimeFormat->setFont( big_font );
this->ui->box_ConfCharts_Relat_TimeFormat->setFont( font );
// conf databases
this->ui->label_ConfDatabases_Paths->setFont( big_font );
this->ui->label_ConfDatabases_Data->setFont( font );
@ -1781,7 +1862,7 @@ void MainWindow::updateUiFonts()
this->ui->label_ConfApache_Format_String->setFont( font );
this->ui->inLine_ConfApache_Format_String->setFont( font );
this->ui->button_ConfApache_Format_Sample->setFont( font );
this->ui->preview_ConfApache_Format_Sample->setFont( this->TB.getFont() );
this->ui->preview_ConfApache_Format_Sample->setFont( tb_font );
this->ui->box_ConfApache_Warnlist_Field->setFont( font );
this->ui->checkBox_ConfApache_Warnlist_Used->setFont( font );
this->ui->inLine_ConfApache_Warnlist_String->setFont( font );
@ -1796,7 +1877,7 @@ void MainWindow::updateUiFonts()
this->ui->label_ConfNginx_Format_String->setFont( font );
this->ui->inLine_ConfNginx_Format_String->setFont( font );
this->ui->button_ConfNginx_Format_Sample->setFont( font );
this->ui->preview_ConfNginx_Format_Sample->setFont( this->TB.getFont() );
this->ui->preview_ConfNginx_Format_Sample->setFont( tb_font );
this->ui->box_ConfNginx_Warnlist_Field->setFont( font );
this->ui->checkBox_ConfNginx_Warnlist_Used->setFont( font );
this->ui->inLine_ConfNginx_Warnlist_String->setFont( font );
@ -1811,7 +1892,7 @@ void MainWindow::updateUiFonts()
this->ui->label_ConfIis_Format_String->setFont( font );
this->ui->inLine_ConfIis_Format_String->setFont( font );
this->ui->button_ConfIis_Format_Sample->setFont( font );
this->ui->preview_ConfIis_Format_Sample->setFont( this->TB.getFont() );
this->ui->preview_ConfIis_Format_Sample->setFont( tb_font );
this->ui->box_ConfIis_Warnlist_Field->setFont( font );
this->ui->checkBox_ConfIis_Warnlist_Used->setFont( font );
this->ui->inLine_ConfIis_Warnlist_String->setFont( font );
@ -4429,58 +4510,66 @@ void MainWindow::on_tree_ConfSections_itemClicked(QTreeWidgetItem *item, int col
if ( section == tr("General") ) {
return;
} else if ( section == tr("Window") ) {
this->ui->stackedPages_Conf->setCurrentIndex(0);
this->setConfigsPage( General_Window );
} else if ( section == tr("Dialogs") ) {
this->ui->stackedPages_Conf->setCurrentIndex(1);
this->setConfigsPage( General_Dialogs );
} else if ( section == tr("Charts") ) {
this->ui->stackedPages_Conf->setCurrentIndex(2);
return;
} else if ( section == tr("Appearance") ) {
this->setConfigsPage( General_Charts_Appearance );
} else if ( section == tr("Speed") ) {
this->setConfigsPage( General_Charts_Speed );
} else if ( section == tr("Count") ) {
this->setConfigsPage( General_Charts_Count );
} else if ( section == tr("Relational") ) {
this->setConfigsPage( General_Charts_Relational );
} else if ( section == tr("TextBrowser") ) {
this->ui->stackedPages_Conf->setCurrentIndex(3);
this->setConfigsPage( General_TextBrowser );
} else if ( section == tr("Databases") ) {
this->ui->stackedPages_Conf->setCurrentIndex(4);
this->setConfigsPage( General_Databases );
} else if ( section == tr("Logs") ) {
return;
} else if ( section == tr("Defaults") ) {
this->ui->stackedPages_Conf->setCurrentIndex(5);
this->setConfigsPage( Logs_Defaults );
} else if ( section == tr("Control") ) {
this->ui->stackedPages_Conf->setCurrentIndex(6);
this->setConfigsPage( Logs_Control );
} else if ( section == tr("Apache2") || section == tr("Nginx") || section == tr("IIS") ) {
return;
} else if ( section == tr("Path") ) {
const QString parent{ item->parent()->text(0) };
if ( parent == tr("Apache2") ) {
this->ui->stackedPages_Conf->setCurrentIndex(7);
this->setConfigsPage( Logs_Apache2_Path );
} else if ( parent == tr("Nginx") ) {
this->ui->stackedPages_Conf->setCurrentIndex(11);
this->setConfigsPage( Logs_Nginx_Path );
} else if ( parent == tr("IIS") ) {
this->ui->stackedPages_Conf->setCurrentIndex(15);
this->setConfigsPage( Logs_IIS_Path );
}
} else if ( section == tr("Format") ) {
const QString parent{ item->parent()->text(0) };
if ( parent == tr("Apache2") ) {
this->ui->stackedPages_Conf->setCurrentIndex(8);
this->setConfigsPage( Logs_Apache2_Format );
} else if ( parent == tr("Nginx") ) {
this->ui->stackedPages_Conf->setCurrentIndex(12);
this->setConfigsPage( Logs_Nginx_Format );
} else if ( parent == tr("IIS") ) {
this->ui->stackedPages_Conf->setCurrentIndex(16);
this->setConfigsPage( Logs_IIS_Format );
}
} else if ( section == tr("Warnlists") ) {
const QString parent{ item->parent()->text(0) };
if ( parent == tr("Apache2") ) {
this->ui->stackedPages_Conf->setCurrentIndex(9);
this->setConfigsPage( Logs_Apache2_Warnlists );
} else if ( parent == tr("Nginx") ) {
this->ui->stackedPages_Conf->setCurrentIndex(13);
this->setConfigsPage( Logs_Nginx_Warnlists );
} else if ( parent == tr("IIS") ) {
this->ui->stackedPages_Conf->setCurrentIndex(17);
this->setConfigsPage( Logs_IIS_Warnlists );
}
} else if ( section == tr("Blacklists") ) {
const QString parent{ item->parent()->text(0) };
if ( parent == tr("Apache2") ) {
this->ui->stackedPages_Conf->setCurrentIndex(10);
this->setConfigsPage( Logs_Apache2_Blacklists );
} else if ( parent == tr("Nginx") ) {
this->ui->stackedPages_Conf->setCurrentIndex(14);
this->setConfigsPage( Logs_Nginx_Blacklists );
} else if ( parent == tr("IIS") ) {
this->ui->stackedPages_Conf->setCurrentIndex(18);
this->setConfigsPage( Logs_IIS_Blacklists );
}
} else {
throw("Unexpected Conf section: "+section.toStdString());
@ -4492,6 +4581,11 @@ void MainWindow::on_tree_ConfSections_itemDoubleClicked(QTreeWidgetItem *item, i
this->on_tree_ConfSections_itemClicked( item, column );
}
void MainWindow::setConfigsPage( const ConfigsPage page )
{
this->ui->stackedPages_Conf->setCurrentIndex( page );
}
/////////////////
//// GENERAL ////
/////////////////
@ -4711,6 +4805,31 @@ void MainWindow::refreshChartsPreview()
this->ui->chart_ConfCharts_Preview );
}
void MainWindow::on_box_ConfCharts_Speed_TimeInterval_currentTextChanged(const QString& arg1)
{
this->crapview.setSpeedTimeInterval( arg1.toLong() );
}
void MainWindow::on_box_ConfCharts_Speed_TimeFormat_currentTextChanged(const QString& arg1)
{
this->crapview.setSpeedTimeFormat( arg1 );
}
void MainWindow::on_doubleSpinBox_ConfCharts_Count_PieSize_valueChanged(double arg1)
{
this->crapview.setCountPieSize( arg1 );
}
void MainWindow::on_spinBox_ConfCharts_Count_MaxSlices_valueChanged(int arg1)
{
this->crapview.setCountMaxSlices( arg1 );
}
void MainWindow::on_box_ConfCharts_Relat_TimeFormat_currentTextChanged(const QString& arg1)
{
this->crapview.setRelatTimeFormat( arg1 );
}
///////////////////
//// DATABASES ////

View File

@ -35,6 +35,8 @@ class QTreeWidgetItem;
enum class LogField;
enum class ColorsScheme : unsigned char;
enum ConfigsPage : unsigned char;
namespace Ui {
class MainWindow;
@ -65,6 +67,7 @@ private slots:
///////////////////
//// OVERRIDES ////
void closeEvent( QCloseEvent* event ) override;
@ -274,8 +277,8 @@ private slots:
void on_button_StatsGlob_Iis_clicked();
/////////////////
//// CRAPSET ////
//////////////////
//// CRAPCONF ////
void on_tree_ConfSections_itemClicked(QTreeWidgetItem *item, int column);
@ -309,6 +312,16 @@ private slots:
void on_box_ConfCharts_Theme_currentIndexChanged(int index);
void on_box_ConfCharts_Speed_TimeInterval_currentTextChanged(const QString& arg1);
void on_box_ConfCharts_Speed_TimeFormat_currentTextChanged(const QString& arg1);
void on_doubleSpinBox_ConfCharts_Count_PieSize_valueChanged(double arg1);
void on_spinBox_ConfCharts_Count_MaxSlices_valueChanged(int arg1);
void on_box_ConfCharts_Relat_TimeFormat_currentTextChanged(const QString& arg1);
//// DATABASES ////
void on_tool_ConfDatabases_Data_Dialog_clicked();
@ -896,9 +909,11 @@ private:
void resetStatsGlob();
/////////////////
//// CRAPSET ////
/////////////////
//////////////////
//// CRAPCONF ////
//////////////////
void setConfigsPage( const ConfigsPage page );
void refreshTextBrowserPreview();

View File

@ -2727,7 +2727,7 @@ Use '!', '=','&lt;' or '&gt;' to declare what to use</string>
<widget class="QWidget" name="scrollAreaContent_StatsCount">
<property name="geometry">
<rect>
<x>0</x>
<x>14</x>
<y>0</y>
<width>263</width>
<height>402</height>
@ -6008,6 +6008,26 @@ With numbers, use '!', '=','&lt;' or '&gt;' to declare what to use</string>
<property name="text">
<string>Charts</string>
</property>
<item>
<property name="text">
<string>Appearance</string>
</property>
</item>
<item>
<property name="text">
<string>Speed</string>
</property>
</item>
<item>
<property name="text">
<string>Count</string>
</property>
</item>
<item>
<property name="text">
<string>Relational</string>
</property>
</item>
</item>
<item>
<property name="text">
@ -6826,7 +6846,7 @@ With numbers, use '!', '=','&lt;' or '&gt;' to declare what to use</string>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_Conf_General_Charts">
<widget class="QWidget" name="page_Conf_General_Charts_Theme">
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QFrame" name="frame_ConfCharts_Theme">
@ -6947,7 +6967,7 @@ With numbers, use '!', '=','&lt;' or '&gt;' to declare what to use</string>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_ConfCharts_Preview">
<widget class="QFrame" name="frame_ConfCharts_Theme_Preview">
<layout class="QGridLayout" name="gridLayout_83">
<item row="0" column="0">
<widget class="QLabel" name="label_ConfCharts_Preview">
@ -6981,6 +7001,9 @@ With numbers, use '!', '=','&lt;' or '&gt;' to declare what to use</string>
<height>256</height>
</size>
</property>
<property name="acceptDrops">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@ -6988,6 +7011,597 @@ With numbers, use '!', '=','&lt;' or '&gt;' to declare what to use</string>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_Conf_General_Charts_Speed">
<layout class="QVBoxLayout" name="verticalLayout_31">
<item>
<widget class="QFrame" name="frame_ConfCharts_Speed_TimeInterval">
<layout class="QGridLayout" name="gridLayout_89">
<item row="1" column="0">
<spacer name="spacer_ConfCharts_Speed_1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<spacer name="spacer_ConfCharts_Speed_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>569</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_ConfCharts_Speed_TimeInterval">
<property name="minimumSize">
<size>
<width>128</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="toolTip">
<string>Represents a step in the time axis, in seconds.
All the values falling inside the same interval will be merged and the mean value will be used.</string>
</property>
<property name="text">
<string>Time interval</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="box_ConfCharts_Speed_TimeInterval">
<property name="minimumSize">
<size>
<width>72</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>3</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>5</string>
</property>
</item>
<item>
<property name="text">
<string>10</string>
</property>
</item>
<item>
<property name="text">
<string>15</string>
</property>
</item>
<item>
<property name="text">
<string>20</string>
</property>
</item>
<item>
<property name="text">
<string>30</string>
</property>
</item>
<item>
<property name="text">
<string>60</string>
</property>
</item>
<item>
<property name="text">
<string>120</string>
</property>
</item>
<item>
<property name="text">
<string>180</string>
</property>
</item>
<item>
<property name="text">
<string>240</string>
</property>
</item>
<item>
<property name="text">
<string>300</string>
</property>
</item>
<item>
<property name="text">
<string>600</string>
</property>
</item>
<item>
<property name="text">
<string>900</string>
</property>
</item>
<item>
<property name="text">
<string>1200</string>
</property>
</item>
<item>
<property name="text">
<string>1800</string>
</property>
</item>
<item>
<property name="text">
<string>3600</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_ConfCharts_Speed_TimeFormat">
<layout class="QGridLayout" name="gridLayout_90">
<item row="1" column="2">
<spacer name="spacer_ConfCharts_Speed_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>569</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_ConfCharts_Speed_TimeFormat">
<property name="minimumSize">
<size>
<width>128</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="toolTip">
<string>The format to use for the labels of the time axis.</string>
</property>
<property name="text">
<string>Time format</string>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="spacer_ConfCharts_Speed_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="box_ConfCharts_Speed_TimeFormat">
<property name="minimumSize">
<size>
<width>96</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<item>
<property name="text">
<string>hh:mm</string>
</property>
</item>
<item>
<property name="text">
<string>hh</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="spacer_ConfCharts_Speed">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>608</width>
<height>333</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_Conf_General_Charts_Count">
<layout class="QVBoxLayout" name="verticalLayout_30">
<item>
<widget class="QFrame" name="frame_ConfCharts_Count_PieSize">
<layout class="QGridLayout" name="gridLayout_86">
<item row="1" column="0">
<spacer name="spacer_ConfCharts_Count_1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<spacer name="spacer_ConfCharts_Count_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>569</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_ConfCharts_Count_PieSize">
<property name="minimumSize">
<size>
<width>128</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="toolTip">
<string>The size of the pie</string>
</property>
<property name="text">
<string>Pie size</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_ConfCharts_Count_PieSize">
<property name="minimumSize">
<size>
<width>64</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::PlusMinus</enum>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
<property name="minimum">
<double>0.400000000000000</double>
</property>
<property name="maximum">
<double>0.800000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.600000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_ConfCharts_Count_MaxSlices">
<layout class="QGridLayout" name="gridLayout_87">
<item row="1" column="0">
<spacer name="spacer_ConfCharts_Count_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<spacer name="spacer_ConfCharts_Count_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>569</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_ConfCharts_Count_MaxSlices">
<property name="minimumSize">
<size>
<width>128</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="toolTip">
<string>The maximum number of slices that the pie will be composed of.
Exceeding slices will be grouped into one comprehensive slice.</string>
</property>
<property name="text">
<string>Maximum slices</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBox_ConfCharts_Count_MaxSlices">
<property name="minimumSize">
<size>
<width>56</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::PlusMinus</enum>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>31</number>
</property>
<property name="value">
<number>15</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="spacer_ConfCharts_Count">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_Conf_General_Charts_Relat">
<layout class="QVBoxLayout" name="verticalLayout_32">
<item>
<widget class="QFrame" name="frame_ConfCharts_Relat_TimeFormat">
<layout class="QGridLayout" name="gridLayout_91">
<item row="1" column="2">
<spacer name="spacer_ConfCharts_Relat_1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>569</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_ConfCharts_Relat_TimeFormat">
<property name="minimumSize">
<size>
<width>128</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="toolTip">
<string>The format to use for the labels of the time axis.</string>
</property>
<property name="text">
<string>Time format</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="box_ConfCharts_Relat_TimeFormat">
<property name="minimumSize">
<size>
<width>96</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<item>
<property name="text">
<string>hh:mm</string>
</property>
</item>
<item>
<property name="text">
<string>hh</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<spacer name="spacer_ConfCharts_Relat_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="spacer_ConfCharts_Relat">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>608</width>
<height>427</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_Conf_General_TextBrowser">
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
@ -8582,7 +9196,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'</string>
<rect>
<x>0</x>
<y>0</y>
<width>98</width>
<width>62</width>
<height>54</height>
</rect>
</property>
@ -9456,7 +10070,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log
<rect>
<x>0</x>
<y>0</y>
<width>98</width>
<width>62</width>
<height>54</height>
</rect>
</property>
@ -10654,7 +11268,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'</string>
<rect>
<x>0</x>
<y>0</y>
<width>98</width>
<width>62</width>
<height>54</height>
</rect>
</property>

View File

@ -0,0 +1,31 @@
#ifndef LOGDOCTOR__CRAPCONF__LIB_H
#define LOGDOCTOR__CRAPCONF__LIB_H
enum ConfigsPage : unsigned char {
General_Window = 0,
General_Dialogs = 1,
General_Charts_Appearance = 2,
General_Charts_Speed = 3,
General_Charts_Count = 4,
General_Charts_Relational = 5,
General_TextBrowser = 6,
General_Databases = 7,
Logs_Defaults = 8,
Logs_Control = 9,
Logs_Apache2_Path = 10,
Logs_Apache2_Format = 11,
Logs_Apache2_Warnlists = 12,
Logs_Apache2_Blacklists = 13,
Logs_Nginx_Path = 14,
Logs_Nginx_Format = 15,
Logs_Nginx_Warnlists = 16,
Logs_Nginx_Blacklists = 17,
Logs_IIS_Path = 18,
Logs_IIS_Format = 19,
Logs_IIS_Warnlists = 20,
Logs_IIS_Blacklists = 21,
};
#endif // LOGDOCTOR__CRAPCONF__LIB_H

View File

@ -198,17 +198,17 @@ QString Craplog::getLogsFormatSample( const WebServer& web_server ) const
bool Craplog::checkCurrentLogsFormat() const noexcept
{
if ( this->current_log_format.string.empty() ) {
// format string not set
DialogSec::errLogFormatNotSet( nullptr );
return false;
// format string not set
DialogSec::errLogFormatNotSet( nullptr );
return false;
} else if ( this->current_log_format.fields.empty() ) {
// no field, useless to parse
DialogSec::errLogFormatNoFields( nullptr );
return false;
// no field, useless to parse
DialogSec::errLogFormatNoFields( nullptr );
return false;
} else if ( this->current_log_format.separators.size() < this->current_log_format.fields.size()-1 ) {
// at least one separator is missing between two (or more) fields
DialogSec::errLogFormatNoSeparators( nullptr );
return false;
// at least one separator is missing between two (or more) fields
DialogSec::errLogFormatNoSeparators( nullptr );
return false;
}
return true;
}
@ -270,7 +270,7 @@ const std::vector<LogFile>& Craplog::getLogsList() const noexcept
const LogFile& Craplog::getLogFileItem( const QString& file_name ) const
{
const auto item{ std::find_if( this->logs_list.begin(), this->logs_list.end(),
[&file_name](const LogFile& file){ return file.name()==file_name; } ) };
[&file_name](const LogFile& file){ return file.name()==file_name; } ) };
if ( item != this->logs_list.end() ) return *item;
// should be unreachable
throw GenericException("File item not found");
@ -281,7 +281,7 @@ const LogFile& Craplog::getLogFileItem( const QString& file_name ) const
bool Craplog::setLogFileSelected( const QString& file_name ) noexcept
{
const auto item{ std::find_if( this->logs_list.begin(), this->logs_list.end(),
[&file_name](const LogFile& file){ return file.name() == file_name; } ) };
[&file_name](const LogFile& file){ return file.name() == file_name; } ) };
if ( item != this->logs_list.end() ) {
item->setSelected();
return true;
@ -293,8 +293,7 @@ void Craplog::clearLogFilesSelection() noexcept
{
std::ignore = std::for_each(
this->logs_list.begin(), this->logs_list.end(),
[]( LogFile& it )
{ if (it.isSelected()) it.setUnselected(); } );
[](LogFile& it){ if (it.isSelected()) it.setUnselected(); } );
}
@ -309,7 +308,7 @@ void Craplog::scanLogsDir()
this->logs_paths.at( this->current_web_server ),
this->logs_formats.at( this->current_web_server ),
this->hashOps,
[this]( const std::string& file_name)
[this]( const std::string& file_name )
{ return this->isFileNameValid( file_name ); }
) };
QThread* worker_thread{ new QThread() };
@ -507,7 +506,7 @@ bool Craplog::checkStuff()
// appears twice in the list
QString msg{ file.name() };
if ( this->dialogs_level == DL_EXPLANATORY ) {
msg += "\n" + QString::fromStdString( file.hash() );
msg += "\n" + QString::fromStdString( file.hash() );
}
const int choice = DialogSec::choiceDuplicateFile( msg );
if ( choice == 0 ) {
@ -720,9 +719,6 @@ void Craplog::hireWorker( const Blacklists& blacklists ) const
void Craplog::stopWorking( const bool successful )
{
this->db_edited = successful;
if ( successful ) {
// insert the hashes of the used files
}
emit this->finishedWorking();
}

View File

@ -2,7 +2,6 @@
#include "logs.h"
#include "modules/exceptions.h"
#include "modules/craplog/modules/datetime.h"
#include "utilities/strings.h"

View File

@ -61,7 +61,6 @@ void Crapview::refreshDates()
}
if ( result ) {
// std::unordered_map<int, std::unordered_map<int, std::unordered_map<int, std::vector<int>>>>
// { web_server_id : { year : { month : [ days ] } } }
this->dates = std::move( *result );
}
@ -75,7 +74,7 @@ QStringList Crapview::getYears( const QString& web_server ) const noexcept
{
QStringList years;
if ( ! this->dates.empty() ) {
const int ws{ this->WebServer_s2i.value( web_server ) };
const WebServer ws{ this->WebServer_s2e.value( web_server ) };
if ( const auto& y{ this->dates.at( ws ) }; !y.empty() ) {
std::transform( y.cbegin(), y.cend(),
std::back_inserter( years ),
@ -88,10 +87,10 @@ QStringList Crapview::getMonths( const QString& web_server, const QString& year
{
QStringList months;
if ( ! this->dates.empty() ) {
const int ws{ this->WebServer_s2i.value( web_server ) };
const WebServer ws{ this->WebServer_s2e.value( web_server ) };
if ( const auto& y{ this->dates.at( ws ) }; !y.empty() ) {
const int year_{ year.toInt() };
if ( const auto& m{ this->dates.at( ws ).at( year_ ) }; !m.empty() ) {
if ( const auto& m{ y.at( year_ ) }; !m.empty() ) {
const auto& m_tr{ this->dbQuery.MONTHS };
std::transform( m.cbegin(), m.cend(),
std::back_inserter( months ),
@ -105,10 +104,10 @@ QStringList Crapview::getDays( const QString& web_server, const QString& year, c
{
QStringList days;
if ( ! this->dates.empty() ) {
const int ws{ this->WebServer_s2i.value( web_server ) };
const WebServer ws{ this->WebServer_s2e.value( web_server ) };
if ( const auto& y{ this->dates.at( ws ) }; !y.empty() ) {
const int year_{ year.toInt() };
if ( const auto& m{ this->dates.at( ws ).at( year_ ) }; !m.empty() ) {
if ( const auto& m{ y.at( year_ ) }; !m.empty() ) {
const int month_{ this->getMonthNumber( month ) };
if ( const auto& d{ m.at( month_ ) }; !d.empty() ) {
std::transform( d.cbegin(), d.cend(),
@ -160,6 +159,51 @@ QStringList Crapview::getSpeedHeaderColumns() const noexcept
};
}
void Crapview::setSpeedTimeInterval( const qint64 interval ) noexcept
{
this->speed_interval = interval;
}
qint64 Crapview::getSpeedTimeInterval() const noexcept
{
return this->speed_interval;
}
void Crapview::setSpeedTimeFormat( const QString& format ) noexcept
{
this->speed_time_format = format;
}
const QString& Crapview::getSpeedTimeFormat() const noexcept
{
return this->speed_time_format;
}
void Crapview::setCountPieSize( const qreal size ) noexcept
{
this->count_pie_size = size;
}
qreal Crapview::getCountPieSize() const noexcept
{
return this->count_pie_size;
}
void Crapview::setCountMaxSlices( const int value ) noexcept
{
this->count_max_slices = value;
}
int Crapview::getCountMaxSlices() const noexcept
{
return this->count_max_slices;
}
void Crapview::setRelatTimeFormat( const QString& format ) noexcept
{
this->relat_time_format = format;
}
const QString& Crapview::getRelatTimeFormat() const noexcept
{
return this->relat_time_format;
}
////////////////
//// CHARTS ////
@ -193,7 +237,6 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
return;
}
// std::vector<std::vector<std::vector<std::array<QString,18>>>>
// day -> [ hours[ 10th_minutes[ lines[ log_data ] ] ] ]
// hour -> [ 10th_minutes[ minute[ lines[ log_data ] ] ] ]
const auto items{ std::move(*result) };
@ -214,29 +257,26 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
const auto target{ line.at( 8ul ).toStdString() };
const auto& list{ warnlist.uri.list };
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
// match found! skip this line
is_warning |= true;
warning_cols.emplace_back( 5 );
}
}
if ( warnlist.client.used ) {
const auto target{ line.at( 12ul ).toStdString() };
const auto& list{ warnlist.client.list };
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
// match found! skip this line
is_warning |= true;
warning_cols.emplace_back( 9 );
}
}
if ( warnlist.user_agent.used ) {
const auto target{ line.at( 11ul ).toStdString() };
const auto& list{ warnlist.user_agent.list };
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
// match found! skip this line
is_warning |= true;
warning_cols.emplace_back( 8 );
}
}
if ( warnlist.client.used ) {
const auto target{ line.at( 12ul ).toStdString() };
const auto& list{ warnlist.client.list };
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
is_warning |= true;
warning_cols.emplace_back( 9 );
}
}
return std::make_tuple( is_warning, warning_cols );
}
};
@ -272,7 +312,6 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
}
};
// bars
std::vector<std::vector<QBarSet*>> sets;
// build the bars and the table upon data
@ -332,28 +371,25 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
table->verticalHeader()->setVisible( false );
// apply the colors and append to the series
QColor cols[]{ QColor(127,127,127), QColor(237,80,61) };
const QColor cols[]{ QColor(127,127,127), QColor(237,80,61) };
std::vector<QStackedBarSeries*> b_series;
const size_t max{ sets.size() };
for ( size_t i{0}; i<max; ++i ) {
const auto& set{ sets.at( i ) };
b_series.push_back( new QStackedBarSeries() );
auto* series{ new QStackedBarSeries() };
for ( size_t w{0}; w<2ul; ++w ) {
QBarSet* b = set.at( w );
QBarSet* b{ set.at( w ) };
b->setColor( cols[ w ] );
b_series.at( i )->append( b );
series->append( b );
}
}
for ( auto *s : b_series ) {
s->setBarWidth( 1 );
series->setBarWidth( 1 );
b_series.push_back( series );
}
// set-up the bars chart
QChart* b_chart{ new QChart() };
// apply the theme
b_chart->setTheme( theme );
// append the bars
foreach ( auto& bars, b_series ) {
for ( auto* bars : b_series ) {
b_chart->addSeries( bars );
}
b_chart->setTitle( TR::tr( "Log Lines Marked as Warning" ) );
@ -388,7 +424,6 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
s->attachAxis( axisY );
}
// apply the chart to the view
chart->setChart( b_chart );
chart->setRenderHint( QPainter::Antialiasing );
}
@ -401,7 +436,7 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
try {
this->dbQuery.getSpeedData( result, web_server, year, month, day, protocol, method, uri, query, response );
this->dbQuery.getSpeedData( result, web_server, year, month, day, protocol, method, uri, query, response, this->speed_interval );
} catch ( const DatabaseException& e ) {
DialogSec::errProcessingStatsData( e.what() );
@ -414,60 +449,76 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
if ( ! result ) {
DialogSec::msgNoDataForStats();
chart->setChart( new QChart() );
return;
}
// std::vector<std::tuple<long long, std::vector<QString>>>
// [ ( epoch_msec, [ log_data ] ) ]
const auto items{ std::move(*result) };
// draw the speed chart
QLineSeries* line{ new QLineSeries() };
// build the line upon data
size_t i{ 0 };
const size_t max_i{ items.size() };
int value{0}, count{1}, aux_value, max_value{0}, n_rows{0};
bool first_count{ true };
qint64 time{ std::get<0>(items.at(0ul)) };
QDateTime dt;
for ( const auto& item : items ) {
++i;
// append a value to the chart
const qint64 aux_time{ std::get<0>(item) };
const std::array<QString,6>& data{ std::get<1>(item) };
aux_value = data.at( 0ul ).toInt();
// append only if the second is different, else sum
if ( aux_time > time ) {
value = value/count;
int value{0}, count{0}, aux_value, max_value{0}, n_rows{0};
qint64 time{ -1 };
const auto finalize_value{
[&value,&count]()
{
if ( value == -1 ) {
value = 0;
} else {
value /= count+1;
}
}
};
const auto push_to_line{
[&max_value]( QLineSeries*const line, const qint64 time, const int value )
{
line->append( time, value );
if ( value > max_value ) {
max_value = value;
}
time = aux_time;
value = aux_value;
count = 1;
first_count |= true;
if ( i == max_i ) {
// final
line->append( time, value );
if ( value > max_value ) {
max_value = value;
}
}
};
const auto set_values{
[&time,&value,&count]( const qint64 t, const int v, const int c )
{
time = t; value = v; count = c;
}
};
for ( const auto& item : items ) {
++i;
const qint64 aux_time{ std::get<0>(item) };
const std::array<QString,6>& data{ std::get<1>(item) };
if ( const auto tt{data.at(0ul)}; tt.isEmpty() ) {
if ( time != -1 ) {
finalize_value();
push_to_line( line, time, value );
}
set_values( aux_time, -1, 0 );
push_to_line( line, time, 0 );
continue;
} else {
if ( first_count ) {
first_count &= false;
aux_value = tt.toInt();
if ( aux_time > time ) {
finalize_value();
push_to_line( line, time, value );
set_values( aux_time, aux_value, 0 );
if ( i == max_i ) {
push_to_line( line, time, value );
}
} else {
++ count;
}
value += aux_value;
if ( i == max_i ) {
// final
value = value/count;
line->append( aux_time, value );
if ( value > max_value ) {
max_value = value;
if ( value == -1 ) {
value = 0;
} else {
++ count;
}
value += aux_value;
if ( i == max_i ) {
value /= count+1;
push_to_line( line, aux_time, value );
}
}
}
@ -482,16 +533,13 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
table->setItem( n_rows, 3, new QTableWidgetItem( data.at(3ul) ));
table->setItem( n_rows, 4, new QTableWidgetItem( data.at(4ul) ));
table->setItem( n_rows, 5, new QTableWidgetItem( data.at(5ul) ));
dt = QDateTime::fromMSecsSinceEpoch( aux_time );
QDateTime dt{ QDateTime::fromMSecsSinceEpoch( aux_time ) };
table->setItem( n_rows, 6, new QTableWidgetItem( dt.time().toString("hh:mm:ss") ));
++ n_rows;
}
}
table->verticalHeader()->setVisible( false );
// fictitious line
QLineSeries* line_{ new QLineSeries() };
// color the area
QColor col1{ Qt::GlobalColor::red },
col2{ Qt::GlobalColor::green },
@ -508,23 +556,17 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
pen.setWidth( 1 );
line->setPen(pen);
pen = line_->pen();
pen.setBrush( gradient );
pen.setWidth( 1 );
line_->setPen(pen);
// build the chart
QChart* l_chart{ new QChart() };
l_chart->setTheme( theme );
l_chart->addSeries( line );
l_chart->addSeries( line_ );
l_chart->setTitle( TR::tr( "Time Taken to Serve Requests" ) );
/*l_chart->legend()->setAlignment( Qt::AlignBottom );*/
l_chart->legend()->setVisible( false );
// set-up the date-time axis (X)
QDateTimeAxis* axisX{ new QDateTimeAxis() };
axisX->setFormat( "hh:mm" );
axisX->setFormat( this->speed_time_format );
axisX->setTickCount( 25 );
axisX->setTitleText( PrintSec::printableDate( year, this->getMonthNumber(month), day ) );
l_chart->addAxis( axisX, Qt::AlignBottom );
@ -542,7 +584,6 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
l_chart->addAxis( axisY, Qt::AlignLeft );
line->attachAxis( axisY) ;
// add the chart to the view
chart->setChart( l_chart );
chart->setRenderHint(QPainter::Antialiasing);
}
@ -571,23 +612,18 @@ void Crapview::drawCount( QTableWidget* table, QChartView* chart, const QChart::
return;
}
// std::vector<std::tuple<QString, int>>
// [ ( log_item, count ) ]
const auto items{ std::move(*result) };
// make the pie
QPieSeries* pie{ new QPieSeries() };
// cut off exdceeding elements for the chart
const int max_items{ 15 };
int count, oth_count{0}, n_rows{0};
QString item;
int oth_count{0}, n_rows{0};
// bring items in reverse order
stats_count_items_t::const_reverse_iterator iter = items.crbegin();
auto iter{ items.crbegin() };
while ( iter != items.crend() ) {
item = iter->second;
count = iter->first;
++iter;
if ( n_rows >= max_items ) {
const QString& item{ iter->second };
const unsigned count{ iter->first };
if ( n_rows >= this->count_max_slices ) {
oth_count += count;
} else {
pie->append( item, count );
@ -598,6 +634,7 @@ void Crapview::drawCount( QTableWidget* table, QChartView* chart, const QChart::
table->setItem( n_rows, 0, ic );
table->setItem( n_rows, 1, new QTableWidgetItem( item ));
++ n_rows;
++ iter;
}
table->verticalHeader()->setVisible( false );
@ -606,7 +643,7 @@ void Crapview::drawCount( QTableWidget* table, QChartView* chart, const QChart::
QPieSlice* slice = pie->slices().at( pie->count()-1 );
slice->setBrush( Qt::gray );
}
pie->setPieSize( 0.60 );
pie->setPieSize( this->count_pie_size );
pie->setLabelsVisible( false );
connect( pie, &QPieSeries::clicked, this, &Crapview::sliceClicked );
@ -644,27 +681,26 @@ void Crapview::drawDay( QChartView* chart, const QChart::ChartTheme& theme, cons
return;
}
// std::unordered_map<int, std::unordered_map<int, int>>
// { hour : { 10th_minutes : count } }
const auto items{ std::move(*result) };
// draw the chart
QString date;
if ( to_year.isEmpty() || to_month.isEmpty() || to_day.isEmpty() ) {
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
} else {
date = QStringLiteral("%1 %2 %3 %4").arg(
TR::tr( "from" ),
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
TR::tr( "to" ),
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ) );
}
QColor col{ Qt::GlobalColor::darkGreen };
QBarSet* b_10{ new QBarSet("") };
b_10->setColor( col );
QBarSet* b_20{ new QBarSet("") };
b_20->setColor( col );
QBarSet* b_30{ new QBarSet("") };
if ( to_year.isEmpty() || to_month.isEmpty() || to_day.isEmpty() ) {
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
} else {
date = QStringLiteral("%1 %2 %3 %4")
.arg( TR::tr( "from" ),
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
TR::tr( "to" ),
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ) );
}
b_30->setColor( col );
QBarSet* b_40{ new QBarSet("") };
b_40->setColor( col );
@ -675,47 +711,36 @@ void Crapview::drawDay( QChartView* chart, const QChart::ChartTheme& theme, cons
// build the bars upon data
int count, max_count{0};
const auto check_max_count{ [&count,&max_count](){
if ( count > max_count ) max_count = count;
}};
for ( size_t h{0ul}; h<24ul; ++h ) {
auto& data = items.at( h );
const auto& data{ items.at( h ) };
count = data.at( 0ul );
*b_10 << count;
if ( count > max_count ) {
max_count = count;
}
check_max_count();
count = data.at( 10ul );
*b_20 << count;
if ( count > max_count ) {
max_count = count;
}
check_max_count();
count = data.at( 20ul );
*b_30 << count;
if ( count > max_count ) {
max_count = count;
}
check_max_count();
count = data.at( 30ul );
*b_40 << count;
if ( count > max_count ) {
max_count = count;
}
check_max_count();
count = data.at( 40ul );
*b_50 << count;
if ( count > max_count ) {
max_count = count;
}
check_max_count();
count = data.at( 50ul );
*b_60 << count;
if ( count > max_count ) {
max_count = count;
}
check_max_count();
}
// apply the bars to the bars serie
QBarSeries* bars{ new QBarSeries() };
bars->append( b_10 ); bars->append( b_20 ); bars->append( b_30 );
bars->append( b_40 ); bars->append( b_50 ); bars->append( b_60 );
bars->setBarWidth( 1 );
// set-up the bars chart
QChart* b_chart{ new QChart() };
b_chart->setTheme( theme );
b_chart->addSeries( bars );
@ -742,7 +767,6 @@ void Crapview::drawDay( QChartView* chart, const QChart::ChartTheme& theme, cons
b_chart->addAxis( axisY, Qt::AlignLeft );
bars->attachAxis( axisY) ;
// apply the chart to the view
chart->setChart( b_chart );
chart->setRenderHint( QPainter::Antialiasing );
}
@ -762,6 +786,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
} else {
this->dbQuery.getRelationalCountsPeriod( result, web_server, from_year, from_month, from_day, to_year, to_month, to_day, field_1, filter_1, field_2, filter_2 );
}
} catch ( const DatabaseException& e ) {
DialogSec::errProcessingStatsData( e.what() );
return;
@ -776,11 +801,20 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
return;
}
// std::vector<std::tuple<long long, int>>
// [ ( epoch_ms, count ) ]
const auto items{ std::move(*result) };
// draw the relational chart
QString date;
if ( ! period ) {
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
} else {
date = QStringLiteral("%1 %2 %3 %4").arg(
TR::tr( "from" ),
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
TR::tr( "to" ),
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ));
}
QLineSeries* line{ new QLineSeries() };
// build the line upon data
int max_count{0};
@ -793,19 +827,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
}
}
// build the area
QString date;
QAreaSeries* area{ new QAreaSeries( line ) };
if ( ! period ) {
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
} else {
date = QStringLiteral("%1 %2 %3 %4")
.arg( TR::tr( "from" ),
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
TR::tr( "to" ),
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ));
}
// color the area
QColor col1{ Qt::GlobalColor::red },
col2{ Qt::GlobalColor::yellow },
@ -829,7 +851,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
a_chart->setTheme( theme );
a_chart->addSeries( area );
a_chart->addSeries( area_ );
a_chart->setTitle( QStringLiteral("%1: %2 -> %3").arg( TR::tr( "Time of Day Count" ), field_1_str, field_2_str) );
a_chart->setTitle( QStringLiteral("%1: %2 -> %3").arg( TR::tr( "Relational Count" ), field_1_str, field_2_str) );
a_chart->legend()->setVisible( false );
/*a_chart->legend()->setFont( fonts.at( "main_small" ) );
a_chart->legend()->setAlignment( Qt::AlignBottom );*/
@ -846,7 +868,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
}
axisX->setTickCount( ticks+1 );
} else {
axisX->setFormat( "hh:mm" );
axisX->setFormat( this->relat_time_format );
axisX->setTickCount( 25 );
}
axisX->setTitleText( date );
@ -861,7 +883,6 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
a_chart->addAxis( axisY, Qt::AlignLeft );
area->attachAxis( axisY) ;
// add the chart to the view
chart->setChart( a_chart );
chart->setRenderHint(QPainter::Antialiasing);
}
@ -870,7 +891,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
// calculate global informations
bool Crapview::calcGlobals( std::vector<std::tuple<QString,QString>>& recur_list, std::vector<std::tuple<QString,QString>>& traffic_list, std::vector<std::tuple<QString,QString>>& perf_list, std::vector<QString>& work_list, const QString web_server ) const
{
const auto& avl_dates{ this->dates.at( this->WebServer_s2i.value( web_server ) ) };
const auto& avl_dates{ this->dates.at( this->WebServer_s2e.value( web_server ) ) };
if ( avl_dates.empty() ) {
return false;
}
@ -895,7 +916,6 @@ bool Crapview::calcGlobals( std::vector<std::tuple<QString,QString>>& recur_list
return false;
}
// std::vector<std::tuple<long long, int>>
// [ ( epoch_ms, count ) ]
const GlobalsData data{ std::move(*result) };

View File

@ -61,14 +61,14 @@ public:
void clearDates() noexcept;
//! Returns le list of available years, for the given web server
//! Returns the list of available years, for the given web server
/*!
\param web_server The printable Web Server name
\return The list of yearss which are avaliable
*/
QStringList getYears( const QString& web_server ) const noexcept;
//! Returns le list of available months in the given year, for the given web server
//! Returns the list of available months in the given year, for the given web server
/*!
\param web_server The printable Web Server name
\param year The year
@ -76,7 +76,7 @@ public:
*/
QStringList getMonths( const QString& web_server, const QString& year ) const noexcept;
//! Returns le list of available days in the given month and year, for the given web server
//! Returns the list of available days in the given month and year, for the given web server
/*!
\param web_server The printable Web Server name
\param year The year
@ -107,6 +107,69 @@ public:
QStringList getSpeedHeaderColumns() const noexcept;
//! Sets the time interval for the Speed stats
/*!
\param interval The time interval to use
*/
void setSpeedTimeInterval( const qint64 interval ) noexcept;
//! Returns the current time interval for the Speed stats
/*!
\return The time interval in use
*/
qint64 getSpeedTimeInterval() const noexcept;
//! Sets the time format for the Speed labels on the X-axis
/*!
\param format The format to use
*/
void setSpeedTimeFormat( const QString& format ) noexcept;
//! Returns the current time format for the Speed labels on the X-axis
/*!
\return The time format in use
*/
const QString& getSpeedTimeFormat() const noexcept;
//! Sets the size of the pie chart for the Count stats
/*!
\param size The new size
*/
void setCountPieSize( const qreal size ) noexcept;
//! Returns the current size of the pie chart for the Count stats
/*!
\return The size in use
*/
qreal getCountPieSize() const noexcept;
//! Sets the maximum number of slices of pie chart for the Count stats
/*!
\param value The maximum number of slices
*/
void setCountMaxSlices( const int value ) noexcept;
//! Returns the current maximum number of slices of pie chart for the Count stats
/*!
\return The maximum number of slices in use
*/
int getCountMaxSlices() const noexcept;
//! Sets the time format for the Relational labels on the X-axis
/*!
\param format The format to use
*/
void setRelatTimeFormat( const QString& format ) noexcept;
//! Returns the current time format for the Relational labels on the X-axis
/*!
\return The time format in use
*/
const QString& getRelatTimeFormat() const noexcept;
//! Draws the chart and fills the table for the Warnings stats
/*!
\param table The table widget
@ -251,9 +314,6 @@ private:
// quantity of information to display throught dialogs
DialogsLevel dialogs_level{ DL_NORMAL };
// charts theme ID
int charts_theme{ 0 };
const QColor warning_color{ 255, 140, 0, 255 };
DbQuery dbQuery;
@ -263,10 +323,18 @@ private:
// { web_server_id : { year : { month : [ days ] } } }
database_dates_t dates;
qint64 speed_interval{ 1ll };
QString speed_time_format{ "hh:mm" };
qreal count_pie_size{ 0.6 };
int count_max_slices{ 15 };
QString relat_time_format{ "hh:mm" };
// converr Web Servers names to Web Server IDs
const QHash<QString, int> WebServer_s2i{
{"apache",11}, {"nginx",12}, {"iis",13} };
const QHash<QString, WebServer> WebServer_s2e{
{"apache",WS_APACHE}, {"nginx",WS_NGINX}, {"iis",WS_IIS} };
// convert months names to months numbers
const QHash<QString, int> Months_s2i{

View File

@ -15,7 +15,7 @@
using stats_day_items_t = std::unordered_map<int, std::unordered_map<int, int>>;\
using stats_relat_items_t = std::vector<std::tuple<qint64, int>>;\
using stats_count_items_t = std::multimap<unsigned, QString>;\
using database_dates_t = std::map<int, stats_dates_t>;
using database_dates_t = std::map<WebServer, stats_dates_t>;
struct RecurrenceData final

View File

@ -136,19 +136,17 @@ int DbQuery::countDays( const int from_year, const int from_month, const int fro
{
int n_days{ 1 };
if ( from_year == to_year ) {
// 1 year
if ( from_month == to_month ) {
// 1 month
n_days += to_day - from_day + 1;
} else {
n_days += getMonthDays( from_year, from_month ) - from_day; // first month's days
for ( int month=from_month+1; month<to_month; ++month ) {
for ( int month{from_month+1}; month<to_month; ++month ) {
n_days += getMonthDays( from_year, month );
}
n_days += to_day; // last month's days
}
} else {
n_days += getMonthDays( from_year, from_month ) - from_day;
n_days += getMonthDays( from_year, from_month ) - from_day; // first month's days
if ( from_month < 12 ) {
for ( int month{from_month+1}; month<=12; ++month ) {
n_days += getMonthDays( from_year, month );
@ -158,7 +156,7 @@ int DbQuery::countDays( const int from_year, const int from_month, const int fro
int last_month{ 12 };
if ( year == to_year ) {
last_month = to_month-1;
n_days += to_day; // last month's days, added in advance
n_days += to_day; // last month's days
}
for ( int month{1}; month<=last_month; ++month ) {
n_days += getMonthDays( year, month );
@ -172,19 +170,15 @@ int DbQuery::countMonths( const int from_year, const int from_month, const int t
{
int n_months{ 0 };
if ( from_year == to_year ) {
// same year
if ( from_month == to_month ) {
// same month
n_months = 1;
} else {
// different months
n_months = to_month - from_month + 1;
}
} else {
// different years
n_months += 13 - from_month; // months to the end of the first year
n_months += to_month; // months from the beginning of the last year
n_months += 12 * ( to_year - from_year - 1 ); // 12 months for every middle year (0 if none)
n_months += 12 * ( to_year - from_year - 1 ); // 12 months for every year in the middle
}
return n_months;
}
@ -224,7 +218,7 @@ const QString& DbQuery::getDbField( QStringView tr_fld ) const
void DbQuery::refreshDates( std::optional<database_dates_t>& result ) noexcept
{
database_dates_t dates{ // std::unordered_map<int, std::unordered_map<int, std::unordered_map<int, std::vector<int>>>>
{11, {}}, {12, {}}, {13, {}}
{WS_APACHE, {}}, {WS_NGINX, {}}, {WS_IIS, {}}
};
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
@ -232,10 +226,11 @@ void DbQuery::refreshDates( std::optional<database_dates_t>& result ) noexcept
db.open( this->db_path, this->dialog_level==DL_EXPLANATORY );
// recursively query years, months and days for every WebServer
static const std::vector<std::tuple<int, QString>> tables{
std::make_tuple(11,"apache"),
std::make_tuple(12,"nginx"),
std::make_tuple(13,"iis") };
static const std::vector<std::tuple<WebServer, QString>> tables{
std::make_tuple( WS_APACHE, QStringLiteral("apache") ),
std::make_tuple( WS_NGINX, QStringLiteral("nginx") ),
std::make_tuple( WS_IIS, QStringLiteral("iis") )
};
for ( const auto& [ws,tbl] : tables ) {
@ -261,7 +256,7 @@ void DbQuery::refreshDates( std::optional<database_dates_t>& result ) noexcept
// get daytime values for the warnings
void DbQuery::getWarningsData( std::optional<stats_warn_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, QStringView hour_ ) const
{
stats_warn_items_t items; // std::vector<std::vector<std::vector<std::array<QString,18>>>>
stats_warn_items_t items;
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
@ -353,9 +348,9 @@ void DbQuery::getWarningsData( std::optional<stats_warn_items_t>& result, QStrin
// get day-time values for the time-taken field
void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, QStringView protocol_f, QStringView method_f, QStringView uri_f, QStringView query_f, QStringView response_f ) const
void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, QStringView protocol_f, QStringView method_f, QStringView uri_f, QStringView query_f, QStringView response_f, const qint64 time_interval ) const
{
stats_speed_items_t data; // std::vector<std::tuple<long long, std::array<QString,6>>>
stats_speed_items_t data;
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
@ -401,154 +396,95 @@ void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringV
return;
}
int h, m, s;
const auto prev_instant{
[&h,&m,&s](const int hour, const int minute, const int second)
{
h=hour; m=minute; s=second;
if ( --s < 0 ) { s=59;
if ( --m < 0 ) { m=59;
if ( --h < 0 ) { h=m=s=0; }}}
}
};
const auto next_instant{
[&h,&m,&s](const int hour, const int minute, const int second)
{
h=hour; m=minute; s=second;
if ( ++s > 59 ) { s=0;
if ( ++m > 59 ) { m=0;
if ( ++h > 23 ) { h=23;m=59;s=59; }}}
}
};
using data_t = std::array<QString,6>;
data_t query_data{};
QDateTime time{
QDate( year, month, day ),
QTime( 0, 0, 0 )
};
QDateTime current_interval{ time }, next_interval{ time };
const auto push_empty{
[&data,&time]()
[&data,&current_interval]()
{
data.emplace_back( time.toMSecsSinceEpoch(), data_t{} );
data.emplace_back( current_interval.toMSecsSinceEpoch(), data_t{} );
}
};
const auto push_data{
[&data,&time](const auto ...args)
[&data,&current_interval,&query_data]()
{
data.emplace_back( time.toMSecsSinceEpoch(), data_t{args...} );
data.emplace_back( current_interval.toMSecsSinceEpoch(), query_data );
}
};
const auto set_time{
[&time](const auto ...args)
[&time](const QueryWrapper& query)
{
time.setTime( QTime(args...) );
time.setTime( QTime( toInt(query[0]), toInt(query[1]), toInt(query[2]) ) );
}
};
int hour{-1}, next_hour, prev_hour{0},
minute{0}, next_minute, prev_minute{0},
second{0}, next_second, prev_second{0};
QString tt, ur, qr, mt, pt, rs;
const auto set_data{
[&query_data](const QueryWrapper& query)
{
query_data = data_t{
toString( query[3] ), // time taken
toString( query[4] ), // uri
toString( query[5] ), // query
toString( query[6] ), // method
toString( query[7] ), // protocol
toString( query[8] ) // response
};
}
};
const auto in_current_interval{
[&current_interval,&next_interval,&time]()->bool
{
return current_interval <= time && time < next_interval;
}
};
const auto increase_intervals{
[&current_interval,&next_interval,&time_interval]()
{
current_interval = next_interval;
next_interval.setSecsSinceEpoch( next_interval.toSecsSinceEpoch() + time_interval );
}
};
// append the first ficticious count
time.setMSecsSinceEpoch( time.toMSecsSinceEpoch() - 1000 ); // -1s
push_empty();
time.setMSecsSinceEpoch( time.toMSecsSinceEpoch() + 1000 ); // +1s
while ( query->next() ) {
next_hour = toInt( query[0] );
next_minute = toInt( query[1] );
next_second = toInt( query[2] );
set_time( query );
set_data( query );
if ( next_hour == hour && next_minute == minute && next_second == second ) {
set_time( hour, minute, second );
push_data( tt,ur,qr,mt,pt,rs );
if ( in_current_interval() ) {
push_data();
} else {
if ( next_hour == hour ) {
prev_instant( hour, minute, second );
// append the second before the last one found, if it is not equal to the prev
if ( prev_hour < h || prev_minute < m || prev_second < s ) {
set_time( h, m, s );
push_empty();
}
// same hour new minute/second, append the last count
set_time( hour, minute, second );
push_data( tt,ur,qr,mt,pt,rs );
// append the second after the last one found, if it is not equal to the next
next_instant( hour, minute, second );
if ( next_hour > h || next_minute > m || next_second > s ) {
set_time( h, m, s );
push_empty();
}
prev_hour = hour; // update now to avoid getting next_hour's value
} else {
// minute & second are always different when the hour is different
if ( hour >= 0 ) {
// append the prev as zero
prev_instant( hour, minute, second );
if ( prev_hour < h || prev_minute < m || prev_second < s ) {
set_time( h, m, s );
push_empty();
}
// apend the last p count if not in the first round of the loop
set_time( hour, minute, second );
push_data( tt,ur,qr,mt,pt,rs );
// append the next as zero
next_instant( hour, minute, second );
if ( next_hour > h || next_minute > m || next_second > s ) {
set_time( h, m, s );
push_empty();
}
} else {
// hout < 0 only in the first round of the loop
// append the second 0 of the day, if it is not the one found
if ( next_hour > 0 || next_minute > 0 || next_second > 0 ) {
push_empty();
// append the second before the first found
prev_instant( next_hour, next_minute, next_second );
if ( h > 0 || m > 0 || s > 0 ) {
set_time( h, m, s );
push_empty();
}
}
}
prev_hour = hour;
hour = next_hour;
increase_intervals();
if ( ! in_current_interval() ) {
push_empty();
do { increase_intervals(); }
while ( ! in_current_interval() );
push_empty();
}
prev_minute = minute;
minute = next_minute;
prev_second = second;
second = next_second;
push_data();
}
tt = toString( query[3] ); // time taken
ur = toString( query[4] ); // uri
qr = toString( query[5] ); // query
mt = toString( query[6] ); // method
pt = toString( query[7] ); // protocol
rs = toString( query[8] ); // response
}
// last one, append the prev count
prev_instant( hour, minute, second );
if ( prev_hour < h || prev_minute < m || prev_second < s ) {
set_time( h, m, s );
increase_intervals();
if ( ! in_current_interval() ) {
push_empty();
}
// append the last count
set_time( hour, minute, second );
push_data( tt,ur,qr,mt,pt,rs );
if ( hour < 23 && minute < 59 && second < 59 ) {
// append 1 second after the last
next_instant( hour, minute, second );
set_time( h, m, s );
push_empty();
}
// append the last fictitious count
time.setTime( QTime( 23, 59, 59 ) );
time.setMSecsSinceEpoch( time.toMSecsSinceEpoch() + 1000 ); // +1s
push_empty();
if ( time > current_interval ) {
current_interval.setSecsSinceEpoch( time.toSecsSinceEpoch()+1 );
push_empty();
}
if ( data.capacity() > data.size() ) {
data.shrink_to_fit();
@ -563,7 +499,7 @@ void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringV
void DbQuery::getItemsCount( std::optional<stats_count_items_t>& result, QStringView web_server, QStringView year, QStringView month, QStringView day, QStringView log_field ) const
{
QHash<QString, unsigned> aux_items;
stats_count_items_t items; // std::map<QString, unsigned int>>
stats_count_items_t items;
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
@ -610,7 +546,7 @@ void DbQuery::getItemsCount( std::optional<stats_count_items_t>& result, QString
// get and count items with a 10 minutes gap for every hour of the day
void DbQuery::getDaytimeCounts( std::optional<stats_day_items_t>& result, QStringView web_server, QStringView from_year_, QStringView from_month_, QStringView from_day_, QStringView to_year_, QStringView to_month_, QStringView to_day_, const LogField log_field_, QStringView field_filter ) const
{
stats_day_items_t data{ // std::unordered_map<int, std::unordered_map<int, int>>
stats_day_items_t data{
{0, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}}, {1, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}},
{2, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}}, {3, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}},
{4, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}}, {5, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}},
@ -743,7 +679,7 @@ void DbQuery::getDaytimeCounts( std::optional<stats_day_items_t>& result, QStrin
// get and count how many times a specific item value brought to another
void DbQuery::getRelationalCountsDay( std::optional<stats_relat_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, const LogField log_field_1_, QStringView field_filter_1, const LogField log_field_2_, QStringView field_filter_2 ) const
{
stats_relat_items_t data; // std::vector<std::tuple<qint64, int>>
stats_relat_items_t data;
int gap = 20;
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
@ -888,7 +824,7 @@ void DbQuery::getRelationalCountsDay( std::optional<stats_relat_items_t>& result
void DbQuery::getRelationalCountsPeriod( std::optional<stats_relat_items_t>& result, QStringView web_server, QStringView from_year_, QStringView from_month_, QStringView from_day_, QStringView to_year_, QStringView to_month_, QStringView to_day_, const LogField log_field_1_, QStringView field_filter_1, const LogField log_field_2_, QStringView field_filter_2 ) const
{
stats_relat_items_t data; // std::vector<std::tuple<qint64, int>>
stats_relat_items_t data;
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
@ -1143,7 +1079,7 @@ void DbQuery::getGlobalCounts( std::optional<GlobalsData>& result, QStringView w
db.open( this->db_path, this->dialog_level==DL_EXPLANATORY );
bool no_data{ true };
int max_date_year, max_date_month, max_date_day;
int max_date_year{0}, max_date_month{0}, max_date_day{0};
double n_days{0.0};
size_t max_date_count{0};
std::array<double, 7> week_days_count{ 0, 0, 0, 0, 0, 0, 0 };

View File

@ -126,6 +126,7 @@ public:
\param uri_f The filter for the URI field
\param query_f The filter for the Query field
\param response_f The filter for the Response field
\param time_interval The time interval used to group the values
\throw VoidException
\throw CrapviewException
\throw ConversionException
@ -141,7 +142,8 @@ public:
QStringView method_f,
QStringView uri_f,
QStringView query_f,
QStringView response_f
QStringView response_f,
const qint64 time_interval
) const;

View File

@ -13,6 +13,9 @@
#include <unordered_map> // leave this here for clang
namespace /*private*/
{
enum StyleId : uint32_t {
TEXT,
WINDOW,
@ -138,6 +141,8 @@ QString getStylesheet()
"}";
}
} //namespace (private)
DialogMsg::DialogMsg(const QString& title, const QString& text, const QString& additional, const MsgType type, QWidget* parent )
: QDialog{ parent }

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 810 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -23,7 +23,9 @@
<file>icons/dark/combobox_arrow.png</file>
<file>icons/dark/conf_blacklists.png</file>
<file>icons/dark/conf_charts.png</file>
<file>icons/dark/conf_charts_style.png</file>
<file>icons/dark/conf_control.png</file>
<file>icons/dark/conf_count.png</file>
<file>icons/dark/conf_databases.png</file>
<file>icons/dark/conf_defaults.png</file>
<file>icons/dark/conf_dialogs.png</file>
@ -33,6 +35,8 @@
<file>icons/dark/conf_off.png</file>
<file>icons/dark/conf_on.png</file>
<file>icons/dark/conf_path.png</file>
<file>icons/dark/conf_relational.png</file>
<file>icons/dark/conf_speed.png</file>
<file>icons/dark/conf_textbrowser.png</file>
<file>icons/dark/conf_warnlists.png</file>
<file>icons/dark/conf_webservers.png</file>
@ -75,7 +79,9 @@
<file>icons/dark_native/checking.png</file>
<file>icons/dark_native/conf_blacklists.png</file>
<file>icons/dark_native/conf_charts.png</file>
<file>icons/dark_native/conf_charts_style.png</file>
<file>icons/dark_native/conf_control.png</file>
<file>icons/dark_native/conf_count.png</file>
<file>icons/dark_native/conf_databases.png</file>
<file>icons/dark_native/conf_defaults.png</file>
<file>icons/dark_native/conf_dialogs.png</file>
@ -85,6 +91,8 @@
<file>icons/dark_native/conf_off.png</file>
<file>icons/dark_native/conf_on.png</file>
<file>icons/dark_native/conf_path.png</file>
<file>icons/dark_native/conf_relational.png</file>
<file>icons/dark_native/conf_speed.png</file>
<file>icons/dark_native/conf_textbrowser.png</file>
<file>icons/dark_native/conf_warnlists.png</file>
<file>icons/dark_native/conf_webservers.png</file>
@ -132,7 +140,9 @@
<file>icons/light/combobox_arrow.png</file>
<file>icons/light/conf_blacklists.png</file>
<file>icons/light/conf_charts.png</file>
<file>icons/light/conf_charts_style.png</file>
<file>icons/light/conf_control.png</file>
<file>icons/light/conf_count.png</file>
<file>icons/light/conf_databases.png</file>
<file>icons/light/conf_defaults.png</file>
<file>icons/light/conf_dialogs.png</file>
@ -142,6 +152,8 @@
<file>icons/light/conf_off.png</file>
<file>icons/light/conf_on.png</file>
<file>icons/light/conf_path.png</file>
<file>icons/light/conf_relational.png</file>
<file>icons/light/conf_speed.png</file>
<file>icons/light/conf_textbrowser.png</file>
<file>icons/light/conf_warnlists.png</file>
<file>icons/light/conf_webservers.png</file>
@ -184,7 +196,9 @@
<file>icons/light_native/checking.png</file>
<file>icons/light_native/conf_blacklists.png</file>
<file>icons/light_native/conf_charts.png</file>
<file>icons/light_native/conf_charts_style.png</file>
<file>icons/light_native/conf_control.png</file>
<file>icons/light_native/conf_count.png</file>
<file>icons/light_native/conf_databases.png</file>
<file>icons/light_native/conf_defaults.png</file>
<file>icons/light_native/conf_dialogs.png</file>
@ -194,6 +208,8 @@
<file>icons/light_native/conf_off.png</file>
<file>icons/light_native/conf_on.png</file>
<file>icons/light_native/conf_path.png</file>
<file>icons/light_native/conf_relational.png</file>
<file>icons/light_native/conf_speed.png</file>
<file>icons/light_native/conf_textbrowser.png</file>
<file>icons/light_native/conf_warnlists.png</file>
<file>icons/light_native/conf_webservers.png</file>

View File

@ -5,6 +5,7 @@
#include "main_lib.h"
#include "utilities/arrays.h"
#include "utilities/io.h"
#include "utilities/strings.h"
#include "utilities/vectors.h"
@ -444,6 +445,54 @@ bool testUtilities()
T_ASSERT_NOT( VecOps::contains<std::string>({"catch","the","flag"}, "flac") );
T_TEST_RESULT()
//// ARRAYS ////
T_TEST_START("IsStdArray")
{
using Array = std::array<int,3>;
T_ASSERT( IsStdArray<Array> );
}{
using Vector = std::vector<int>;
T_ASSERT_NOT( IsStdArray<Vector> );
}
T_TEST_RESULT()
T_TEST_START("ArrayOps::zip")
{
const auto equality{ [](ZippedArrays<std::array<int,3>>& zipped, std::array<std::tuple<int,int>,3>& fake_zipped) -> bool {
size_t i{ 0ul };
for (const auto& tpl : zipped) {
if ( tpl != fake_zipped.at(i) ) return false;
++i;
}
return true;
}};
std::array<int,3> a1{ 1,2,3 };
std::array<int,3> a2{ 10,20,30 };
std::array<std::tuple<int,int>,3> t{ std::make_tuple(1,10),std::make_tuple(2,20),std::make_tuple(3,30) };
ZippedArrays v{ ArrayOps::zip( a1, a2 ) };
T_ASSERT( equality( v, t) );
}
T_TEST_RESULT()
T_TEST_START("ArrayOps::enumerate")
{
const auto equality{ [](EnumeratedArray<std::array<int,3>>& enumerated, std::array<std::tuple<int,int>,3>& fake_enumerated) -> bool {
size_t i{ 0ul };
for (const auto& tpl : enumerated) {
if ( tpl != fake_enumerated.at(i) ) return false;
++i;
}
return true;
}};
std::array<int,3> a{ 10,20,30 };
std::array<std::tuple<int,int>,3> t{ std::make_tuple(0,10),std::make_tuple(1,20),std::make_tuple(2,30) };
EnumeratedArray v{ ArrayOps::enumerate( a ) };
T_ASSERT( equality( v, t) );
}
T_TEST_RESULT()
T_FIN()
}

View File

@ -251,6 +251,26 @@
<source>Redesigned configs section</source>
<translation>Redesigned configs section</translation>
</message>
<message>
<source>Version 4</source>
<translation>Version 4</translation>
</message>
<message>
<source>Stability improvements</source>
<translation>Stability improvements</translation>
</message>
<message>
<source>Generating warnings dinamically</source>
<translation>Generating warnings dinamically</translation>
</message>
<message>
<source>New tool:</source>
<translation>New tool:</translation>
</message>
<message>
<source>Changelog</source>
<translation>Changelog</translation>
</message>
</context>
<context>
<name>Crapinfo</name>
@ -1735,6 +1755,136 @@ Any field not considered by LogDoctor will appear as &apos;DISCARDED&apos;</tran
<source>Show the changelog</source>
<translation>Show the changelog</translation>
</message>
<message>
<source>Speed</source>
<translation>Speed</translation>
</message>
<message>
<source>Represents a step in the time axis, in seconds.
All the values falling inside the same interval will be merged and the mean value will be used.</source>
<translation>Represents a step in the time axis, in seconds. All the values falling inside the same interval will be merged and the mean value will be used.</translation>
</message>
<message>
<source>Time interval</source>
<translation>Time interval</translation>
</message>
<message>
<source>1</source>
<translation>1</translation>
</message>
<message>
<source>2</source>
<translation>2</translation>
</message>
<message>
<source>3</source>
<translation>3</translation>
</message>
<message>
<source>4</source>
<translation>4</translation>
</message>
<message>
<source>5</source>
<translation>5</translation>
</message>
<message>
<source>10</source>
<translation>10</translation>
</message>
<message>
<source>15</source>
<translation>15</translation>
</message>
<message>
<source>20</source>
<translation>20</translation>
</message>
<message>
<source>30</source>
<translation>30</translation>
</message>
<message>
<source>60</source>
<translation>60</translation>
</message>
<message>
<source>120</source>
<translation>120</translation>
</message>
<message>
<source>180</source>
<translation>180</translation>
</message>
<message>
<source>240</source>
<translation>240</translation>
</message>
<message>
<source>300</source>
<translation>300</translation>
</message>
<message>
<source>600</source>
<translation>600</translation>
</message>
<message>
<source>900</source>
<translation>900</translation>
</message>
<message>
<source>1200</source>
<translation>1200</translation>
</message>
<message>
<source>1800</source>
<translation>1800</translation>
</message>
<message>
<source>3600</source>
<translation>3600</translation>
</message>
<message>
<source>The format to use for the labels of the time axis.</source>
<translation>The format to use for the labels of the time axis.</translation>
</message>
<message>
<source>Time format</source>
<translation>Time format</translation>
</message>
<message>
<source>hh:mm</source>
<translation>hh:mm</translation>
</message>
<message>
<source>hh</source>
<translation>hh</translation>
</message>
<message>
<source>The size of the pie</source>
<translation>The size of the pie</translation>
</message>
<message>
<source>Pie size</source>
<translation>Pie size</translation>
</message>
<message>
<source>The maximum number of slices that the pie will be composed of.
Exceeding slices will be grouped into one comprehensive slice.</source>
<translation>The maximum number of slices that the pie will be composed of. Exceeding slices will be grouped into one comprehensive slice.</translation>
</message>
<message>
<source>Maximum slices</source>
<translation>Maximum slices</translation>
</message>
<message>
<source>Relational</source>
<translation>Relational</translation>
</message>
<message>
<source>Appearance</source>
<translation>Appearance</translation>
</message>
</context>
<context>
<name>RichText</name>
@ -2036,5 +2186,9 @@ Any field not considered by LogDoctor will appear as &apos;DISCARDED&apos;</tran
<source>Saturday</source>
<translation>Saturday</translation>
</message>
<message>
<source>Relational Count</source>
<translation>Relational Count</translation>
</message>
</context>
</TS>

View File

@ -251,6 +251,26 @@
<source>Redesigned configs section</source>
<translation type="unfinished">Sección de configuraciones rediseñada</translation>
</message>
<message>
<source>Version 4</source>
<translation type="unfinished">Versión 4</translation>
</message>
<message>
<source>Stability improvements</source>
<translation type="unfinished">Mejoras de estabilidad</translation>
</message>
<message>
<source>Generating warnings dinamically</source>
<translation type="unfinished">Generación dinámica de avisos</translation>
</message>
<message>
<source>New tool:</source>
<translation type="unfinished">Nueva herramienta:</translation>
</message>
<message>
<source>Changelog</source>
<translation type="unfinished">Registro de cambios</translation>
</message>
</context>
<context>
<name>Crapinfo</name>
@ -1738,6 +1758,138 @@ Los campos marcados como &apos;DISCARDED&apos; se analizaron correctamente, pero
<source>Show the changelog</source>
<translation type="unfinished">Mostrar el registro de cambios</translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished">Velocidad</translation>
</message>
<message>
<source>Represents a step in the time axis, in seconds.
All the values falling inside the same interval will be merged and the mean value will be used.</source>
<translation type="unfinished">Representa un paso en el eje del tiempo, en segundos.
Todos los valores que se encuentren dentro del mismo intervalo se fusionarán y se utilizará el valor medio.</translation>
</message>
<message>
<source>Time interval</source>
<translation type="unfinished">Intervalo de tiempo</translation>
</message>
<message>
<source>1</source>
<translation>1</translation>
</message>
<message>
<source>2</source>
<translation>2</translation>
</message>
<message>
<source>3</source>
<translation>3</translation>
</message>
<message>
<source>4</source>
<translation>4</translation>
</message>
<message>
<source>5</source>
<translation>5</translation>
</message>
<message>
<source>10</source>
<translation>10</translation>
</message>
<message>
<source>15</source>
<translation>15</translation>
</message>
<message>
<source>20</source>
<translation>20</translation>
</message>
<message>
<source>30</source>
<translation>30</translation>
</message>
<message>
<source>60</source>
<translation>60</translation>
</message>
<message>
<source>120</source>
<translation>120</translation>
</message>
<message>
<source>180</source>
<translation>180</translation>
</message>
<message>
<source>240</source>
<translation>240</translation>
</message>
<message>
<source>300</source>
<translation>300</translation>
</message>
<message>
<source>600</source>
<translation>600</translation>
</message>
<message>
<source>900</source>
<translation>900</translation>
</message>
<message>
<source>1200</source>
<translation>1200</translation>
</message>
<message>
<source>1800</source>
<translation>1800</translation>
</message>
<message>
<source>3600</source>
<translation>3600</translation>
</message>
<message>
<source>The format to use for the labels of the time axis.</source>
<translation type="unfinished">El formato a utilizar para las etiquetas del eje de tiempo.</translation>
</message>
<message>
<source>Time format</source>
<translation type="unfinished">Formato del tiempo</translation>
</message>
<message>
<source>hh:mm</source>
<translation type="unfinished">hh:mm</translation>
</message>
<message>
<source>hh</source>
<translation type="unfinished">hh</translation>
</message>
<message>
<source>The size of the pie</source>
<translation type="unfinished">El tamaño del gráfico circular</translation>
</message>
<message>
<source>Pie size</source>
<translation type="unfinished">Tamaño del pastel</translation>
</message>
<message>
<source>The maximum number of slices that the pie will be composed of.
Exceeding slices will be grouped into one comprehensive slice.</source>
<translation type="unfinished">El número máximo de porciones de las que estará compuesto el pastel.
Los sectores excedentes se agruparán en un sector comprensivo.</translation>
</message>
<message>
<source>Maximum slices</source>
<translation type="unfinished">Rebanadas máximas</translation>
</message>
<message>
<source>Relational</source>
<translation type="unfinished">Relacional</translation>
</message>
<message>
<source>Appearance</source>
<translation type="unfinished">Apariencia</translation>
</message>
</context>
<context>
<name>RichText</name>
@ -2039,5 +2191,9 @@ Los campos marcados como &apos;DISCARDED&apos; se analizaron correctamente, pero
<source>Saturday</source>
<translation>Sábado</translation>
</message>
<message>
<source>Relational Count</source>
<translation type="unfinished">Recuento relacional</translation>
</message>
</context>
</TS>

View File

@ -251,6 +251,26 @@
<source>Redesigned configs section</source>
<translation type="unfinished">Section de configuration repensée</translation>
</message>
<message>
<source>Version 4</source>
<translation type="unfinished">Version 4</translation>
</message>
<message>
<source>Stability improvements</source>
<translation type="unfinished">Améliorations de la stabilité</translation>
</message>
<message>
<source>Generating warnings dinamically</source>
<translation type="unfinished">Génération dynamique des alertes</translation>
</message>
<message>
<source>New tool:</source>
<translation type="unfinished">Nouvel outil:</translation>
</message>
<message>
<source>Changelog</source>
<translation type="unfinished">Journal des modifications</translation>
</message>
</context>
<context>
<name>Crapinfo</name>
@ -1738,6 +1758,138 @@ Les champs marqués comme &apos;DISCARDED&apos; ont été analysés correctement
<source>Show the changelog</source>
<translation type="unfinished">Afficher le journal des modifications</translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished">Vitesse</translation>
</message>
<message>
<source>Represents a step in the time axis, in seconds.
All the values falling inside the same interval will be merged and the mean value will be used.</source>
<translation type="unfinished">Représente une étape sur l&apos;axe du temps, en secondes.
Toutes les valeurs comprises dans le même intervalle seront fusionnées et la valeur moyenne sera utilisée.</translation>
</message>
<message>
<source>Time interval</source>
<translation type="unfinished">Intervalle de temps</translation>
</message>
<message>
<source>1</source>
<translation>1</translation>
</message>
<message>
<source>2</source>
<translation>2</translation>
</message>
<message>
<source>3</source>
<translation>3</translation>
</message>
<message>
<source>4</source>
<translation>4</translation>
</message>
<message>
<source>5</source>
<translation>5</translation>
</message>
<message>
<source>10</source>
<translation>10</translation>
</message>
<message>
<source>15</source>
<translation>15</translation>
</message>
<message>
<source>20</source>
<translation>20</translation>
</message>
<message>
<source>30</source>
<translation>30</translation>
</message>
<message>
<source>60</source>
<translation>60</translation>
</message>
<message>
<source>120</source>
<translation>120</translation>
</message>
<message>
<source>180</source>
<translation>180</translation>
</message>
<message>
<source>240</source>
<translation>240</translation>
</message>
<message>
<source>300</source>
<translation>300</translation>
</message>
<message>
<source>600</source>
<translation>600</translation>
</message>
<message>
<source>900</source>
<translation>900</translation>
</message>
<message>
<source>1200</source>
<translation>1200</translation>
</message>
<message>
<source>1800</source>
<translation>1800</translation>
</message>
<message>
<source>3600</source>
<translation>3600</translation>
</message>
<message>
<source>The format to use for the labels of the time axis.</source>
<translation type="unfinished">Le format à utiliser pour les étiquettes de l&apos;axe du temps.</translation>
</message>
<message>
<source>Time format</source>
<translation type="unfinished">Format de l&apos;heure</translation>
</message>
<message>
<source>hh:mm</source>
<translation type="unfinished">hh:mm</translation>
</message>
<message>
<source>hh</source>
<translation type="unfinished">hh</translation>
</message>
<message>
<source>The size of the pie</source>
<translation type="unfinished">La taille du diagramme circulaire</translation>
</message>
<message>
<source>Pie size</source>
<translation type="unfinished">Taille de la tarte</translation>
</message>
<message>
<source>The maximum number of slices that the pie will be composed of.
Exceeding slices will be grouped into one comprehensive slice.</source>
<translation type="unfinished">Le nombre maximum de tranches dont la tarte sera composée.
Les tranches excédentaires seront regroupées en une seule tranche compréhensif.</translation>
</message>
<message>
<source>Maximum slices</source>
<translation type="unfinished">Tranches maximales</translation>
</message>
<message>
<source>Relational</source>
<translation type="unfinished">Relationnelle</translation>
</message>
<message>
<source>Appearance</source>
<translation type="unfinished">Apparence</translation>
</message>
</context>
<context>
<name>RichText</name>
@ -2039,5 +2191,9 @@ Les champs marqués comme &apos;DISCARDED&apos; ont été analysés correctement
<source>Saturday</source>
<translation type="unfinished">Samedi</translation>
</message>
<message>
<source>Relational Count</source>
<translation type="unfinished">Nombre relationnel</translation>
</message>
</context>
</TS>

View File

@ -251,6 +251,26 @@
<source>Redesigned configs section</source>
<translation>Ridisegnata la sezione delle configurazioni</translation>
</message>
<message>
<source>Version 4</source>
<translation>Versione 4</translation>
</message>
<message>
<source>Stability improvements</source>
<translation>Miglioramenti alla stabilità</translation>
</message>
<message>
<source>Generating warnings dinamically</source>
<translation>Generazione dinamica degli avvertimenti</translation>
</message>
<message>
<source>New tool:</source>
<translation>Nuovo attrezzo:</translation>
</message>
<message>
<source>Changelog</source>
<translation>Cambiamenti</translation>
</message>
</context>
<context>
<name>Crapinfo</name>
@ -1739,6 +1759,138 @@ I campi non considerati da LogDocrot appariranno come &apos;DISCARDED&apos;</tra
<source>Show the changelog</source>
<translation>Mostra i cambiamenti</translation>
</message>
<message>
<source>Speed</source>
<translation>Velocità</translation>
</message>
<message>
<source>Represents a step in the time axis, in seconds.
All the values falling inside the same interval will be merged and the mean value will be used.</source>
<translation>Rappresenta l&apos;intervallo nell&apos;asse del tempo, in secondi.
Tutti i valori appartenenti allo stesso intervallo verranno accumulati e sarà usato il valore medio.</translation>
</message>
<message>
<source>Time interval</source>
<translation>Intervallo di tempo</translation>
</message>
<message>
<source>1</source>
<translation>1</translation>
</message>
<message>
<source>2</source>
<translation>2</translation>
</message>
<message>
<source>3</source>
<translation>3</translation>
</message>
<message>
<source>4</source>
<translation>4</translation>
</message>
<message>
<source>5</source>
<translation>5</translation>
</message>
<message>
<source>10</source>
<translation>10</translation>
</message>
<message>
<source>15</source>
<translation>15</translation>
</message>
<message>
<source>20</source>
<translation>20</translation>
</message>
<message>
<source>30</source>
<translation>30</translation>
</message>
<message>
<source>60</source>
<translation>60</translation>
</message>
<message>
<source>120</source>
<translation>120</translation>
</message>
<message>
<source>180</source>
<translation>180</translation>
</message>
<message>
<source>240</source>
<translation>240</translation>
</message>
<message>
<source>300</source>
<translation>300</translation>
</message>
<message>
<source>600</source>
<translation>600</translation>
</message>
<message>
<source>900</source>
<translation>900</translation>
</message>
<message>
<source>1200</source>
<translation>1200</translation>
</message>
<message>
<source>1800</source>
<translation>1800</translation>
</message>
<message>
<source>3600</source>
<translation>3600</translation>
</message>
<message>
<source>The format to use for the labels of the time axis.</source>
<translation>Il formato da usare per le etichette dell&apos;asse del tempo.</translation>
</message>
<message>
<source>Time format</source>
<translation>Formato dell&apos;orario</translation>
</message>
<message>
<source>hh:mm</source>
<translation>hh:mm</translation>
</message>
<message>
<source>hh</source>
<translation>hh</translation>
</message>
<message>
<source>The size of the pie</source>
<translation>La dimensione del grafico a torta</translation>
</message>
<message>
<source>Pie size</source>
<translation>Dimensione del grafico</translation>
</message>
<message>
<source>The maximum number of slices that the pie will be composed of.
Exceeding slices will be grouped into one comprehensive slice.</source>
<translation>Il numero massimo di fette in cui verrà diviso il grafico a torta.
Le porzioni in eccesso verratto raggruppate in una singola fetta.</translation>
</message>
<message>
<source>Maximum slices</source>
<translation>Massimo numero di fette</translation>
</message>
<message>
<source>Relational</source>
<translation>Relazionale</translation>
</message>
<message>
<source>Appearance</source>
<translation>Aspetto</translation>
</message>
</context>
<context>
<name>RichText</name>
@ -2040,5 +2192,9 @@ I campi non considerati da LogDocrot appariranno come &apos;DISCARDED&apos;</tra
<source>Saturday</source>
<translation>Sabato</translation>
</message>
<message>
<source>Relational Count</source>
<translation>Conteggio relazionale</translation>
</message>
</context>
</TS>

View File

@ -251,6 +251,26 @@
<source>Redesigned configs section</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Version 4</source>
<translation type="unfinished">4</translation>
</message>
<message>
<source>Stability improvements</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Generating warnings dinamically</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>New tool:</source>
<translation type="unfinished">:</translation>
</message>
<message>
<source>Changelog</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Crapinfo</name>
@ -1738,6 +1758,138 @@ LogDoctor によって考慮されないフィールドは、「DISCARDED」と
<source>Show the changelog</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Represents a step in the time axis, in seconds.
All the values falling inside the same interval will be merged and the mean value will be used.</source>
<translation type="unfinished">
使</translation>
</message>
<message>
<source>Time interval</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>1</source>
<translation type="unfinished">1</translation>
</message>
<message>
<source>2</source>
<translation type="unfinished">2</translation>
</message>
<message>
<source>3</source>
<translation type="unfinished">3</translation>
</message>
<message>
<source>4</source>
<translation type="unfinished">4</translation>
</message>
<message>
<source>5</source>
<translation type="unfinished">5</translation>
</message>
<message>
<source>10</source>
<translation type="unfinished">10</translation>
</message>
<message>
<source>15</source>
<translation type="unfinished">15</translation>
</message>
<message>
<source>20</source>
<translation type="unfinished">20</translation>
</message>
<message>
<source>30</source>
<translation type="unfinished">30</translation>
</message>
<message>
<source>60</source>
<translation type="unfinished">60</translation>
</message>
<message>
<source>120</source>
<translation type="unfinished">120</translation>
</message>
<message>
<source>180</source>
<translation type="unfinished">180</translation>
</message>
<message>
<source>240</source>
<translation type="unfinished">240</translation>
</message>
<message>
<source>300</source>
<translation type="unfinished">300</translation>
</message>
<message>
<source>600</source>
<translation type="unfinished">600</translation>
</message>
<message>
<source>900</source>
<translation type="unfinished">900</translation>
</message>
<message>
<source>1200</source>
<translation type="unfinished">1200</translation>
</message>
<message>
<source>1800</source>
<translation type="unfinished">1800</translation>
</message>
<message>
<source>3600</source>
<translation type="unfinished">3600</translation>
</message>
<message>
<source>The format to use for the labels of the time axis.</source>
<translation type="unfinished">使</translation>
</message>
<message>
<source>Time format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>hh:mm</source>
<translation type="unfinished">hh:mm</translation>
</message>
<message>
<source>hh</source>
<translation type="unfinished">hh</translation>
</message>
<message>
<source>The size of the pie</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pie size</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The maximum number of slices that the pie will be composed of.
Exceeding slices will be grouped into one comprehensive slice.</source>
<translation type="unfinished">
1 </translation>
</message>
<message>
<source>Maximum slices</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Relational</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Appearance</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RichText</name>
@ -2039,5 +2191,9 @@ LogDoctor によって考慮されないフィールドは、「DISCARDED」と
<source>Saturday</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Relational Count</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -251,6 +251,26 @@
<source>Redesigned configs section</source>
<translation type="unfinished">Seção de configurações redesenhada</translation>
</message>
<message>
<source>Version 4</source>
<translation type="unfinished">Versão 4</translation>
</message>
<message>
<source>Stability improvements</source>
<translation type="unfinished">Melhorias de estabilidade</translation>
</message>
<message>
<source>Generating warnings dinamically</source>
<translation type="unfinished">Geração dinâmica dos avisos</translation>
</message>
<message>
<source>New tool:</source>
<translation type="unfinished">Nova ferramenta:</translation>
</message>
<message>
<source>Changelog</source>
<translation type="unfinished">Registro de alterações</translation>
</message>
</context>
<context>
<name>Crapinfo</name>
@ -1738,6 +1758,138 @@ Campos marcados como &apos;DISCARDED&apos; analisados corretamente, mas o
<source>Show the changelog</source>
<translation type="unfinished">Mostrar o registro de alterações</translation>
</message>
<message>
<source>Speed</source>
<translation type="unfinished">Velocidade</translation>
</message>
<message>
<source>Represents a step in the time axis, in seconds.
All the values falling inside the same interval will be merged and the mean value will be used.</source>
<translation type="unfinished">Representa uma etapa no eixo do tempo, em segundos.
Todos os valores dentro do mesmo intervalo serão mesclados e o valor médio será usado.</translation>
</message>
<message>
<source>Time interval</source>
<translation type="unfinished">Intervalo de tempo</translation>
</message>
<message>
<source>1</source>
<translation>1</translation>
</message>
<message>
<source>2</source>
<translation>2</translation>
</message>
<message>
<source>3</source>
<translation>3</translation>
</message>
<message>
<source>4</source>
<translation>4</translation>
</message>
<message>
<source>5</source>
<translation>5</translation>
</message>
<message>
<source>10</source>
<translation>10</translation>
</message>
<message>
<source>15</source>
<translation>15</translation>
</message>
<message>
<source>20</source>
<translation>20</translation>
</message>
<message>
<source>30</source>
<translation>30</translation>
</message>
<message>
<source>60</source>
<translation>60</translation>
</message>
<message>
<source>120</source>
<translation>120</translation>
</message>
<message>
<source>180</source>
<translation>180</translation>
</message>
<message>
<source>240</source>
<translation>240</translation>
</message>
<message>
<source>300</source>
<translation>300</translation>
</message>
<message>
<source>600</source>
<translation>600</translation>
</message>
<message>
<source>900</source>
<translation>900</translation>
</message>
<message>
<source>1200</source>
<translation>1200</translation>
</message>
<message>
<source>1800</source>
<translation>1800</translation>
</message>
<message>
<source>3600</source>
<translation>3600</translation>
</message>
<message>
<source>The format to use for the labels of the time axis.</source>
<translation type="unfinished">O formato a ser usado para os rótulos do eixo do tempo.</translation>
</message>
<message>
<source>Time format</source>
<translation type="unfinished">Formato de hora</translation>
</message>
<message>
<source>hh:mm</source>
<translation type="unfinished">hh:mm</translation>
</message>
<message>
<source>hh</source>
<translation type="unfinished">hh</translation>
</message>
<message>
<source>The size of the pie</source>
<translation type="unfinished">O tamanho do gráfico de pizza</translation>
</message>
<message>
<source>Pie size</source>
<translation type="unfinished">Tamanho da torta</translation>
</message>
<message>
<source>The maximum number of slices that the pie will be composed of.
Exceeding slices will be grouped into one comprehensive slice.</source>
<translation type="unfinished">O número máximo de fatias que comporão a torta.
As fatias excedentes serão agrupadas em uma fatia abrangente.</translation>
</message>
<message>
<source>Maximum slices</source>
<translation type="unfinished">Número máximo de fatias</translation>
</message>
<message>
<source>Relational</source>
<translation type="unfinished">Relacional</translation>
</message>
<message>
<source>Appearance</source>
<translation type="unfinished">Aparência</translation>
</message>
</context>
<context>
<name>RichText</name>
@ -2039,5 +2191,9 @@ Campos marcados como &apos;DISCARDED&apos; analisados corretamente, mas o
<source>Saturday</source>
<translation>Sábado</translation>
</message>
<message>
<source>Relational Count</source>
<translation type="unfinished">Contagem Relacional</translation>
</message>
</context>
</TS>

View File

@ -6,6 +6,19 @@
#include <tuple>
template <typename T>
struct is_std_array : std::false_type {};
template <typename T, std::size_t N>
struct is_std_array<std::array<T,N>> : std::true_type {};
template <typename T, std::size_t N>
struct is_std_array<const std::array<T,N>> : std::true_type {};
template <typename A>
concept IsStdArray = is_std_array<A>::value;
template <typename Array>
struct Zipperator
{
@ -87,12 +100,12 @@ public:
template <typename Array>
class EnumeratdArray
class EnumeratedArray
{
const Array& arr;
public:
explicit EnumeratdArray( const Array& a )
explicit EnumeratedArray( const Array& a )
: arr{a} {}
inline auto begin() noexcept
@ -118,6 +131,7 @@ namespace ArrayOps
\todo Replace with std::views::zip when clang will fully support it
*/
template <typename Array>
requires IsStdArray<Array>
inline auto zip( Array& l_array, Array& r_array )
{
return ZippedArrays<Array>( l_array, r_array );
@ -131,9 +145,10 @@ inline auto zip( Array& l_array, Array& r_array )
\todo Replace with std::views::enumerate when clang will fully support it
*/
template <typename Array>
requires IsStdArray<Array>
inline auto enumerate( const Array& array )
{
return EnumeratdArray<Array>( array );
return EnumeratedArray<Array>( array );
}
} // namespace ArrayOps

View File

@ -24,6 +24,9 @@
#define CHUNK 16384
namespace /*private*/
{
//! RAII class to handle s file resource
class FileHandler final
{
@ -73,6 +76,8 @@ public:
}
};
} //namespace (private)
namespace GZutils

View File

@ -10,6 +10,9 @@
#include <fstream>
namespace /*private*/
{
//! RAII class to handle a file stream resource
template<typename Stream>
class FileHandler final
@ -48,6 +51,8 @@ public:
}
};
} //namespace (private)
namespace IOutils

View File

@ -11,6 +11,9 @@
#include <unordered_map>
namespace /*private*/
{
enum StyleId : uint32_t {
TEXT_PRIMARY,
TEXT_DISABLED,
@ -92,8 +95,12 @@ enum StyleId : uint32_t {
CONFIGS_TREE_BASE
};
} //namespace (private)
using StyleMap = std::unordered_map<StyleId, QString>;
StyleMap makeStyleMap()
{
switch ( GlobalConfigs::window_theme ) {
@ -582,58 +589,75 @@ QString getStyleSheet()
" selection-background-color: "% style.at(BOXES_BASE_SELECTION) %";"
"}"
// spin boxes
"QSpinBox {"
"QSpinBox,"
"QDoubleSpinBox {"
" border-radius: 4px;"
" color: "% style.at(LINEDIT_TEXT) %";"
" background-color: "% style.at(LINEDIT_BASE) %";"
" selection-color: "% style.at(LINEDIT_TEXT) %";"
" selection-background-color: "% style.at(LINEDIT_BASE_SELECTION) %";"
"}"
"QSpinBox::focus {"
"QSpinBox::focus,"
"QDoubleSpinBox::focus {"
" background-color: "% style.at(LINEDIT_BASE_FOCUS) %";"
"}"
"QSpinBox::disabled {"
"QSpinBox::disabled,"
"QDoubleSpinBox::disabled {"
" border-color: "% style.at(BOXES_BASE_DISABLED) %";"
" color: "% style.at(TEXT_DISABLED) %";"
" background-color: "% style.at(BOXES_BASE_DISABLED) %";"
"}"
"QSpinBox::up-button,"
"QSpinBox::down-button {"
"QSpinBox::down-button,"
"QDoubleSpinBox::up-button,"
"QDoubleSpinBox::down-button {"
" padding: 2px;"
" border-left: 2px solid "% style.at(BOXES_DECO) %";"
" background-color: "% style.at(BOXES_BASE_SECONDARY) %";"
"}"
"QSpinBox::up-button:hover,"
"QSpinBox::down-button:hover {"
"QSpinBox::down-button:hover,"
"QDoubleSpinBox::up-button:hover,"
"QDoubleSpinBox::down-button:hover {"
" background-color: "% style.at(BOXES_BASE_SELECTION) %";"
"}"
"QSpinBox::up-button:off,"
"QSpinBox::down-button:off {"
"QSpinBox::down-button:off,"
"QDoubleSpinBox::up-button:off,"
"QDoubleSpinBox::down-button:off {"
" background-color: "% style.at(BOXES_BASE_DISABLED) %";"
"}"
"QSpinBox::up-button:disabled,"
"QSpinBox::down-button:disabled {"
"QSpinBox::down-button:disabled,"
"QDoubleSpinBox::up-button:disabled,"
"QDoubleSpinBox::down-button:disabled {"
" border-left-color: "% style.at(BOXES_BASE_PRIMARY) %";"
" background-color: "% style.at(BOXES_BASE_DISABLED) %";"
"}"
"QSpinBox::up-arrow {"
"QSpinBox::up-arrow,"
"QDoubleSpinBox::up-arrow {"
" width: 7px;"
" height: 7px;"
" padding: 2px;"
" image: url(:/icons/icons/"% icons_theme %"/spinbox_add.png);"
"}"
"QSpinBox::up-arrow:off,"
"QSpinBox::up-arrow:disabled {"
"QSpinBox::up-arrow:disabled,"
"QDoubleSpinBox::up-arrow:off,"
"QDoubleSpinBox::up-arrow:disabled {"
" image: url(:/icons/icons/midtone/spinbox_add.png);"
"}"
"QSpinBox::down-arrow {"
"QSpinBox::down-arrow,"
"QDoubleSpinBox::down-arrow {"
" width: 7px;"
" height: 7px;"
" padding: 2px;"
" image: url(:/icons/icons/"% icons_theme %"/spinbox_sub.png);"
"}"
"QSpinBox::down-arrow:off,"
"QSpinBox::down-arrow:disabled {"
"QSpinBox::down-arrow:disabled,"
"QDoubleSpinBox::down-arrow:off,"
"QDoubleSpinBox::down-arrow:disabled {"
" image: url(:/icons/icons/midtone/spinbox_sub.png);"
"}"
// scroll bars

View File

@ -44,7 +44,7 @@ fi
cd build
# Prepare the cmake files
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
if [[ "$?" != "0" ]]
then
# an error occured during preparation

View File

@ -44,7 +44,7 @@ fi
cd build
# Prepare the cmake files
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
if [[ "$?" != "0" ]]
then
# an error occured during preparation

View File

@ -23,7 +23,7 @@ fi
cd build
# Prepare the cmake files
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
if [[ "$?" != "0" ]]
then
# an error occured during preparation

View File

@ -44,7 +44,7 @@ fi
cd build
# Prepare the cmake files
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
if [[ "$?" != "0" ]]
then
# an error occured during preparation

View File

@ -44,7 +44,7 @@ fi
cd build
# Prepare the cmake files
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
if [[ "$?" != "0" ]]
then
# an error occured during preparation

View File

@ -44,7 +44,7 @@ fi
mkdir build && cd build
# Prepare the cmake files
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
if [[ "$?" != "0" ]]
then
# an error occured during preparation

View File

@ -43,7 +43,7 @@ fi
mkdir build && cd build
# Prepare the cmake files
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
if [[ "$?" != "0" ]]
then
# an error occured during preparation

View File

@ -420,7 +420,7 @@ IF ERRORLEVEL 1 (
cd build
:: Prepare build files
"%cmake_path%" "%logdocdir%/logdoctor" "-DCMAKE_BUILD_TYPE:STRING=MinSizeRel" "-DCMAKE_GENERATOR:STRING=NMake Makefiles JOM" "-DCMAKE_MAKE_PROGRAM:STRING=jom" "-DCMAKE_CXX_COMPILER:FILEPATH=%cxx_compiler%" "-DCMAKE_PREFIX_PATH:PATH=%prefix_path%" "-DQT_DIR:PATH=%qt_dir%"
"%cmake_path%" "%logdocdir%/logdoctor" "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_GENERATOR:STRING=NMake Makefiles JOM" "-DCMAKE_MAKE_PROGRAM:STRING=jom" "-DCMAKE_CXX_COMPILER:FILEPATH=%cxx_compiler%" "-DCMAKE_PREFIX_PATH:PATH=%prefix_path%" "-DQT_DIR:PATH=%qt_dir%"
IF ERRORLEVEL 1 (
ECHO:
ECHO Error: failed to prepare cmake files