383 lines
13 KiB
C++
383 lines
13 KiB
C++
#ifndef LOGDOCTOR__CRAPVIEW__MODULES__QUERY_H
|
|
#define LOGDOCTOR__CRAPVIEW__MODULES__QUERY_H
|
|
|
|
#include "lib.h"
|
|
|
|
#include "main_lib.h"
|
|
|
|
#include "modules/shared.h"
|
|
|
|
#include "modules/crapview/lib.h"
|
|
|
|
#include <unordered_map>
|
|
#include <optional>
|
|
|
|
|
|
class DbQuery final
|
|
{
|
|
CRAPVIEW_DATA_TYPEDEFS
|
|
|
|
public:
|
|
|
|
explicit DbQuery() noexcept {}
|
|
Q_DISABLE_COPY_MOVE(DbQuery)
|
|
|
|
// log fields enums to log fields strings
|
|
const std::unordered_map<LogField, std::string> FIELDS{
|
|
{LogField::Warning, FIELDS__WARNING},
|
|
{LogField::Protocol, FIELDS__PROTOCOL},
|
|
{LogField::Method, FIELDS__METHOD},
|
|
{LogField::Uri, FIELDS__URI},
|
|
{LogField::Query, FIELDS__QUERY},
|
|
{LogField::ResponseCode, FIELDS__RESPONSE_CODE},
|
|
{LogField::TimeTaken, FIELDS__TIME_TAKEN},
|
|
{LogField::BytesSent, FIELDS__BYTES_SENT},
|
|
{LogField::BytesReceived, FIELDS__BYTES_RECEIVED},
|
|
{LogField::Referrer, FIELDS__REFERRER},
|
|
{LogField::Cookie, FIELDS__COOKIE},
|
|
{LogField::Client, FIELDS__CLIENT},
|
|
{LogField::UserAgent, FIELDS__USER_AGENT} };
|
|
|
|
// convert month numbers to month names
|
|
const std::unordered_map<int, std::string> MONTHS{
|
|
{1, MONTHS__JANUARY}, {2, MONTHS__FEBRUARY}, {3, MONTHS__MARCH},
|
|
{4, MONTHS__APRIL}, {5, MONTHS__MAY}, {6, MONTHS__JUNE},
|
|
{7, MONTHS__JULY}, {8, MONTHS__AUGUST}, {9, MONTHS__SEPTEMBER},
|
|
{10,MONTHS__OCTOBER}, {11,MONTHS__NOVEMBER}, {12,MONTHS__DECEMBER} };
|
|
|
|
// convert week-day numbers to day names
|
|
const std::unordered_map<int, std::string> DAYS{
|
|
{1, DAYS__MONDAY}, {2, DAYS__TUESDAY}, {3, DAYS__WEDNESDAY},
|
|
{4, DAYS__THURSDAY}, {5, DAYS__FRIDAY}, {6, DAYS__SATURDAY},
|
|
{7, DAYS__SUNDAY} };
|
|
|
|
|
|
//! Returns the Dialogs level
|
|
void setDialogLevel( const DialogsLevel new_level ) noexcept;
|
|
|
|
|
|
//! Sets the path for the logs Collection database
|
|
/*!
|
|
\see Crapview::setDbPath()
|
|
*/
|
|
void setDbPath( std::string&& path ) noexcept;
|
|
|
|
/*const std::string getDbPath( const int web_server );*/
|
|
|
|
//! Returns the number of months in a given period
|
|
/*!
|
|
\overload const int getMonthsCount(const int& from_year, const int& from_month, const int& to_year, const int& to_month)
|
|
\param from_year The initial year
|
|
\param from_month The initial month
|
|
\param to_year The final Year
|
|
\param to_month The final month
|
|
\return The number of months in the period
|
|
\throw ConversionException
|
|
\throw DateTimeException
|
|
*/
|
|
int countMonths(
|
|
QStringView from_year,
|
|
QStringView from_month,
|
|
QStringView to_year,
|
|
QStringView to_month
|
|
) const;
|
|
|
|
|
|
//! Refreshes the dates which are available in the database
|
|
/*!
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\throw VoidException
|
|
\throw ConversionException
|
|
*/
|
|
void refreshDates( std::optional<database_dates_t>& result ) noexcept;
|
|
|
|
|
|
//! Retrieves the data needed for the Warnings statistics
|
|
/*!
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\param web_server The ID of the Web Server to use
|
|
\param year_ The year
|
|
\param month_ The month
|
|
\param day_ The day
|
|
\param hour_ The hour
|
|
\throw VoidException
|
|
\throw ConversionException
|
|
\throw DateTimeException
|
|
*/
|
|
void getWarningsData(
|
|
std::optional<stats_warn_items_t>& result,
|
|
QStringView web_server,
|
|
QStringView year_,
|
|
QStringView month_,
|
|
QStringView day_,
|
|
QStringView hour_
|
|
) const;
|
|
|
|
|
|
//! Retrieves the data needed for the Speed statistics
|
|
/*!
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\param web_server The ID of the Web Server to use
|
|
\param year_ The year
|
|
\param month_ The month
|
|
\param day_ The day
|
|
\param protocol_f The filter for the Protocol field
|
|
\param method_f The filter for the Method field
|
|
\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
|
|
\throw VoidException
|
|
\throw CrapviewException
|
|
\throw ConversionException
|
|
\throw DateTimeException
|
|
*/
|
|
void 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;
|
|
|
|
|
|
//! Retrieves the data needed for the Counts statistics
|
|
/*!
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\param web_server The ID of the Web Server to use
|
|
\param year The year
|
|
\param month The month
|
|
\param day The day
|
|
\param log_field The log field
|
|
\throw VoidException
|
|
\throw CrapviewException
|
|
\throw DateTimeException
|
|
*/
|
|
void getItemsCount(
|
|
std::optional<stats_count_items_t>& result,
|
|
QStringView web_server,
|
|
QStringView year,
|
|
QStringView month,
|
|
QStringView day,
|
|
QStringView log_field
|
|
) const;
|
|
|
|
|
|
//! Retrieves the data needed for the Daytime statistics
|
|
/*!
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\param web_server The ID of the Web Server to use
|
|
\param from_year_ The initial year
|
|
\param from_month_ The initial month
|
|
\param from_day_ The initial day
|
|
\param to_year_ The final year
|
|
\param to_month_ The final month
|
|
\param to_day_ The final day
|
|
\param log_field_ The log field to filter
|
|
\param field_filter The filter to apply
|
|
\throw VoidException
|
|
\throw CrapviewException
|
|
\throw ConversionException
|
|
\throw DateTimeException
|
|
*/
|
|
void 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;
|
|
|
|
|
|
//! Retrieves the data needed for the Relationsl statistics
|
|
/*!
|
|
Used when querying a single day
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\param web_server The ID of the Web Server to use
|
|
\param year_ The year
|
|
\param month_ The month
|
|
\param day_ The day
|
|
\param log_field_1_ The first log field to filter
|
|
\param field_filter_1 The filter to apply to the first field
|
|
\param log_field_2_ The second log field to filter
|
|
\param field_filter_2 The filter to apply to the second fiend
|
|
\throw VoidException
|
|
\throw CrapviewException
|
|
\throw ConversionException
|
|
\throw DateTimeException
|
|
\see getRelationalCountsPeriod()
|
|
*/
|
|
void 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;
|
|
|
|
//! Retrieves the data needed for the Relational statistics
|
|
/*!
|
|
Used when querying a period of time
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\param web_server The ID of the Web Server to use
|
|
\param from_year_ The initial year
|
|
\param from_month_ The initial month
|
|
\param from_day_ The initial day
|
|
\param to_year_ The final year
|
|
\param to_month_ The final month
|
|
\param to_day_ The final day
|
|
\param log_field_1_ The first log field to filter
|
|
\param field_filter_1 The filter to apply to the first field
|
|
\param log_field_2_ The second log field to filter
|
|
\param field_filter_2 The filter to apply to the second fiend
|
|
\throw VoidException
|
|
\throw CrapviewException
|
|
\throw ConversionException
|
|
\throw DateTimeException
|
|
\see getRelationalCountsDay()
|
|
*/
|
|
void 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;
|
|
|
|
|
|
//! Retrieves the data needed for the Global statistics
|
|
/*!
|
|
\param result Holds the data only if the operation completed succssfully
|
|
\param web_server The ID of the Web Server to use
|
|
\param dates The dates to query
|
|
\throw VoidException
|
|
\throw CrapviewException
|
|
\throw ConversionException
|
|
*/
|
|
void getGlobalCounts(
|
|
std::optional<GlobalsData>& result,
|
|
QStringView web_server,
|
|
const stats_dates_t& dates
|
|
) const;
|
|
|
|
|
|
private:
|
|
|
|
// leave TR::tr here to make them appear in the translatable phrases
|
|
const std::string MSG_ERR_UNX_WS{ TR::tr("Unexpected WebServer").toStdString() };
|
|
const std::string MSG_ERR_PROCESSING{ TR::tr("An error occured while processing").toStdString() };
|
|
const std::string MSG_ERR_PROCESSING_DATES{ TR::tr("An error occured while processing dates").toStdString() };
|
|
const std::string MSG_ERR_PARSING_YMD{ TR::tr("An error occured while parsing %1 from the database").toStdString() };
|
|
const std::string WORD_YEARS{ TR::tr("Years").toStdString() };
|
|
const std::string WORD_MONTHS{ TR::tr("Months").toStdString() };
|
|
const std::string WORD_DAYS{ TR::tr("Days").toStdString() };
|
|
const std::string MSG_RESPONSIBLE_VALUE{ TR::tr("Value responsible for the error").toStdString() };
|
|
const std::string MSG_TABLE_NAME{ TR::tr("Database table name").toStdString() };
|
|
|
|
// quantity of information to display throught dialogs
|
|
DialogsLevel dialog_level{ DL_NORMAL };
|
|
|
|
std::string db_path;
|
|
QString db_name;
|
|
|
|
// convert log fields to database fields
|
|
const std::unordered_map<LogField, QString> LogFields_to_DbFields{
|
|
{LogField::Warning, "warning"},
|
|
{LogField::Protocol, "protocol"},
|
|
{LogField::Method, "method"},
|
|
{LogField::Uri, "uri"},
|
|
{LogField::Query, "query"},
|
|
{LogField::ResponseCode, "response"},
|
|
{LogField::TimeTaken, "time_taken"},
|
|
{LogField::BytesSent, "bytes_sent"},
|
|
{LogField::BytesReceived, "bytes_received"},
|
|
{LogField::Referrer, "referrer"},
|
|
{LogField::Client, "client"},
|
|
{LogField::UserAgent, "user_agent"},
|
|
{LogField::Cookie, "cookie"}
|
|
};
|
|
|
|
//! Returns the database field corresponding to the relative log field
|
|
/*!
|
|
\param fld The log field
|
|
\return The database field
|
|
\throw CrapviewException
|
|
*/
|
|
const QString& getDbField( const LogField fld ) const;
|
|
|
|
//! Returns the database field corresponding to the relative log field
|
|
/*!
|
|
\param tr_fld The log field, hendles translated text
|
|
\return The database field
|
|
\throw CrapviewException
|
|
*/
|
|
const QString& getDbField( QStringView tr_fld ) const;
|
|
|
|
|
|
//! Returns the minute gap for the given minute with the given gap
|
|
/*!
|
|
\param minute The minute of the hour
|
|
\param gap The gap used to split the hour
|
|
\return The gap index
|
|
\throw DateTimeException
|
|
*/
|
|
static int getMinuteGap( const int minute, const int gap=10 );
|
|
|
|
|
|
//! Returns the number of days for a given month
|
|
/*!
|
|
\param year The year, used to handle leap years
|
|
\param month The month
|
|
\return The number of days
|
|
\throw DateTimeException
|
|
*/
|
|
static int getMonthDays( const int year, const int month );
|
|
|
|
//! Returns the month number in the year
|
|
/*!
|
|
\param month_str The month
|
|
\return The month number
|
|
\throw DateTimeException
|
|
*/
|
|
int getMonthNumber( QStringView month_str ) const;
|
|
|
|
|
|
//! Returns the number of days in a given period
|
|
/*!
|
|
\param from_year The initial year
|
|
\param from_month The initial month
|
|
\param from_day The initial day
|
|
\param to_year The final Year
|
|
\param to_month The final month
|
|
\param to_day The final day
|
|
\return The number of days
|
|
\throw DateTimeException
|
|
*/
|
|
static int countDays(
|
|
const int from_year, const int from_month, const int from_day,
|
|
const int to_year, const int to_month, const int to_day
|
|
);
|
|
|
|
|
|
//! Returns the number of months in a given period
|
|
/*!
|
|
\param from_year The initial year
|
|
\param from_month The initial month
|
|
\param to_year The final Year
|
|
\param to_month The final month
|
|
\return The number of months in the period
|
|
*/
|
|
static int countMonths(
|
|
const int from_year, const int from_month,
|
|
const int to_year, const int to_month
|
|
) noexcept;
|
|
};
|
|
|
|
|
|
#endif // LOGDOCTOR__CRAPVIEW__MODULES__QUERY_H
|