refactorings

This commit is contained in:
Martin Rotter 2021-08-25 13:59:37 +02:00
parent a0215dcbf0
commit dbb59e49ea
39 changed files with 303 additions and 294 deletions

View file

@ -864,7 +864,7 @@ or this functionality is not implemented yet.</source>
<name>FormAccountDetails</name> <name>FormAccountDetails</name>
<message> <message>
<source>Edit account &apos;%1&apos;</source> <source>Edit account &apos;%1&apos;</source>
<translation>Updavit účet &apos;%1&apos;</translation> <translation>Upravit účet &apos;%1&apos;</translation>
</message> </message>
<message> <message>
<source>Network proxy</source> <source>Network proxy</source>

View file

@ -65,7 +65,7 @@ QString Enclosures::encodeEnclosuresToString(const QList<Enclosure>& enclosures)
} }
Message::Message() { Message::Message() {
m_title = m_url = m_author = m_contents = m_rawContents = m_feedId = m_customId = m_customHash = ""; m_title = m_url = m_author = m_contents = m_rawContents = m_feedId = m_customId = m_customHash = QSL("");
m_enclosures = QList<Enclosure>(); m_enclosures = QList<Enclosure>();
m_accountId = m_id = 0; m_accountId = m_id = 0;
m_score = 0.0; m_score = 0.0;
@ -88,7 +88,7 @@ void Message::sanitize(const Feed* feed) {
// Check if messages contain relative URLs and if they do, then replace them. // Check if messages contain relative URLs and if they do, then replace them.
if (m_url.startsWith(QL1S("//"))) { if (m_url.startsWith(QL1S("//"))) {
m_url = QString(URI_SCHEME_HTTPS) + m_url.mid(2); m_url = QSL(URI_SCHEME_HTTPS) + m_url.mid(2);
} }
else if (QUrl(m_url).isRelative()) { else if (QUrl(m_url).isRelative()) {
QUrl base(feed->source()); QUrl base(feed->source());

View file

@ -59,10 +59,10 @@ void MessageFilter::initializeFilteringEngine(QJSEngine& engine, MessageObject*
// Register the wrapper. // Register the wrapper.
auto js_object = engine.newQObject(message_wrapper); auto js_object = engine.newQObject(message_wrapper);
auto js_meta_object = engine.newQMetaObject(&message_wrapper->staticMetaObject); auto js_meta_object = engine.newQMetaObject(&MessageObject::staticMetaObject);
engine.globalObject().setProperty(QSL("msg"), js_object); engine.globalObject().setProperty(QSL("msg"), js_object);
engine.globalObject().setProperty(message_wrapper->staticMetaObject.className(), js_meta_object); engine.globalObject().setProperty(MessageObject::staticMetaObject.className(), js_meta_object);
// Register "utils". // Register "utils".
auto* utils = new FilterUtils(&engine); auto* utils = new FilterUtils(&engine);

View file

@ -9,7 +9,7 @@
#include <QSqlQuery> #include <QSqlQuery>
MessageObject::MessageObject(QSqlDatabase* db, const QString& feed_custom_id, int account_id, MessageObject::MessageObject(QSqlDatabase* db, const QString& feed_custom_id, int account_id,
QList<Label*> available_labels, bool is_new_message, QObject* parent) const QList<Label*>& available_labels, bool is_new_message, QObject* parent)
: QObject(parent), m_db(db), m_feedCustomId(feed_custom_id), m_accountId(account_id), m_message(nullptr), : QObject(parent), m_db(db), m_feedCustomId(feed_custom_id), m_accountId(account_id), m_message(nullptr),
m_availableLabels(available_labels), m_runningAfterFetching(is_new_message) {} m_availableLabels(available_labels), m_runningAfterFetching(is_new_message) {}
@ -26,31 +26,31 @@ bool MessageObject::isDuplicateWithAttribute(MessageObject::DuplicationAttribute
// Now we construct the query according to parameter. // Now we construct the query according to parameter.
if ((attribute_check& DuplicationAttributeCheck::SameTitle) == DuplicationAttributeCheck::SameTitle) { if ((attribute_check& DuplicationAttributeCheck::SameTitle) == DuplicationAttributeCheck::SameTitle) {
where_clauses.append(QSL("title = :title")); where_clauses.append(QSL("title = :title"));
bind_values.append({ ":title", title() }); bind_values.append({ QSL(":title"), title() });
} }
if ((attribute_check& DuplicationAttributeCheck::SameUrl) == DuplicationAttributeCheck::SameUrl) { if ((attribute_check& DuplicationAttributeCheck::SameUrl) == DuplicationAttributeCheck::SameUrl) {
where_clauses.append(QSL("url = :url")); where_clauses.append(QSL("url = :url"));
bind_values.append({ ":url", url() }); bind_values.append({ QSL(":url"), url() });
} }
if ((attribute_check& DuplicationAttributeCheck::SameAuthor) == DuplicationAttributeCheck::SameAuthor) { if ((attribute_check& DuplicationAttributeCheck::SameAuthor) == DuplicationAttributeCheck::SameAuthor) {
where_clauses.append(QSL("author = :author")); where_clauses.append(QSL("author = :author"));
bind_values.append({ ":author", author() }); bind_values.append({ QSL(":author"), author() });
} }
if ((attribute_check& DuplicationAttributeCheck::SameDateCreated) == DuplicationAttributeCheck::SameDateCreated) { if ((attribute_check& DuplicationAttributeCheck::SameDateCreated) == DuplicationAttributeCheck::SameDateCreated) {
where_clauses.append(QSL("date_created = :date_created")); where_clauses.append(QSL("date_created = :date_created"));
bind_values.append({ ":date_created", created().toMSecsSinceEpoch() }); bind_values.append({ QSL(":date_created"), created().toMSecsSinceEpoch() });
} }
where_clauses.append(QSL("account_id = :account_id")); where_clauses.append(QSL("account_id = :account_id"));
bind_values.append({ ":account_id", accountId() }); bind_values.append({ QSL(":account_id"), accountId() });
if ((attribute_check& DuplicationAttributeCheck::AllFeedsSameAccount) != DuplicationAttributeCheck::AllFeedsSameAccount) { if ((attribute_check& DuplicationAttributeCheck::AllFeedsSameAccount) != DuplicationAttributeCheck::AllFeedsSameAccount) {
// Limit to current feed. // Limit to current feed.
where_clauses.append(QSL("feed = :feed")); where_clauses.append(QSL("feed = :feed"));
bind_values.append({ ":feed", feedCustomId() }); bind_values.append({ QSL(":feed"), feedCustomId() });
} }
QString full_query = QSL("SELECT COUNT(*) FROM Messages WHERE ") + where_clauses.join(QSL(" AND ")) + QSL(";"); QString full_query = QSL("SELECT COUNT(*) FROM Messages WHERE ") + where_clauses.join(QSL(" AND ")) + QSL(";");
@ -87,7 +87,7 @@ bool MessageObject::isDuplicateWithAttribute(MessageObject::DuplicationAttribute
return false; return false;
} }
bool MessageObject::assignLabel(QString label_custom_id) const { bool MessageObject::assignLabel(const QString& label_custom_id) const {
if (m_message->m_id <= 0 && m_message->m_customId.isEmpty()) { if (m_message->m_id <= 0 && m_message->m_customId.isEmpty()) {
return false; return false;
} }
@ -108,7 +108,7 @@ bool MessageObject::assignLabel(QString label_custom_id) const {
} }
} }
bool MessageObject::deassignLabel(QString label_custom_id) const { bool MessageObject::deassignLabel(const QString& label_custom_id) const {
if (m_message->m_id <= 0 && m_message->m_customId.isEmpty()) { if (m_message->m_id <= 0 && m_message->m_customId.isEmpty()) {
return false; return false;
} }

View file

@ -64,7 +64,7 @@ class MessageObject : public QObject {
explicit MessageObject(QSqlDatabase* db, explicit MessageObject(QSqlDatabase* db,
const QString& feed_custom_id, const QString& feed_custom_id,
int account_id, int account_id,
QList<Label*> available_labels, const QList<Label*>& available_labels,
bool is_new_message, bool is_new_message,
QObject* parent = nullptr); QObject* parent = nullptr);
@ -77,11 +77,11 @@ class MessageObject : public QObject {
// Adds given label to list of assigned labels to this message. // Adds given label to list of assigned labels to this message.
// Returns true if label was assigned now or if the message already has it assigned. // Returns true if label was assigned now or if the message already has it assigned.
Q_INVOKABLE bool assignLabel(QString label_custom_id) const; Q_INVOKABLE bool assignLabel(const QString& label_custom_id) const;
// Removes given label from list of assigned labels of this message. // Removes given label from list of assigned labels of this message.
// Returns true if label was now removed or if it is not assigned to the message at all. // Returns true if label was now removed or if it is not assigned to the message at all.
Q_INVOKABLE bool deassignLabel(QString label_custom_id) const; Q_INVOKABLE bool deassignLabel(const QString& label_custom_id) const;
// Returns list of assigned and available messages. // Returns list of assigned and available messages.
QList<Label*> assignedLabels() const; QList<Label*> assignedLabels() const;

View file

@ -41,8 +41,8 @@ void MessagesModel::setupIcons() {
m_unreadIcon = qApp->icons()->fromTheme(QSL("mail-mark-unread")); m_unreadIcon = qApp->icons()->fromTheme(QSL("mail-mark-unread"));
m_enclosuresIcon = qApp->icons()->fromTheme(QSL("mail-attachment")); m_enclosuresIcon = qApp->icons()->fromTheme(QSL("mail-attachment"));
for (double i = MSG_SCORE_MIN; i <= MSG_SCORE_MAX; i += 10.0) { for (int i = int(MSG_SCORE_MIN); i <= int(MSG_SCORE_MAX); i += 10) {
m_scoreIcons.append(generateIconForScore(i)); m_scoreIcons.append(generateIconForScore(double(i)));
} }
} }
@ -271,8 +271,8 @@ Qt::ItemFlags MessagesModel::flags(const QModelIndex& index) const {
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemNeverHasChildren; return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemNeverHasChildren;
} }
QList<Message> MessagesModel::messagesAt(QList<int> row_indices) const { QList<Message> MessagesModel::messagesAt(const QList<int>& row_indices) const {
QList<Message> msgs; QList<Message> msgs; msgs.reserve(row_indices.size());
for (int idx : row_indices) { for (int idx : row_indices) {
msgs << messageAt(idx); msgs << messageAt(idx);
@ -537,8 +537,8 @@ bool MessagesModel::switchMessageImportance(int row_index) {
} }
bool MessagesModel::switchBatchMessageImportance(const QModelIndexList& messages) { bool MessagesModel::switchBatchMessageImportance(const QModelIndexList& messages) {
QStringList message_ids; QStringList message_ids; message_ids.reserve(messages.size());
QList<QPair<Message, RootItem::Importance>> message_states; QList<QPair<Message, RootItem::Importance>> message_states; message_states.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {
@ -572,8 +572,8 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList& messages
} }
bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList& messages) { bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList& messages) {
QStringList message_ids; QStringList message_ids; message_ids.reserve(messages.size());
QList<Message> msgs; QList<Message> msgs; msgs.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {
@ -614,8 +614,8 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList& messages) {
} }
bool MessagesModel::setBatchMessagesRead(const QModelIndexList& messages, RootItem::ReadStatus read) { bool MessagesModel::setBatchMessagesRead(const QModelIndexList& messages, RootItem::ReadStatus read) {
QStringList message_ids; QStringList message_ids; message_ids.reserve(messages.size());
QList<Message> msgs; QList<Message> msgs; msgs.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {
@ -641,8 +641,8 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList& messages, RootIt
} }
bool MessagesModel::setBatchMessagesRestored(const QModelIndexList& messages) { bool MessagesModel::setBatchMessagesRestored(const QModelIndexList& messages) {
QStringList message_ids; QStringList message_ids; message_ids.reserve(messages.size());
QList<Message> msgs; QList<Message> msgs; msgs.reserve(messages.size());
// Obtain IDs of all desired messages. // Obtain IDs of all desired messages.
for (const QModelIndex& message : messages) { for (const QModelIndex& message : messages) {

View file

@ -45,7 +45,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer {
// Returns message at given index. // Returns message at given index.
QList<Message> messagesAt(QList<int> row_indices) const; QList<Message> messagesAt(const QList<int>& row_indices) const;
Message messageAt(int row_index) const; Message messageAt(int row_index) const;
int messageId(int row_index) const; int messageId(int row_index) const;
RootItem::Importance messageImportance(int row_index) const; RootItem::Importance messageImportance(int row_index) const;

View file

@ -15,24 +15,24 @@ MessagesModelSqlLayer::MessagesModelSqlLayer()
m_fieldNames = DatabaseQueries::messageTableAttributes(false); m_fieldNames = DatabaseQueries::messageTableAttributes(false);
// Used in <x>: SELECT ... FROM ... ORDER BY <x1> DESC, <x2> ASC; // Used in <x>: SELECT ... FROM ... ORDER BY <x1> DESC, <x2> ASC;
m_orderByNames[MSG_DB_ID_INDEX] = "Messages.id"; m_orderByNames[MSG_DB_ID_INDEX] = QSL("Messages.id");
m_orderByNames[MSG_DB_READ_INDEX] = "Messages.is_read"; m_orderByNames[MSG_DB_READ_INDEX] = QSL("Messages.is_read");
m_orderByNames[MSG_DB_IMPORTANT_INDEX] = "Messages.is_important"; m_orderByNames[MSG_DB_IMPORTANT_INDEX] = QSL("Messages.is_important");
m_orderByNames[MSG_DB_DELETED_INDEX] = "Messages.is_deleted"; m_orderByNames[MSG_DB_DELETED_INDEX] = QSL("Messages.is_deleted");
m_orderByNames[MSG_DB_PDELETED_INDEX] = "Messages.is_pdeleted"; m_orderByNames[MSG_DB_PDELETED_INDEX] = QSL("Messages.is_pdeleted");
m_orderByNames[MSG_DB_FEED_CUSTOM_ID_INDEX] = "Messages.feed"; m_orderByNames[MSG_DB_FEED_CUSTOM_ID_INDEX] = QSL("Messages.feed");
m_orderByNames[MSG_DB_TITLE_INDEX] = "Messages.title"; m_orderByNames[MSG_DB_TITLE_INDEX] = QSL("Messages.title");
m_orderByNames[MSG_DB_URL_INDEX] = "Messages.url"; m_orderByNames[MSG_DB_URL_INDEX] = QSL("Messages.url");
m_orderByNames[MSG_DB_AUTHOR_INDEX] = "Messages.author"; m_orderByNames[MSG_DB_AUTHOR_INDEX] = QSL("Messages.author");
m_orderByNames[MSG_DB_DCREATED_INDEX] = "Messages.date_created"; m_orderByNames[MSG_DB_DCREATED_INDEX] = QSL("Messages.date_created");
m_orderByNames[MSG_DB_CONTENTS_INDEX] = "Messages.contents"; m_orderByNames[MSG_DB_CONTENTS_INDEX] = QSL("Messages.contents");
m_orderByNames[MSG_DB_ENCLOSURES_INDEX] = "Messages.enclosures"; m_orderByNames[MSG_DB_ENCLOSURES_INDEX] = QSL("Messages.enclosures");
m_orderByNames[MSG_DB_SCORE_INDEX] = "Messages.score"; m_orderByNames[MSG_DB_SCORE_INDEX] = QSL("Messages.score");
m_orderByNames[MSG_DB_ACCOUNT_ID_INDEX] = "Messages.account_id"; m_orderByNames[MSG_DB_ACCOUNT_ID_INDEX] = QSL("Messages.account_id");
m_orderByNames[MSG_DB_CUSTOM_ID_INDEX] = "Messages.custom_id"; m_orderByNames[MSG_DB_CUSTOM_ID_INDEX] = QSL("Messages.custom_id");
m_orderByNames[MSG_DB_CUSTOM_HASH_INDEX] = "Messages.custom_hash"; m_orderByNames[MSG_DB_CUSTOM_HASH_INDEX] = QSL("Messages.custom_hash");
m_orderByNames[MSG_DB_FEED_TITLE_INDEX] = "Feeds.title"; m_orderByNames[MSG_DB_FEED_TITLE_INDEX] = QSL("Feeds.title");
m_orderByNames[MSG_DB_HAS_ENCLOSURES] = "has_enclosures"; m_orderByNames[MSG_DB_HAS_ENCLOSURES] = QSL("has_enclosures");
m_numericColumns << MSG_DB_ID_INDEX << MSG_DB_READ_INDEX << MSG_DB_DELETED_INDEX << MSG_DB_PDELETED_INDEX m_numericColumns << MSG_DB_ID_INDEX << MSG_DB_READ_INDEX << MSG_DB_DELETED_INDEX << MSG_DB_PDELETED_INDEX
<< MSG_DB_IMPORTANT_INDEX << MSG_DB_ACCOUNT_ID_INDEX << MSG_DB_DCREATED_INDEX << MSG_DB_IMPORTANT_INDEX << MSG_DB_ACCOUNT_ID_INDEX << MSG_DB_DCREATED_INDEX

View file

@ -211,7 +211,7 @@ void MessagesProxyModel::sort(int column, Qt::SortOrder order) {
} }
QModelIndexList MessagesProxyModel::mapListToSource(const QModelIndexList& indexes) const { QModelIndexList MessagesProxyModel::mapListToSource(const QModelIndexList& indexes) const {
QModelIndexList source_indexes; QModelIndexList source_indexes; source_indexes.reserve(indexes.size());
for (const QModelIndex& index : indexes) { for (const QModelIndex& index : indexes) {
source_indexes << mapToSource(index); source_indexes << mapToSource(index);

View file

@ -10,7 +10,7 @@
DatabaseCleaner::DatabaseCleaner(QObject* parent) : QObject(parent) {} DatabaseCleaner::DatabaseCleaner(QObject* parent) : QObject(parent) {}
void DatabaseCleaner::purgeDatabaseData(const CleanerOrders& which_data) { void DatabaseCleaner::purgeDatabaseData(CleanerOrders which_data) {
qDebugNN << LOGSEC_DB << "Performing database cleanup in thread: '" << QThread::currentThreadId() << "'."; qDebugNN << LOGSEC_DB << "Performing database cleanup in thread: '" << QThread::currentThreadId() << "'.";
// Inform everyone about the start of the process. // Inform everyone about the start of the process.

View file

@ -29,7 +29,7 @@ class DatabaseCleaner : public QObject {
void purgeFinished(bool result); void purgeFinished(bool result);
public slots: public slots:
void purgeDatabaseData(const CleanerOrders& which_data); void purgeDatabaseData(CleanerOrders which_data);
private: private:
bool purgeStarredMessages(const QSqlDatabase& database); bool purgeStarredMessages(const QSqlDatabase& database);

View file

@ -18,7 +18,7 @@ QStringList DatabaseDriver::prepareScript(const QString& base_sql_folder,
QStringList statements; QStringList statements;
QString next_file = base_sql_folder + QDir::separator() + sql_file; QString next_file = base_sql_folder + QDir::separator() + sql_file;
QString sql_script = QString::fromUtf8(IOFactory::readFile(next_file)); QString sql_script = QString::fromUtf8(IOFactory::readFile(next_file));
QStringList new_statements = sql_script.split(APP_DB_COMMENT_SPLIT, QStringList new_statements = sql_script.split(QSL(APP_DB_COMMENT_SPLIT),
#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 #if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
Qt::SplitBehaviorFlags::SkipEmptyParts); Qt::SplitBehaviorFlags::SkipEmptyParts);
#else #else
@ -26,13 +26,13 @@ QStringList DatabaseDriver::prepareScript(const QString& base_sql_folder,
#endif #endif
for (int i = 0; i < new_statements.size(); i++) { for (int i = 0; i < new_statements.size(); i++) {
if (new_statements.at(i).startsWith(APP_DB_INCLUDE_PLACEHOLDER)) { if (new_statements.at(i).startsWith(QSL(APP_DB_INCLUDE_PLACEHOLDER))) {
// We include another file. // We include another file.
QString included_file_name = new_statements.at(i).mid(QSL(APP_DB_INCLUDE_PLACEHOLDER).size() + 1); QString included_file_name = new_statements.at(i).mid(QSL(APP_DB_INCLUDE_PLACEHOLDER).size() + 1);
QString included_file = base_sql_folder + QDir::separator() + included_file_name; QString included_file = base_sql_folder + QDir::separator() + included_file_name;
QString included_sql_script = QString::fromUtf8(IOFactory::readFile(included_file)); QString included_sql_script = QString::fromUtf8(IOFactory::readFile(included_file));
QStringList included_statements = included_sql_script.split(APP_DB_COMMENT_SPLIT, QStringList included_statements = included_sql_script.split(QSL(APP_DB_COMMENT_SPLIT),
#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 #if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
Qt::SplitBehaviorFlags::SkipEmptyParts); Qt::SplitBehaviorFlags::SkipEmptyParts);
#else #else
@ -46,9 +46,9 @@ QStringList DatabaseDriver::prepareScript(const QString& base_sql_folder,
} }
} }
statements.replaceInStrings(APP_DB_NAME_PLACEHOLDER, database_name); statements.replaceInStrings(QSL(APP_DB_NAME_PLACEHOLDER), database_name);
statements.replaceInStrings(APP_DB_AUTO_INC_PRIM_KEY_PLACEHOLDER, autoIncrementPrimaryKey()); statements.replaceInStrings(QSL(APP_DB_AUTO_INC_PRIM_KEY_PLACEHOLDER), autoIncrementPrimaryKey());
statements.replaceInStrings(APP_DB_BLOB_PLACEHOLDER, blob()); statements.replaceInStrings(QSL(APP_DB_BLOB_PLACEHOLDER), blob());
return statements; return statements;
} }

View file

@ -31,7 +31,7 @@ void DatabaseFactory::determineDriver() {
new SqliteDriver(qApp->settings()->value(GROUP(Database), SETTING(Database::UseInMemory)).toBool(), this) new SqliteDriver(qApp->settings()->value(GROUP(Database), SETTING(Database::UseInMemory)).toBool(), this)
}; };
if (QSqlDatabase::isDriverAvailable(APP_DB_MYSQL_DRIVER)) { if (QSqlDatabase::isDriverAvailable(QSL(APP_DB_MYSQL_DRIVER))) {
m_allDbDrivers.append(new MariaDbDriver(this)); m_allDbDrivers.append(new MariaDbDriver(this));
} }

View file

@ -16,24 +16,27 @@
QMap<int, QString> DatabaseQueries::messageTableAttributes(bool only_msg_table) { QMap<int, QString> DatabaseQueries::messageTableAttributes(bool only_msg_table) {
QMap<int, QString> field_names; QMap<int, QString> field_names;
field_names[MSG_DB_ID_INDEX] = "Messages.id"; field_names[MSG_DB_ID_INDEX] = QSL("Messages.id");
field_names[MSG_DB_READ_INDEX] = "Messages.is_read"; field_names[MSG_DB_READ_INDEX] = QSL("Messages.is_read");
field_names[MSG_DB_IMPORTANT_INDEX] = "Messages.is_important"; field_names[MSG_DB_IMPORTANT_INDEX] = QSL("Messages.is_important");
field_names[MSG_DB_DELETED_INDEX] = "Messages.is_deleted"; field_names[MSG_DB_DELETED_INDEX] = QSL("Messages.is_deleted");
field_names[MSG_DB_PDELETED_INDEX] = "Messages.is_pdeleted"; field_names[MSG_DB_PDELETED_INDEX] = QSL("Messages.is_pdeleted");
field_names[MSG_DB_FEED_CUSTOM_ID_INDEX] = "Messages.feed"; field_names[MSG_DB_FEED_CUSTOM_ID_INDEX] = QSL("Messages.feed");
field_names[MSG_DB_TITLE_INDEX] = "Messages.title"; field_names[MSG_DB_TITLE_INDEX] = QSL("Messages.title");
field_names[MSG_DB_URL_INDEX] = "Messages.url"; field_names[MSG_DB_URL_INDEX] = QSL("Messages.url");
field_names[MSG_DB_AUTHOR_INDEX] = "Messages.author"; field_names[MSG_DB_AUTHOR_INDEX] = QSL("Messages.author");
field_names[MSG_DB_DCREATED_INDEX] = "Messages.date_created"; field_names[MSG_DB_DCREATED_INDEX] = QSL("Messages.date_created");
field_names[MSG_DB_CONTENTS_INDEX] = "Messages.contents"; field_names[MSG_DB_CONTENTS_INDEX] = QSL("Messages.contents");
field_names[MSG_DB_ENCLOSURES_INDEX] = "Messages.enclosures"; field_names[MSG_DB_ENCLOSURES_INDEX] = QSL("Messages.enclosures");
field_names[MSG_DB_SCORE_INDEX] = "Messages.score"; field_names[MSG_DB_SCORE_INDEX] = QSL("Messages.score");
field_names[MSG_DB_ACCOUNT_ID_INDEX] = "Messages.account_id"; field_names[MSG_DB_ACCOUNT_ID_INDEX] = QSL("Messages.account_id");
field_names[MSG_DB_CUSTOM_ID_INDEX] = "Messages.custom_id"; field_names[MSG_DB_CUSTOM_ID_INDEX] = QSL("Messages.custom_id");
field_names[MSG_DB_CUSTOM_HASH_INDEX] = "Messages.custom_hash"; field_names[MSG_DB_CUSTOM_HASH_INDEX] = QSL("Messages.custom_hash");
field_names[MSG_DB_FEED_TITLE_INDEX] = only_msg_table ? "Messages.feed" : "Feeds.title"; field_names[MSG_DB_FEED_TITLE_INDEX] = only_msg_table ? QSL("Messages.feed") : QSL("Feeds.title");
field_names[MSG_DB_HAS_ENCLOSURES] = "CASE WHEN length(Messages.enclosures) > 10 THEN 'true' ELSE 'false' END AS has_enclosures"; field_names[MSG_DB_HAS_ENCLOSURES] = QSL("CASE WHEN length(Messages.enclosures) > 10 "
"THEN 'true' "
"ELSE 'false' "
"END AS has_enclosures");
return field_names; return field_names;
} }
@ -63,7 +66,8 @@ bool DatabaseQueries::isLabelAssignedToMessage(const QSqlDatabase& db, Label* la
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("SELECT COUNT(*) FROM LabelsInMessages WHERE label = :label AND message = :message AND account_id = :account_id;"); q.prepare(QSL("SELECT COUNT(*) FROM LabelsInMessages "
"WHERE label = :label AND message = :message AND account_id = :account_id;"));
q.bindValue(QSL(":label"), label->customId()); q.bindValue(QSL(":label"), label->customId());
q.bindValue(QSL(":message"), msg.m_customId); q.bindValue(QSL(":message"), msg.m_customId);
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
@ -77,7 +81,8 @@ bool DatabaseQueries::deassignLabelFromMessage(const QSqlDatabase& db, Label* la
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("DELETE FROM LabelsInMessages WHERE label = :label AND message = :message AND account_id = :account_id;"); q.prepare(QSL("DELETE FROM LabelsInMessages "
"WHERE label = :label AND message = :message AND account_id = :account_id;"));
q.bindValue(QSL(":label"), label->customId()); q.bindValue(QSL(":label"), label->customId());
q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId); q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId);
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
@ -89,7 +94,8 @@ bool DatabaseQueries::assignLabelToMessage(const QSqlDatabase& db, Label* label,
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("DELETE FROM LabelsInMessages WHERE label = :label AND message = :message AND account_id = :account_id;"); q.prepare(QSL("DELETE FROM LabelsInMessages "
"WHERE label = :label AND message = :message AND account_id = :account_id;"));
q.bindValue(QSL(":label"), label->customId()); q.bindValue(QSL(":label"), label->customId());
q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId); q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId);
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
@ -97,7 +103,8 @@ bool DatabaseQueries::assignLabelToMessage(const QSqlDatabase& db, Label* label,
auto succ = q.exec(); auto succ = q.exec();
if (succ) { if (succ) {
q.prepare("INSERT INTO LabelsInMessages (label, message, account_id) VALUES (:label, :message, :account_id);"); q.prepare(QSL("INSERT INTO LabelsInMessages (label, message, account_id) "
"VALUES (:label, :message, :account_id);"));
q.bindValue(QSL(":label"), label->customId()); q.bindValue(QSL(":label"), label->customId());
q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId); q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId);
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
@ -142,8 +149,7 @@ QList<Label*> DatabaseQueries::getLabelsForAccount(const QSqlDatabase& db, int a
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("SELECT * FROM Labels WHERE account_id = :account_id;"); q.prepare(QSL("SELECT * FROM Labels WHERE account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
if (q.exec()) { if (q.exec()) {
@ -167,7 +173,7 @@ QList<Label*> DatabaseQueries::getLabelsForMessage(const QSqlDatabase& db,
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("SELECT DISTINCT label FROM LabelsInMessages WHERE message = :message AND account_id = :account_id;"); q.prepare(QSL("SELECT DISTINCT label FROM LabelsInMessages WHERE message = :message AND account_id = :account_id;"));
q.bindValue(QSL(":account_id"), msg.m_accountId); q.bindValue(QSL(":account_id"), msg.m_accountId);
q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId); q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId);
@ -194,8 +200,8 @@ bool DatabaseQueries::updateLabel(const QSqlDatabase& db, Label* label) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("UPDATE Labels SET name = :name, color = :color " q.prepare(QSL("UPDATE Labels SET name = :name, color = :color "
"WHERE id = :id AND account_id = :account_id;"); "WHERE id = :id AND account_id = :account_id;"));
q.bindValue(QSL(":name"), label->title()); q.bindValue(QSL(":name"), label->title());
q.bindValue(QSL(":color"), label->color().name()); q.bindValue(QSL(":color"), label->color().name());
q.bindValue(QSL(":id"), label->id()); q.bindValue(QSL(":id"), label->id());
@ -210,12 +216,12 @@ bool DatabaseQueries::deleteLabel(const QSqlDatabase& db, Label* label) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("DELETE FROM Labels WHERE id = :id AND account_id = :account_id;"); q.prepare(QSL("DELETE FROM Labels WHERE id = :id AND account_id = :account_id;"));
q.bindValue(QSL(":id"), label->id()); q.bindValue(QSL(":id"), label->id());
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
if (q.exec()) { if (q.exec()) {
q.prepare("DELETE FROM LabelsInMessages WHERE label = :custom_id AND account_id = :account_id;"); q.prepare(QSL("DELETE FROM LabelsInMessages WHERE label = :custom_id AND account_id = :account_id;"));
q.bindValue(QSL(":custom_id"), label->customId()); q.bindValue(QSL(":custom_id"), label->customId());
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
@ -230,8 +236,8 @@ bool DatabaseQueries::createLabel(const QSqlDatabase& db, Label* label, int acco
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("INSERT INTO Labels (name, color, custom_id, account_id) " q.prepare(QSL("INSERT INTO Labels (name, color, custom_id, account_id) "
"VALUES (:name, :color, :custom_id, :account_id);"); "VALUES (:name, :color, :custom_id, :account_id);"));
q.bindValue(QSL(":name"), label->title()); q.bindValue(QSL(":name"), label->title());
q.bindValue(QSL(":color"), label->color().name()); q.bindValue(QSL(":color"), label->color().name());
q.bindValue(QSL(":custom_id"), label->customId()); q.bindValue(QSL(":custom_id"), label->customId());
@ -249,7 +255,7 @@ bool DatabaseQueries::createLabel(const QSqlDatabase& db, Label* label, int acco
} }
// Fixup missing custom IDs. // Fixup missing custom IDs.
q.prepare("UPDATE Labels SET custom_id = id WHERE custom_id IS NULL OR custom_id = '';"); q.prepare(QSL("UPDATE Labels SET custom_id = id WHERE custom_id IS NULL OR custom_id = '';"));
return q.exec() && res; return q.exec() && res;
} }
@ -258,12 +264,12 @@ bool DatabaseQueries::markLabelledMessagesReadUnread(const QSqlDatabase& db, Lab
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("UPDATE Messages SET is_read = :read " q.prepare(QSL("UPDATE Messages SET is_read = :read "
"WHERE " "WHERE "
" is_deleted = 0 AND " " is_deleted = 0 AND "
" is_pdeleted = 0 AND " " is_pdeleted = 0 AND "
" account_id = :account_id AND " " account_id = :account_id AND "
" EXISTS (SELECT * FROM LabelsInMessages WHERE LabelsInMessages.label = :label AND Messages.account_id = LabelsInMessages.account_id AND Messages.custom_id = LabelsInMessages.message);"); " EXISTS (SELECT * FROM LabelsInMessages WHERE LabelsInMessages.label = :label AND Messages.account_id = LabelsInMessages.account_id AND Messages.custom_id = LabelsInMessages.message);"));
q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0); q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0);
q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId());
q.bindValue(QSL(":label"), label->customId()); q.bindValue(QSL(":label"), label->customId());
@ -275,8 +281,8 @@ bool DatabaseQueries::markImportantMessagesReadUnread(const QSqlDatabase& db, in
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("UPDATE Messages SET is_read = :read " q.prepare(QSL("UPDATE Messages SET is_read = :read "
"WHERE is_important = 1 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_important = 1 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0); q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0);
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
return q.exec(); return q.exec();
@ -286,8 +292,8 @@ bool DatabaseQueries::markUnreadMessagesRead(const QSqlDatabase& db, int account
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("UPDATE Messages SET is_read = :read " q.prepare(QSL("UPDATE Messages SET is_read = :read "
"WHERE is_read = 0 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_read = 0 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":read"), 1); q.bindValue(QSL(":read"), 1);
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
return q.exec(); return q.exec();
@ -323,8 +329,8 @@ bool DatabaseQueries::markFeedsReadUnread(const QSqlDatabase& db, const QStringL
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare(QString("UPDATE Messages SET is_read = :read " q.prepare(QSL("UPDATE Messages SET is_read = :read "
"WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;").arg(ids.join(QSL(", ")))); "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;").arg(ids.join(QSL(", "))));
q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0); q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0);
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
return q.exec(); return q.exec();
@ -334,8 +340,8 @@ bool DatabaseQueries::markBinReadUnread(const QSqlDatabase& db, int account_id,
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("UPDATE Messages SET is_read = :read " q.prepare(QSL("UPDATE Messages SET is_read = :read "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0); q.bindValue(QSL(":read"), read == RootItem::ReadStatus::Read ? 1 : 0);
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
return q.exec(); return q.exec();
@ -355,31 +361,31 @@ bool DatabaseQueries::switchMessagesImportance(const QSqlDatabase& db, const QSt
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
return q.exec(QString(QSL("UPDATE Messages SET is_important = NOT is_important WHERE id IN (%1);")).arg(ids.join(QSL(", ")))); return q.exec(QSL("UPDATE Messages SET is_important = NOT is_important WHERE id IN (%1);").arg(ids.join(QSL(", "))));
} }
bool DatabaseQueries::permanentlyDeleteMessages(const QSqlDatabase& db, const QStringList& ids) { bool DatabaseQueries::permanentlyDeleteMessages(const QSqlDatabase& db, const QStringList& ids) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
return q.exec(QString(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE id IN (%1);")).arg(ids.join(QSL(", ")))); return q.exec(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE id IN (%1);").arg(ids.join(QSL(", "))));
} }
bool DatabaseQueries::deleteOrRestoreMessagesToFromBin(const QSqlDatabase& db, const QStringList& ids, bool deleted) { bool DatabaseQueries::deleteOrRestoreMessagesToFromBin(const QSqlDatabase& db, const QStringList& ids, bool deleted) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
return q.exec(QString(QSL("UPDATE Messages SET is_deleted = %2, is_pdeleted = %3 WHERE id IN (%1);")).arg(ids.join(QSL(", ")), return q.exec(QSL("UPDATE Messages SET is_deleted = %2, is_pdeleted = %3 WHERE id IN (%1);").arg(ids.join(QSL(", ")),
QString::number(deleted ? 1 : 0), QString::number(deleted ? 1 : 0),
QString::number(0))); QString::number(0)));
} }
bool DatabaseQueries::restoreBin(const QSqlDatabase& db, int account_id) { bool DatabaseQueries::restoreBin(const QSqlDatabase& db, int account_id) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("UPDATE Messages SET is_deleted = 0 " q.prepare(QSL("UPDATE Messages SET is_deleted = 0 "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
return q.exec(); return q.exec();
} }
@ -388,7 +394,7 @@ bool DatabaseQueries::purgeMessage(const QSqlDatabase& db, int message_id) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("DELETE FROM Messages WHERE id = :id;"); q.prepare(QSL("DELETE FROM Messages WHERE id = :id;"));
q.bindValue(QSL(":id"), message_id); q.bindValue(QSL(":id"), message_id);
return q.exec(); return q.exec();
@ -410,7 +416,8 @@ bool DatabaseQueries::purgeReadMessages(const QSqlDatabase& db) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND is_deleted = :is_deleted AND is_read = :is_read;")); q.prepare(QSL("DELETE FROM Messages "
"WHERE is_important = :is_important AND is_deleted = :is_deleted AND is_read = :is_read;"));
q.bindValue(QSL(":is_read"), 1); q.bindValue(QSL(":is_read"), 1);
// Remove only messages which are NOT in recycle bin. // Remove only messages which are NOT in recycle bin.
@ -458,14 +465,14 @@ QMap<QString, QPair<int, int>> DatabaseQueries::getMessageCountsForCategory(cons
q.setForwardOnly(true); q.setForwardOnly(true);
if (only_total_counts) { if (only_total_counts) {
q.prepare("SELECT feed, sum((is_read + 1) % 2), count(*) FROM Messages " q.prepare(QSL("SELECT feed, sum((is_read + 1) % 2), count(*) FROM Messages "
"WHERE feed IN (SELECT custom_id FROM Feeds WHERE category = :category AND account_id = :account_id) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id " "WHERE feed IN (SELECT custom_id FROM Feeds WHERE category = :category AND account_id = :account_id) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id "
"GROUP BY feed;"); "GROUP BY feed;"));
} }
else { else {
q.prepare("SELECT feed, sum((is_read + 1) % 2) FROM Messages " q.prepare(QSL("SELECT feed, sum((is_read + 1) % 2) FROM Messages "
"WHERE feed IN (SELECT custom_id FROM Feeds WHERE category = :category AND account_id = :account_id) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id " "WHERE feed IN (SELECT custom_id FROM Feeds WHERE category = :category AND account_id = :account_id) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id "
"GROUP BY feed;"); "GROUP BY feed;"));
} }
q.bindValue(QSL(":category"), custom_id); q.bindValue(QSL(":category"), custom_id);
@ -507,14 +514,14 @@ QMap<QString, QPair<int, int>> DatabaseQueries::getMessageCountsForAccount(const
q.setForwardOnly(true); q.setForwardOnly(true);
if (only_total_counts) { if (only_total_counts) {
q.prepare("SELECT feed, sum((is_read + 1) % 2), count(*) FROM Messages " q.prepare(QSL("SELECT feed, sum((is_read + 1) % 2), count(*) FROM Messages "
"WHERE is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id " "WHERE is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id "
"GROUP BY feed;"); "GROUP BY feed;"));
} }
else { else {
q.prepare("SELECT feed, sum((is_read + 1) % 2) FROM Messages " q.prepare(QSL("SELECT feed, sum((is_read + 1) % 2) FROM Messages "
"WHERE is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id " "WHERE is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id "
"GROUP BY feed;"); "GROUP BY feed;"));
} }
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
@ -554,12 +561,12 @@ int DatabaseQueries::getMessageCountsForFeed(const QSqlDatabase& db, const QStri
q.setForwardOnly(true); q.setForwardOnly(true);
if (only_total_counts) { if (only_total_counts) {
q.prepare("SELECT count(*) FROM Messages " q.prepare(QSL("SELECT count(*) FROM Messages "
"WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"));
} }
else { else {
q.prepare("SELECT count(*) FROM Messages " q.prepare(QSL("SELECT count(*) FROM Messages "
"WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 0 AND account_id = :account_id;"); "WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 0 AND account_id = :account_id;"));
} }
q.bindValue(QSL(":feed"), feed_custom_id); q.bindValue(QSL(":feed"), feed_custom_id);
@ -587,20 +594,20 @@ int DatabaseQueries::getMessageCountsForLabel(const QSqlDatabase& db, Label* lab
q.setForwardOnly(true); q.setForwardOnly(true);
if (only_total_counts) { if (only_total_counts) {
q.prepare("SELECT COUNT(*) FROM Messages " q.prepare(QSL("SELECT COUNT(*) FROM Messages "
"INNER JOIN LabelsInMessages " "INNER JOIN LabelsInMessages "
"ON " "ON "
" Messages.is_pdeleted = 0 AND Messages.is_deleted = 0 AND " " Messages.is_pdeleted = 0 AND Messages.is_deleted = 0 AND "
" LabelsInMessages.account_id = :account_id AND LabelsInMessages.account_id = Messages.account_id AND " " LabelsInMessages.account_id = :account_id AND LabelsInMessages.account_id = Messages.account_id AND "
" LabelsInMessages.label = :label AND LabelsInMessages.message = Messages.custom_id;"); " LabelsInMessages.label = :label AND LabelsInMessages.message = Messages.custom_id;"));
} }
else { else {
q.prepare("SELECT COUNT(*) FROM Messages " q.prepare(QSL("SELECT COUNT(*) FROM Messages "
"INNER JOIN LabelsInMessages " "INNER JOIN LabelsInMessages "
"ON " "ON "
" Messages.is_pdeleted = 0 AND Messages.is_deleted = 0 AND Messages.is_read = 0 AND " " Messages.is_pdeleted = 0 AND Messages.is_deleted = 0 AND Messages.is_read = 0 AND "
" LabelsInMessages.account_id = :account_id AND LabelsInMessages.account_id = Messages.account_id AND " " LabelsInMessages.account_id = :account_id AND LabelsInMessages.account_id = Messages.account_id AND "
" LabelsInMessages.label = :label AND LabelsInMessages.message = Messages.custom_id;"); " LabelsInMessages.label = :label AND LabelsInMessages.message = Messages.custom_id;"));
} }
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
@ -628,12 +635,12 @@ int DatabaseQueries::getImportantMessageCounts(const QSqlDatabase& db, int accou
q.setForwardOnly(true); q.setForwardOnly(true);
if (only_total_counts) { if (only_total_counts) {
q.prepare("SELECT count(*) FROM Messages " q.prepare(QSL("SELECT count(*) FROM Messages "
"WHERE is_important = 1 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_important = 1 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"));
} }
else { else {
q.prepare("SELECT count(*) FROM Messages " q.prepare(QSL("SELECT count(*) FROM Messages "
"WHERE is_read = 0 AND is_important = 1 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_read = 0 AND is_important = 1 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"));
} }
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
@ -658,8 +665,8 @@ int DatabaseQueries::getUnreadMessageCounts(const QSqlDatabase& db, int account_
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
q.prepare("SELECT count(*) FROM Messages " q.prepare(QSL("SELECT count(*) FROM Messages "
"WHERE is_read = 0 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_read = 0 AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
@ -685,12 +692,12 @@ int DatabaseQueries::getMessageCountsForBin(const QSqlDatabase& db, int account_
q.setForwardOnly(true); q.setForwardOnly(true);
if (including_total_counts) { if (including_total_counts) {
q.prepare("SELECT count(*) FROM Messages " q.prepare(QSL("SELECT count(*) FROM Messages "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"));
} }
else { else {
q.prepare("SELECT count(*) FROM Messages " q.prepare(QSL("SELECT count(*) FROM Messages "
"WHERE is_read = 0 AND is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); "WHERE is_read = 0 AND is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"));
} }
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
@ -1054,37 +1061,37 @@ QPair<int, int> DatabaseQueries::updateMessages(QSqlDatabase db,
// 4) they have same TITLE. // 4) they have same TITLE.
// NOTE: This only applies to messages from standard RSS/ATOM/JSON feeds without ID/GUID. // NOTE: This only applies to messages from standard RSS/ATOM/JSON feeds without ID/GUID.
query_select_with_url.setForwardOnly(true); query_select_with_url.setForwardOnly(true);
query_select_with_url.prepare("SELECT id, date_created, is_read, is_important, contents, feed FROM Messages " query_select_with_url.prepare(QSL("SELECT id, date_created, is_read, is_important, contents, feed FROM Messages "
"WHERE feed = :feed AND title = :title AND url = :url AND author = :author AND account_id = :account_id;"); "WHERE feed = :feed AND title = :title AND url = :url AND author = :author AND account_id = :account_id;"));
// When we have custom ID of the message which is service-specific (synchronized services). // When we have custom ID of the message which is service-specific (synchronized services).
query_select_with_custom_id.setForwardOnly(true); query_select_with_custom_id.setForwardOnly(true);
query_select_with_custom_id.prepare("SELECT id, date_created, is_read, is_important, contents, feed, title FROM Messages " query_select_with_custom_id.prepare(QSL("SELECT id, date_created, is_read, is_important, contents, feed, title FROM Messages "
"WHERE custom_id = :custom_id AND account_id = :account_id;"); "WHERE custom_id = :custom_id AND account_id = :account_id;"));
// We have custom ID of message, but it is feed-specific not service-specific (standard RSS/ATOM/JSON). // We have custom ID of message, but it is feed-specific not service-specific (standard RSS/ATOM/JSON).
query_select_with_custom_id_for_feed.setForwardOnly(true); query_select_with_custom_id_for_feed.setForwardOnly(true);
query_select_with_custom_id_for_feed.prepare("SELECT id, date_created, is_read, is_important, contents, title FROM Messages " query_select_with_custom_id_for_feed.prepare(QSL("SELECT id, date_created, is_read, is_important, contents, title FROM Messages "
"WHERE feed = :feed AND custom_id = :custom_id AND account_id = :account_id;"); "WHERE feed = :feed AND custom_id = :custom_id AND account_id = :account_id;"));
// In some case, messages are already stored in the DB and they all have primary DB ID. // In some case, messages are already stored in the DB and they all have primary DB ID.
// This is particularly the case when user runs some message filter manually on existing messages // This is particularly the case when user runs some message filter manually on existing messages
// of some feed. // of some feed.
query_select_with_id.setForwardOnly(true); query_select_with_id.setForwardOnly(true);
query_select_with_id.prepare("SELECT date_created, is_read, is_important, contents, feed, title FROM Messages " query_select_with_id.prepare(QSL("SELECT date_created, is_read, is_important, contents, feed, title FROM Messages "
"WHERE id = :id AND account_id = :account_id;"); "WHERE id = :id AND account_id = :account_id;"));
// Used to insert new messages. // Used to insert new messages.
query_insert.setForwardOnly(true); query_insert.setForwardOnly(true);
query_insert.prepare("INSERT INTO Messages " query_insert.prepare(QSL("INSERT INTO Messages "
"(feed, title, is_read, is_important, is_deleted, url, author, score, date_created, contents, enclosures, custom_id, custom_hash, account_id) " "(feed, title, is_read, is_important, is_deleted, url, author, score, date_created, contents, enclosures, custom_id, custom_hash, account_id) "
"VALUES (:feed, :title, :is_read, :is_important, :is_deleted, :url, :author, :score, :date_created, :contents, :enclosures, :custom_id, :custom_hash, :account_id);"); "VALUES (:feed, :title, :is_read, :is_important, :is_deleted, :url, :author, :score, :date_created, :contents, :enclosures, :custom_id, :custom_hash, :account_id);"));
// Used to update existing messages. // Used to update existing messages.
query_update.setForwardOnly(true); query_update.setForwardOnly(true);
query_update.prepare("UPDATE Messages " query_update.prepare(QSL("UPDATE Messages "
"SET title = :title, is_read = :is_read, is_important = :is_important, is_deleted = :is_deleted, url = :url, author = :author, score = :score, date_created = :date_created, contents = :contents, enclosures = :enclosures, feed = :feed " "SET title = :title, is_read = :is_read, is_important = :is_important, is_deleted = :is_deleted, url = :url, author = :author, score = :score, date_created = :date_created, contents = :contents, enclosures = :enclosures, feed = :feed "
"WHERE id = :id;"); "WHERE id = :id;"));
if (use_transactions && !db.transaction()) { if (use_transactions && !db.transaction()) {
qCriticalNN << LOGSEC_DB qCriticalNN << LOGSEC_DB
@ -2073,7 +2080,7 @@ MessageFilter* DatabaseQueries::addMessageFilter(const QSqlDatabase& db, const Q
QSqlQuery q(db); QSqlQuery q(db);
q.prepare("INSERT INTO MessageFilters (name, script) VALUES(:name, :script);"); q.prepare(QSL("INSERT INTO MessageFilters (name, script) VALUES(:name, :script);"));
q.bindValue(QSL(":name"), title); q.bindValue(QSL(":name"), title);
q.bindValue(QSL(":script"), script); q.bindValue(QSL(":script"), script);
@ -2095,7 +2102,7 @@ MessageFilter* DatabaseQueries::addMessageFilter(const QSqlDatabase& db, const Q
void DatabaseQueries::removeMessageFilter(const QSqlDatabase& db, int filter_id, bool* ok) { void DatabaseQueries::removeMessageFilter(const QSqlDatabase& db, int filter_id, bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
q.prepare("DELETE FROM MessageFilters WHERE id = :id;"); q.prepare(QSL("DELETE FROM MessageFilters WHERE id = :id;"));
q.bindValue(QSL(":id"), filter_id); q.bindValue(QSL(":id"), filter_id);
q.setForwardOnly(true); q.setForwardOnly(true);
@ -2115,7 +2122,7 @@ void DatabaseQueries::removeMessageFilter(const QSqlDatabase& db, int filter_id,
void DatabaseQueries::removeMessageFilterAssignments(const QSqlDatabase& db, int filter_id, bool* ok) { void DatabaseQueries::removeMessageFilterAssignments(const QSqlDatabase& db, int filter_id, bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
q.prepare("DELETE FROM MessageFiltersInFeeds WHERE filter = :filter;"); q.prepare(QSL("DELETE FROM MessageFiltersInFeeds WHERE filter = :filter;"));
q.bindValue(QSL(":filter"), filter_id); q.bindValue(QSL(":filter"), filter_id);
q.setForwardOnly(true); q.setForwardOnly(true);
@ -2167,7 +2174,7 @@ QMultiMap<QString, int> DatabaseQueries::messageFiltersInFeeds(const QSqlDatabas
QSqlQuery q(db); QSqlQuery q(db);
QMultiMap<QString, int> filters_in_feeds; QMultiMap<QString, int> filters_in_feeds;
q.prepare("SELECT filter, feed_custom_id FROM MessageFiltersInFeeds WHERE account_id = :account_id;"); q.prepare(QSL("SELECT filter, feed_custom_id FROM MessageFiltersInFeeds WHERE account_id = :account_id;"));
q.bindValue(QSL(":account_id"), account_id); q.bindValue(QSL(":account_id"), account_id);
q.setForwardOnly(true); q.setForwardOnly(true);
@ -2196,8 +2203,8 @@ void DatabaseQueries::assignMessageFilterToFeed(const QSqlDatabase& db, const QS
int filter_id, int account_id, bool* ok) { int filter_id, int account_id, bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
q.prepare("INSERT INTO MessageFiltersInFeeds (filter, feed_custom_id, account_id) " q.prepare(QSL("INSERT INTO MessageFiltersInFeeds (filter, feed_custom_id, account_id) "
"VALUES(:filter, :feed_custom_id, :account_id);"); "VALUES(:filter, :feed_custom_id, :account_id);"));
q.bindValue(QSL(":filter"), filter_id); q.bindValue(QSL(":filter"), filter_id);
q.bindValue(QSL(":feed_custom_id"), feed_custom_id); q.bindValue(QSL(":feed_custom_id"), feed_custom_id);
@ -2219,7 +2226,7 @@ void DatabaseQueries::assignMessageFilterToFeed(const QSqlDatabase& db, const QS
void DatabaseQueries::updateMessageFilter(const QSqlDatabase& db, MessageFilter* filter, bool* ok) { void DatabaseQueries::updateMessageFilter(const QSqlDatabase& db, MessageFilter* filter, bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
q.prepare("UPDATE MessageFilters SET name = :name, script = :script WHERE id = :id;"); q.prepare(QSL("UPDATE MessageFilters SET name = :name, script = :script WHERE id = :id;"));
q.bindValue(QSL(":name"), filter->name()); q.bindValue(QSL(":name"), filter->name());
q.bindValue(QSL(":script"), filter->script()); q.bindValue(QSL(":script"), filter->script());
@ -2242,8 +2249,8 @@ void DatabaseQueries::removeMessageFilterFromFeed(const QSqlDatabase& db, const
int filter_id, int account_id, bool* ok) { int filter_id, int account_id, bool* ok) {
QSqlQuery q(db); QSqlQuery q(db);
q.prepare("DELETE FROM MessageFiltersInFeeds " q.prepare(QSL("DELETE FROM MessageFiltersInFeeds "
"WHERE filter = :filter AND feed_custom_id = :feed_custom_id AND account_id = :account_id;"); "WHERE filter = :filter AND feed_custom_id = :feed_custom_id AND account_id = :account_id;"));
q.bindValue(QSL(":filter"), filter_id); q.bindValue(QSL(":filter"), filter_id);
q.bindValue(QSL(":feed_custom_id"), feed_custom_id); q.bindValue(QSL(":feed_custom_id"), feed_custom_id);
@ -2300,7 +2307,7 @@ bool DatabaseQueries::storeNewOauthTokens(const QSqlDatabase& db,
QVariantHash custom_data = deserializeCustomData(query.value(0).toString()); QVariantHash custom_data = deserializeCustomData(query.value(0).toString());
custom_data["refresh_token"] = refresh_token; custom_data[QSL("refresh_token")] = refresh_token;
query.clear(); query.clear();
query.prepare(QSL("UPDATE Accounts SET custom_data = :custom_data WHERE id = :id;")); query.prepare(QSL("UPDATE Accounts SET custom_data = :custom_data WHERE id = :id;"));
@ -2319,5 +2326,5 @@ bool DatabaseQueries::storeNewOauthTokens(const QSqlDatabase& db,
} }
QString DatabaseQueries::unnulifyString(const QString& str) { QString DatabaseQueries::unnulifyString(const QString& str) {
return str.isNull() ? "" : str; return str.isNull() ? QSL("") : str;
} }

View file

@ -16,7 +16,7 @@ MariaDbDriver::MariaDbDriver(QObject* parent) : DatabaseDriver(parent), m_databa
MariaDbDriver::MariaDbError MariaDbDriver::testConnection(const QString& hostname, int port, MariaDbDriver::MariaDbError MariaDbDriver::testConnection(const QString& hostname, int port,
const QString& w_database, const QString& username, const QString& w_database, const QString& username,
const QString& password) { const QString& password) {
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER, APP_DB_MYSQL_TEST); QSqlDatabase database = QSqlDatabase::addDatabase(QSL(APP_DB_MYSQL_DRIVER), QSL(APP_DB_MYSQL_TEST));
database.setHostName(hostname); database.setHostName(hostname);
database.setPort(port); database.setPort(port);
@ -93,7 +93,7 @@ QString MariaDbDriver::humanDriverType() const {
} }
QString MariaDbDriver::qtDriverCode() const { QString MariaDbDriver::qtDriverCode() const {
return APP_DB_MYSQL_DRIVER; return QSL(APP_DB_MYSQL_DRIVER);
} }
DatabaseDriver::DriverType MariaDbDriver::driverType() const { DatabaseDriver::DriverType MariaDbDriver::driverType() const {
@ -146,7 +146,7 @@ qint64 MariaDbDriver::databaseDataSize() {
QSqlDatabase MariaDbDriver::initializeDatabase(const QString& connection_name) { QSqlDatabase MariaDbDriver::initializeDatabase(const QString& connection_name) {
// Folders are created. Create new QSqlDatabase object. // Folders are created. Create new QSqlDatabase object.
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER, connection_name); QSqlDatabase database = QSqlDatabase::addDatabase(QSL(APP_DB_MYSQL_DRIVER), connection_name);
const QString database_name = qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLDatabase)).toString(); const QString database_name = qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLDatabase)).toString();
database.setHostName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLHostname)).toString()); database.setHostName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLHostname)).toString());
@ -163,13 +163,13 @@ QSqlDatabase MariaDbDriver::initializeDatabase(const QString& connection_name) {
query_db.setForwardOnly(true); query_db.setForwardOnly(true);
if (!query_db.exec(QString("USE %1").arg(database_name)) || if (!query_db.exec(QSL("USE %1").arg(database_name)) ||
!query_db.exec(QSL("SELECT inf_value FROM Information WHERE inf_key = 'schema_version'"))) { !query_db.exec(QSL("SELECT inf_value FROM Information WHERE inf_key = 'schema_version'"))) {
// If no "rssguard" database exists or schema version is wrong, then initialize it. // If no "rssguard" database exists or schema version is wrong, then initialize it.
qWarningNN << LOGSEC_DB << "Error occurred. MySQL database is not initialized. Initializing now."; qWarningNN << LOGSEC_DB << "Error occurred. MySQL database is not initialized. Initializing now.";
try { try {
const QStringList statements = prepareScript(APP_SQL_PATH, APP_DB_MYSQL_INIT, database_name); const QStringList statements = prepareScript(APP_SQL_PATH, QSL(APP_DB_MYSQL_INIT), database_name);
for (const QString& statement : statements) { for (const QString& statement : statements) {
query_db.exec(statement); query_db.exec(statement);
@ -190,7 +190,7 @@ QSqlDatabase MariaDbDriver::initializeDatabase(const QString& connection_name) {
query_db.next(); query_db.next();
const QString installed_db_schema = query_db.value(0).toString(); const QString installed_db_schema = query_db.value(0).toString();
if (installed_db_schema.toInt() < QString(APP_DB_SCHEMA_VERSION).toInt()) { if (installed_db_schema.toInt() < QSL(APP_DB_SCHEMA_VERSION).toInt()) {
if (updateDatabaseSchema(database, installed_db_schema, database_name)) { if (updateDatabaseSchema(database, installed_db_schema, database_name)) {
qDebugNN << LOGSEC_DB qDebugNN << LOGSEC_DB
<< "Database schema was updated from" << "Database schema was updated from"
@ -218,14 +218,14 @@ bool MariaDbDriver::updateDatabaseSchema(const QSqlDatabase& database,
const QString& source_db_schema_version, const QString& source_db_schema_version,
const QString& database_name) { const QString& database_name) {
int working_version = QString(source_db_schema_version).remove('.').toInt(); int working_version = QString(source_db_schema_version).remove('.').toInt();
const int current_version = QString(APP_DB_SCHEMA_VERSION).remove('.').toInt(); const int current_version = QSL(APP_DB_SCHEMA_VERSION).remove('.').toInt();
while (working_version != current_version) { while (working_version != current_version) {
try { try {
const QStringList statements = prepareScript(APP_SQL_PATH, const QStringList statements = prepareScript(APP_SQL_PATH,
QString(APP_DB_UPDATE_FILE_PATTERN).arg(QSL("mysql"), QSL(APP_DB_UPDATE_FILE_PATTERN).arg(QSL("mysql"),
QString::number(working_version), QString::number(working_version),
QString::number(working_version + 1)), QString::number(working_version + 1)),
database_name); database_name);
for (const QString& statement : statements) { for (const QString& statement : statements) {
@ -275,7 +275,7 @@ QSqlDatabase MariaDbDriver::connection(const QString& connection_name, DatabaseD
else { else {
// Database connection with this name does not exist // Database connection with this name does not exist
// yet, add it and set it up. // yet, add it and set it up.
database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER, connection_name); database = QSqlDatabase::addDatabase(QSL(APP_DB_MYSQL_DRIVER), connection_name);
database.setHostName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLHostname)).toString()); database.setHostName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLHostname)).toString());
database.setPort(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLPort)).toInt()); database.setPort(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLPort)).toInt());
database.setUserName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLUsername)).toString()); database.setUserName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLUsername)).toString());

View file

@ -12,7 +12,7 @@
SqliteDriver::SqliteDriver(bool in_memory, QObject* parent) SqliteDriver::SqliteDriver(bool in_memory, QObject* parent)
: DatabaseDriver(parent), m_inMemoryDatabase(in_memory), : DatabaseDriver(parent), m_inMemoryDatabase(in_memory),
m_databaseFilePath(qApp->userDataFolder() + QDir::separator() + QString(APP_DB_SQLITE_PATH)), m_databaseFilePath(qApp->userDataFolder() + QDir::separator() + QSL(APP_DB_SQLITE_PATH)),
m_fileBasedDatabaseInitialized(false), m_fileBasedDatabaseInitialized(false),
m_inMemoryDatabaseInitialized(false) {} m_inMemoryDatabaseInitialized(false) {}
@ -123,7 +123,7 @@ QSqlDatabase SqliteDriver::connection(const QString& connection_name, DesiredSto
database = QSqlDatabase::database(connection_name); database = QSqlDatabase::database(connection_name);
} }
else { else {
database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER, connection_name); database = QSqlDatabase::addDatabase(QSL(APP_DB_SQLITE_DRIVER), connection_name);
if (want_in_memory) { if (want_in_memory) {
database.setConnectOptions(QSL("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE")); database.setConnectOptions(QSL("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE"));
@ -131,7 +131,7 @@ QSqlDatabase SqliteDriver::connection(const QString& connection_name, DesiredSto
} }
else { else {
const QDir db_path(m_databaseFilePath); const QDir db_path(m_databaseFilePath);
QFile db_file(db_path.absoluteFilePath(APP_DB_SQLITE_FILE)); QFile db_file(db_path.absoluteFilePath(QSL(APP_DB_SQLITE_FILE)));
database.setDatabaseName(db_file.fileName()); database.setDatabaseName(db_file.fileName());
} }
@ -196,7 +196,7 @@ QSqlDatabase SqliteDriver::initializeDatabase(const QString& connection_name, bo
if (!in_memory) { if (!in_memory) {
// Prepare file paths. // Prepare file paths.
const QDir db_path(m_databaseFilePath); const QDir db_path(m_databaseFilePath);
QFile db_file(db_path.absoluteFilePath(APP_DB_SQLITE_FILE)); QFile db_file(db_path.absoluteFilePath(QSL(APP_DB_SQLITE_FILE)));
// Check if database directory exists. // Check if database directory exists.
if (!db_path.exists()) { if (!db_path.exists()) {
@ -218,7 +218,7 @@ QSqlDatabase SqliteDriver::initializeDatabase(const QString& connection_name, bo
// Folders are created. Create new QSQLDatabase object. // Folders are created. Create new QSQLDatabase object.
QSqlDatabase database; QSqlDatabase database;
database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER, connection_name); database = QSqlDatabase::addDatabase(QSL(APP_DB_SQLITE_DRIVER), connection_name);
if (in_memory) { if (in_memory) {
database.setConnectOptions(QSL("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE")); database.setConnectOptions(QSL("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE"));
@ -241,7 +241,7 @@ QSqlDatabase SqliteDriver::initializeDatabase(const QString& connection_name, bo
qWarningNN << LOGSEC_DB << "SQLite database is not initialized. Initializing now."; qWarningNN << LOGSEC_DB << "SQLite database is not initialized. Initializing now.";
try { try {
const QStringList statements = prepareScript(APP_SQL_PATH, APP_DB_SQLITE_INIT); const QStringList statements = prepareScript(APP_SQL_PATH, QSL(APP_DB_SQLITE_INIT));
for (const QString& statement : statements) { for (const QString& statement : statements) {
query_db.exec(statement); query_db.exec(statement);
@ -261,7 +261,7 @@ QSqlDatabase SqliteDriver::initializeDatabase(const QString& connection_name, bo
query_db.next(); query_db.next();
const QString installed_db_schema = query_db.value(0).toString(); const QString installed_db_schema = query_db.value(0).toString();
if (installed_db_schema.toInt() < QString(APP_DB_SCHEMA_VERSION).toInt()) { if (installed_db_schema.toInt() < QSL(APP_DB_SCHEMA_VERSION).toInt()) {
if (updateDatabaseSchema(database, installed_db_schema)) { if (updateDatabaseSchema(database, installed_db_schema)) {
qDebugNN << LOGSEC_DB qDebugNN << LOGSEC_DB
<< "Database schema was updated from '" << "Database schema was updated from '"
@ -302,7 +302,7 @@ QSqlDatabase SqliteDriver::initializeDatabase(const QString& connection_name, bo
QSqlQuery copy_contents(database); QSqlQuery copy_contents(database);
// Attach database. // Attach database.
copy_contents.exec(QString("ATTACH DATABASE '%1' AS 'storage';").arg(file_database.databaseName())); copy_contents.exec(QSL("ATTACH DATABASE '%1' AS 'storage';").arg(file_database.databaseName()));
// Copy all stuff. // Copy all stuff.
QStringList tables; QStringList tables;
@ -317,7 +317,7 @@ QSqlDatabase SqliteDriver::initializeDatabase(const QString& connection_name, bo
} }
for (const QString& table : tables) { for (const QString& table : tables) {
copy_contents.exec(QString("INSERT INTO main.%1 SELECT * FROM storage.%1;").arg(table)); copy_contents.exec(QSL("INSERT INTO main.%1 SELECT * FROM storage.%1;").arg(table));
} }
qDebugNN << LOGSEC_DB qDebugNN << LOGSEC_DB
@ -344,7 +344,7 @@ QString SqliteDriver::databaseFilePath() const {
bool SqliteDriver::updateDatabaseSchema(const QSqlDatabase& database, const QString& source_db_schema_version) { bool SqliteDriver::updateDatabaseSchema(const QSqlDatabase& database, const QString& source_db_schema_version) {
int working_version = QString(source_db_schema_version).remove('.').toInt(); int working_version = QString(source_db_schema_version).remove('.').toInt();
const int current_version = QString(APP_DB_SCHEMA_VERSION).remove('.').toInt(); const int current_version = QSL(APP_DB_SCHEMA_VERSION).remove('.').toInt();
// Now, it would be good to create backup of SQLite DB file. // Now, it would be good to create backup of SQLite DB file.
if (IOFactory::copyFile(databaseFilePath(), databaseFilePath() + ".bak")) { if (IOFactory::copyFile(databaseFilePath(), databaseFilePath() + ".bak")) {
@ -357,9 +357,9 @@ bool SqliteDriver::updateDatabaseSchema(const QSqlDatabase& database, const QStr
while (working_version != current_version) { while (working_version != current_version) {
try { try {
const QStringList statements = prepareScript(APP_SQL_PATH, const QStringList statements = prepareScript(APP_SQL_PATH,
QString(APP_DB_UPDATE_FILE_PATTERN).arg(QSL("sqlite"), QSL(APP_DB_UPDATE_FILE_PATTERN).arg(QSL("sqlite"),
QString::number(working_version), QString::number(working_version),
QString::number(working_version + 1))); QString::number(working_version + 1)));
for (const QString& statement : statements) { for (const QString& statement : statements) {
QSqlQuery query = database.exec(statement); QSqlQuery query = database.exec(statement);
@ -425,7 +425,7 @@ QString SqliteDriver::humanDriverType() const {
} }
QString SqliteDriver::qtDriverCode() const { QString SqliteDriver::qtDriverCode() const {
return APP_DB_SQLITE_DRIVER; return QSL(APP_DB_SQLITE_DRIVER);
} }
void SqliteDriver::backupDatabase(const QString& backup_folder, const QString& backup_name) { void SqliteDriver::backupDatabase(const QString& backup_folder, const QString& backup_name) {

View file

@ -18,7 +18,7 @@
FormAbout::FormAbout(QWidget* parent) : QDialog(parent) { FormAbout::FormAbout(QWidget* parent) : QDialog(parent) {
m_ui.setupUi(this); m_ui.setupUi(this);
m_ui.m_lblIcon->setPixmap(QPixmap(APP_ICON_PATH)); m_ui.m_lblIcon->setPixmap(QPixmap(APP_ICON_PATH));
GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("help-about")), tr("About %1").arg(APP_NAME)); GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("help-about")), tr("About %1").arg(QSL(APP_NAME)));
loadLicenseAndInformation(); loadLicenseAndInformation();
loadSettingsAndPaths(); loadSettingsAndPaths();
} }
@ -73,20 +73,21 @@ void FormAbout::loadLicenseAndInformation() {
// Set other informative texts. // Set other informative texts.
m_ui.m_lblDesc->setText(tr("<b>%8</b><br>" "<b>Version:</b> %1 (built on %2/%3)<br>" "<b>Revision:</b> %4<br>" "<b>Build date:</b> %5<br>" m_ui.m_lblDesc->setText(tr("<b>%8</b><br>" "<b>Version:</b> %1 (built on %2/%3)<br>" "<b>Revision:</b> %4<br>" "<b>Build date:</b> %5<br>"
"<b>Qt:</b> %6 (compiled against %7)<br>").arg( "<b>Qt:</b> %6 (compiled against %7)<br>").arg(
qApp->applicationVersion(), APP_SYSTEM_NAME, APP_SYSTEM_VERSION, APP_REVISION, qApp->applicationVersion(), QSL(APP_SYSTEM_NAME),
QLocale().toString(TextFactory::parseDateTime(QString("%1 %2").arg(__DATE__, __TIME__)), QSL(APP_SYSTEM_VERSION), QSL(APP_REVISION),
QLocale().toString(TextFactory::parseDateTime(QSL("%1 %2").arg(__DATE__, __TIME__)),
QLocale::FormatType::ShortFormat), QLocale::FormatType::ShortFormat),
qVersion(), QT_VERSION_STR, qVersion(), QSL(QT_VERSION_STR),
APP_NAME)); QSL(APP_NAME)));
m_ui.m_txtInfo->setText(tr("<body>%5 is a (very) tiny feed reader." m_ui.m_txtInfo->setText(tr("<body>%5 is a (very) tiny feed reader."
"<br><br>This software is distributed under the terms of GNU General Public License, version 3." "<br><br>This software is distributed under the terms of GNU General Public License, version 3."
"<br><br>Contacts:" "<br><br>Contacts:"
"<ul><li><a href=\"mailto://%1\">%1</a> ~e-mail</li>" "<ul><li><a href=\"mailto://%1\">%1</a> ~e-mail</li>"
"<li><a href=\"%2\">%2</a> ~website</li></ul>" "<li><a href=\"%2\">%2</a> ~website</li></ul>"
"You can obtain source code for %5 from its website." "You can obtain source code for %5 from its website."
"<br><br><br>Copyright (C) 2011-%3 %4</body>").arg(APP_EMAIL, APP_URL, "<br><br><br>Copyright (C) 2011-%3 %4</body>").arg(QSL(APP_EMAIL), QSL(APP_URL),
QString::number(QDateTime::currentDateTime() QString::number(QDateTime::currentDateTime()
.date() .date()
.year()), .year()),
APP_AUTHOR, APP_NAME)); QSL(APP_AUTHOR), QSL(APP_NAME)));
} }

View file

@ -29,7 +29,7 @@ FormBackupDatabaseSettings::FormBackupDatabaseSettings(QWidget* parent) : QDialo
connect(m_ui->m_txtBackupName->lineEdit(), &BaseLineEdit::textChanged, this, &FormBackupDatabaseSettings::checkOkButton); connect(m_ui->m_txtBackupName->lineEdit(), &BaseLineEdit::textChanged, this, &FormBackupDatabaseSettings::checkOkButton);
connect(m_ui->m_btnSelectFolder, &QPushButton::clicked, this, &FormBackupDatabaseSettings::selectFolderInitial); connect(m_ui->m_btnSelectFolder, &QPushButton::clicked, this, &FormBackupDatabaseSettings::selectFolderInitial);
selectFolder(qApp->documentsFolder()); selectFolder(qApp->documentsFolder());
m_ui->m_txtBackupName->lineEdit()->setText(QString(APP_LOW_NAME) + QL1S("_") + m_ui->m_txtBackupName->lineEdit()->setText(QSL(APP_LOW_NAME) + QL1S("_") +
QDateTime::currentDateTime().toString(QSL("yyyyMMddHHmm"))); QDateTime::currentDateTime().toString(QSL("yyyyMMddHHmm")));
m_ui->m_lblResult->setStatus(WidgetWithStatus::StatusType::Warning, tr("No operation executed yet."), tr("No operation executed yet.")); m_ui->m_lblResult->setStatus(WidgetWithStatus::StatusType::Warning, tr("No operation executed yet."), tr("No operation executed yet."));

View file

@ -60,7 +60,7 @@ FormMain::FormMain(QWidget* parent, Qt::WindowFlags f)
qApp->setMainForm(this); qApp->setMainForm(this);
setWindowIcon(qApp->desktopAwareIcon()); setWindowIcon(qApp->desktopAwareIcon());
setWindowTitle(APP_LONG_NAME); setWindowTitle(QSL(APP_LONG_NAME));
#if defined(USE_WEBENGINE) #if defined(USE_WEBENGINE)
m_ui->m_menuWebBrowserTabs->addAction(qApp->web()->adBlock()->adBlockIcon()); m_ui->m_menuWebBrowserTabs->addAction(qApp->web()->adBlock()->adBlockIcon());
@ -209,7 +209,7 @@ void FormMain::prepareMenus() {
// Setup menu for tray icon. // Setup menu for tray icon.
if (SystemTrayIcon::isSystemTrayAreaAvailable()) { if (SystemTrayIcon::isSystemTrayAreaAvailable()) {
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
m_trayMenu = new TrayIconMenu(APP_NAME, this); m_trayMenu = new TrayIconMenu(QSL(APP_NAME), this);
#else #else
m_trayMenu = new QMenu(QSL(APP_NAME), this); m_trayMenu = new QMenu(QSL(APP_NAME), this);
#endif #endif
@ -228,6 +228,7 @@ void FormMain::prepareMenus() {
m_ui->m_menuWebBrowserTabs->removeAction(m_ui->m_actionTabNewWebBrowser); m_ui->m_menuWebBrowserTabs->removeAction(m_ui->m_actionTabNewWebBrowser);
m_ui->m_menuWebBrowserTabs->setTitle(tr("Ta&bs")); m_ui->m_menuWebBrowserTabs->setTitle(tr("Ta&bs"));
#endif #endif
#if defined(Q_OS_MACOS) #if defined(Q_OS_MACOS)
m_ui->m_actionSwitchMainMenu->setVisible(false); m_ui->m_actionSwitchMainMenu->setVisible(false);
m_ui->m_actionFullscreen->setVisible(false); m_ui->m_actionFullscreen->setVisible(false);
@ -878,7 +879,7 @@ void FormMain::hideEvent(QHideEvent* event) {
} }
void FormMain::showDocs() { void FormMain::showDocs() {
qApp->web()->openUrlInExternalBrowser(APP_URL_DOCUMENTATION); qApp->web()->openUrlInExternalBrowser(QSL(APP_URL_DOCUMENTATION));
} }
void FormMain::showAddAccountDialog() { void FormMain::showAddAccountDialog() {

View file

@ -57,7 +57,7 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q
m_ui.m_treeExistingMessages->header()->setSectionResizeMode(MFM_MODEL_URL, QHeaderView::ResizeMode::Interactive); m_ui.m_treeExistingMessages->header()->setSectionResizeMode(MFM_MODEL_URL, QHeaderView::ResizeMode::Interactive);
connect(m_ui.m_btnDetailedHelp, &QPushButton::clicked, this, []() { connect(m_ui.m_btnDetailedHelp, &QPushButton::clicked, this, []() {
qApp->web()->openUrlInExternalBrowser(MSG_FILTERING_HELP); qApp->web()->openUrlInExternalBrowser(QSL(MSG_FILTERING_HELP));
}); });
connect(m_ui.m_listFilters, &QListWidget::currentRowChanged, connect(m_ui.m_listFilters, &QListWidget::currentRowChanged,
this, &FormMessageFiltersManager::loadFilter); this, &FormMessageFiltersManager::loadFilter);

View file

@ -75,7 +75,7 @@ void FormSettings::applySettings() {
if (!panels_for_restart.isEmpty()) { if (!panels_for_restart.isEmpty()) {
const QStringList changed_settings_description = panels_for_restart.replaceInStrings(QRegularExpression(QSL("^")), const QStringList changed_settings_description = panels_for_restart.replaceInStrings(QRegularExpression(QSL("^")),
QString::fromUtf8("")); QString::fromUtf8(QByteArray("")));
const QMessageBox::StandardButton clicked_button = MessageBox::show(this, const QMessageBox::StandardButton clicked_button = MessageBox::show(this,
QMessageBox::Icon::Question, QMessageBox::Icon::Question,
tr("Critical settings were changed"), tr("Critical settings were changed"),
@ -111,7 +111,7 @@ void FormSettings::cancelSettings() {
} }
else { else {
const QStringList changed_settings_description = changed_panels.replaceInStrings(QRegularExpression(QSL("^")), const QStringList changed_settings_description = changed_panels.replaceInStrings(QRegularExpression(QSL("^")),
QString::fromUtf8("")); QString::fromUtf8(QByteArray("")));
if (MessageBox::show(this, if (MessageBox::show(this,
QMessageBox::Icon::Critical, QMessageBox::Icon::Critical,

View file

@ -20,7 +20,7 @@
FormUpdate::FormUpdate(QWidget* parent) FormUpdate::FormUpdate(QWidget* parent)
: QDialog(parent) { : QDialog(parent) {
m_ui.setupUi(this); m_ui.setupUi(this);
m_ui.m_lblCurrentRelease->setText(APP_VERSION); m_ui.m_lblCurrentRelease->setText(QSL(APP_VERSION));
m_ui.m_tabInfo->removeTab(1); m_ui.m_tabInfo->removeTab(1);
m_ui.m_buttonBox->setEnabled(false); m_ui.m_buttonBox->setEnabled(false);
@ -78,7 +78,7 @@ void FormUpdate::checkForUpdates() {
m_ui.m_lblAvailableRelease->setText(m_updateInfo.m_availableVersion); m_ui.m_lblAvailableRelease->setText(m_updateInfo.m_availableVersion);
m_ui.m_txtChanges->setText(m_updateInfo.m_changes); m_ui.m_txtChanges->setText(m_updateInfo.m_changes);
if (SystemFactory::isVersionNewer(m_updateInfo.m_availableVersion, APP_VERSION)) { if (SystemFactory::isVersionNewer(m_updateInfo.m_availableVersion, QSL(APP_VERSION))) {
m_btnUpdate->setVisible(true); m_btnUpdate->setVisible(true);
m_ui.m_lblStatus->setStatus(WidgetWithStatus::StatusType::Ok, m_ui.m_lblStatus->setStatus(WidgetWithStatus::StatusType::Ok,
tr("New release available."), tr("New release available."),
@ -200,7 +200,7 @@ void FormUpdate::startUpdate() {
m_ui.m_listFiles->setEnabled(false); m_ui.m_listFiles->setEnabled(false);
} }
else { else {
url_file = APP_URL; url_file = QSL(APP_URL);
} }
if (m_readyToInstall) { if (m_readyToInstall) {

View file

@ -415,7 +415,7 @@ void FeedsView::selectNextUnreadItem() {
} }
} }
QModelIndex FeedsView::nextPreviousUnreadItem(QModelIndex default_row) { QModelIndex FeedsView::nextPreviousUnreadItem(const QModelIndex& default_row) {
const bool started_from_zero = default_row.row() == 0 && !default_row.parent().isValid(); const bool started_from_zero = default_row.row() == 0 && !default_row.parent().isValid();
QModelIndex next_index = nextUnreadItem(default_row); QModelIndex next_index = nextUnreadItem(default_row);
@ -427,34 +427,34 @@ QModelIndex FeedsView::nextPreviousUnreadItem(QModelIndex default_row) {
return next_index; return next_index;
} }
QModelIndex FeedsView::nextUnreadItem(QModelIndex default_row) { QModelIndex FeedsView::nextUnreadItem(const QModelIndex& default_row) {
default_row = m_proxyModel->index(default_row.row(), 0, default_row.parent()); QModelIndex nconst_default_row = m_proxyModel->index(default_row.row(), 0, default_row.parent());
const QModelIndex starting_row = default_row; const QModelIndex starting_row = default_row;
while (true) { while (true) {
bool has_unread = m_sourceModel->itemForIndex(m_proxyModel->mapToSource(default_row))->countOfUnreadMessages() > 0; bool has_unread = m_sourceModel->itemForIndex(m_proxyModel->mapToSource(nconst_default_row))->countOfUnreadMessages() > 0;
if (has_unread) { if (has_unread) {
if (m_proxyModel->hasChildren(default_row)) { if (m_proxyModel->hasChildren(nconst_default_row)) {
// Current index has unread items, but is expandable, go to first child. // Current index has unread items, but is expandable, go to first child.
expand(default_row); expand(nconst_default_row);
default_row = indexBelow(default_row); nconst_default_row = indexBelow(nconst_default_row);
continue; continue;
} }
else { else {
// We found unread feed, return it. // We found unread feed, return it.
return default_row; return nconst_default_row;
} }
} }
else { else {
QModelIndex next_row = indexBelow(default_row); QModelIndex next_row = indexBelow(nconst_default_row);
if (next_row == default_row || !next_row.isValid() || starting_row == next_row) { if (next_row == nconst_default_row || !next_row.isValid() || starting_row == next_row) {
// We came to last row probably. // We came to last row probably.
break; break;
} }
else { else {
default_row = next_row; nconst_default_row = next_row;
} }
} }
} }

View file

@ -101,8 +101,8 @@ class RSSGUARD_DLLSPEC FeedsView : public QTreeView {
void onItemExpandStateSaveRequested(RootItem* item); void onItemExpandStateSaveRequested(RootItem* item);
private: private:
QModelIndex nextPreviousUnreadItem(QModelIndex default_row); QModelIndex nextPreviousUnreadItem(const QModelIndex& default_row);
QModelIndex nextUnreadItem(QModelIndex default_row); QModelIndex nextUnreadItem(const QModelIndex& default_row);
// Initializes context menus. // Initializes context menus.
QMenu* initializeContextMenuBin(RootItem* clicked_item); QMenu* initializeContextMenuBin(RootItem* clicked_item);

View file

@ -54,10 +54,6 @@ void GuiUtilities::applyResponsiveDialogResize(QWidget& widget, double factor) {
} }
void GuiUtilities::restoreState(QWidget* wdg, QByteArray state) { void GuiUtilities::restoreState(QWidget* wdg, QByteArray state) {
QHash<QString, QStringList> props_to_serialize {
{ QSL("QCheckBox"), { QSL("checked") } },
{ QSL("QSpinBox"), { QSL("value") } }
};
QHash<QString, QHash<QString, QVariant>> props; QHash<QString, QHash<QString, QVariant>> props;
QDataStream str(&state, QIODevice::OpenModeFlag::ReadOnly); QDataStream str(&state, QIODevice::OpenModeFlag::ReadOnly);

View file

@ -63,7 +63,7 @@ QMessageBox::StandardButton MessageBox::show(QWidget* parent,
QMessageBox::StandardButton default_button, QMessageBox::StandardButton default_button,
bool* dont_show_again, bool* dont_show_again,
const QString& functor_heading, const QString& functor_heading,
std::function<void ()> functor) { const std::function<void()>& functor) {
// Create and find needed components. // Create and find needed components.
MessageBox msg_box(parent); MessageBox msg_box(parent);

View file

@ -30,7 +30,7 @@ class MessageBox : public QMessageBox {
QMessageBox::StandardButton default_button = QMessageBox::Ok, QMessageBox::StandardButton default_button = QMessageBox::Ok,
bool* dont_show_again = nullptr, bool* dont_show_again = nullptr,
const QString& functor_heading = {}, const QString& functor_heading = {},
std::function<void()> functor = nullptr); const std::function<void()>& functor = nullptr);
static QIcon iconForStatus(QMessageBox::Icon status); static QIcon iconForStatus(QMessageBox::Icon status);
}; };

View file

@ -31,15 +31,15 @@
void MessagePreviewer::createConnections() { void MessagePreviewer::createConnections() {
installEventFilter(this); installEventFilter(this);
connect(m_actionMarkRead = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-read"), tr("Mark article read")), connect(m_actionMarkRead = m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-read")), tr("Mark article read")),
&QAction::triggered, &QAction::triggered,
this, this,
&MessagePreviewer::markMessageAsRead); &MessagePreviewer::markMessageAsRead);
connect(m_actionMarkUnread = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-unread"), tr("Mark article unread")), connect(m_actionMarkUnread = m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-unread")), tr("Mark article unread")),
&QAction::triggered, &QAction::triggered,
this, this,
&MessagePreviewer::markMessageAsUnread); &MessagePreviewer::markMessageAsUnread);
connect(m_actionSwitchImportance = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-important"), tr("Switch article importance")), connect(m_actionSwitchImportance = m_toolBar->addAction(qApp->icons()->fromTheme(QSL("mail-mark-important")), tr("Switch article importance")),
&QAction::triggered, &QAction::triggered,
this, this,
&MessagePreviewer::switchMessageImportance); &MessagePreviewer::switchMessageImportance);

View file

@ -445,7 +445,7 @@ void MessagesView::openSelectedSourceMessagesExternally() {
for (const QModelIndex& index : qAsConst(rws)) { for (const QModelIndex& index : qAsConst(rws)) {
QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row()) QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row())
.m_url .m_url
.replace(QRegularExpression("[\\t\\n]"), QString()); .replace(QRegularExpression(QSL("[\\t\\n]")), QString());
qApp->web()->openUrlInExternalBrowser(link); qApp->web()->openUrlInExternalBrowser(link);
} }
@ -691,7 +691,7 @@ void MessagesView::openSelectedMessagesWithExternalTool() {
for (const QModelIndex& index : qAsConst(rws)) { for (const QModelIndex& index : qAsConst(rws)) {
const QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row()) const QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row())
.m_url .m_url
.replace(QRegularExpression("[\\t\\n]"), QString()); .replace(QRegularExpression(QSL("[\\t\\n]")), QString());
if (!link.isEmpty()) { if (!link.isEmpty()) {
if (!tool.run(link)) { if (!tool.run(link)) {

View file

@ -2,6 +2,8 @@
#include "gui/reusable/colortoolbutton.h" #include "gui/reusable/colortoolbutton.h"
#include "definitions/definitions.h"
#include <QColorDialog> #include <QColorDialog>
#include <QPainter> #include <QPainter>
#include <QPainterPath> #include <QPainterPath>
@ -34,7 +36,7 @@ void ColorToolButton::setColor(const QColor& color) {
void ColorToolButton::setRandomColor() { void ColorToolButton::setRandomColor() {
auto rnd_color = QRandomGenerator::global()->bounded(0xFFFFFF); auto rnd_color = QRandomGenerator::global()->bounded(0xFFFFFF);
auto rnd_color_name = QString("#%1").arg(QString::number(rnd_color, 16)); auto rnd_color_name = QSL("#%1").arg(QString::number(rnd_color, 16));
setColor(rnd_color_name); setColor(rnd_color_name);
emit colorChanged(rnd_color_name); emit colorChanged(rnd_color_name);

View file

@ -16,7 +16,7 @@ LabelsMenu::LabelsMenu(const QList<Message>& messages, const QList<Label*>& labe
setIcon(qApp->icons()->fromTheme(QSL("tag-folder"))); setIcon(qApp->icons()->fromTheme(QSL("tag-folder")));
if (labels.isEmpty()) { if (labels.isEmpty()) {
QAction* act_not_labels = new QAction("No labels found"); QAction* act_not_labels = new QAction(tr("No labels found"));
act_not_labels->setEnabled(false); act_not_labels->setEnabled(false);
addAction(act_not_labels); addAction(act_not_labels);

View file

@ -15,7 +15,7 @@ void NonClosableMenu::keyPressEvent(QKeyEvent* event) {
} }
void NonClosableMenu::mousePressEvent(QMouseEvent* event) { void NonClosableMenu::mousePressEvent(QMouseEvent* event) {
auto* act = dynamic_cast<QAction*>(activeAction()); auto* act = activeAction();
if (act != nullptr) { if (act != nullptr) {
act->toggle(); act->toggle();

View file

@ -2,6 +2,8 @@
#include "gui/reusable/timespinbox.h" #include "gui/reusable/timespinbox.h"
#include "definitions/definitions.h"
#include <QStringList> #include <QStringList>
TimeSpinBox::TimeSpinBox(QWidget* parent) : QDoubleSpinBox(parent) { TimeSpinBox::TimeSpinBox(QWidget* parent) : QDoubleSpinBox(parent) {
@ -19,7 +21,7 @@ double TimeSpinBox::valueFromText(const QString& text) const {
return value; return value;
} }
else { else {
QRegularExpression rx("\\b[0-9]{1,}\\b"); QRegularExpression rx(QSL("\\b[0-9]{1,}\\b"));
QStringList numbers; QStringList numbers;
int pos = 0; int pos = 0;
int count = 0; int count = 0;
@ -84,7 +86,7 @@ TimeSpinBox::Mode TimeSpinBox::mode() const {
return m_mode; return m_mode;
} }
void TimeSpinBox::setMode(const TimeSpinBox::Mode& mode) { void TimeSpinBox::setMode(TimeSpinBox::Mode mode) {
m_mode = mode; m_mode = mode;
setValue(value()); setValue(value());

View file

@ -22,7 +22,7 @@ class TimeSpinBox : public QDoubleSpinBox {
QValidator::State validate(QString& input, int& pos) const; QValidator::State validate(QString& input, int& pos) const;
Mode mode() const; Mode mode() const;
void setMode(const TimeSpinBox::Mode& mode); void setMode(Mode mode);
private: private:
Mode m_mode; Mode m_mode;

View file

@ -93,8 +93,8 @@ void SettingsBrowserMail::selectBrowserExecutable() {
} }
} }
QList<ExternalTool> SettingsBrowserMail::externalTools() const { QVector<ExternalTool> SettingsBrowserMail::externalTools() const {
QList<ExternalTool> list; QVector<ExternalTool> list; list.reserve(m_ui->m_listTools->topLevelItemCount());
for (int i = 0; i < m_ui->m_listTools->topLevelItemCount(); i++) { for (int i = 0; i < m_ui->m_listTools->topLevelItemCount(); i++) {
list.append(m_ui->m_listTools->topLevelItem(i)->data(0, Qt::ItemDataRole::UserRole).value<ExternalTool>()); list.append(m_ui->m_listTools->topLevelItem(i)->data(0, Qt::ItemDataRole::UserRole).value<ExternalTool>());
@ -241,7 +241,7 @@ ExternalTool SettingsBrowserMail::tweakExternalTool(const ExternalTool& tool) co
bool ok; bool ok;
QString parameters = QInputDialog::getText(window(), QString parameters = QInputDialog::getText(window(),
tr("Enter parameters"), tr("Enter parameters"),
tr("Enter (optional) parameters separated by \"%1\":").arg(EXECUTION_LINE_SEPARATOR), tr("Enter (optional) parameters separated by \"%1\":").arg(QSL(EXECUTION_LINE_SEPARATOR)),
QLineEdit::EchoMode::Normal, QLineEdit::EchoMode::Normal,
tool.parameters(), tool.parameters(),
&ok); &ok);

View file

@ -35,7 +35,7 @@ class SettingsBrowserMail : public SettingsPanel {
ExternalTool tweakExternalTool(const ExternalTool& tool) const; ExternalTool tweakExternalTool(const ExternalTool& tool) const;
private: private:
QList<ExternalTool> externalTools() const; QVector<ExternalTool> externalTools() const;
void setExternalTools(const QList<ExternalTool>& list); void setExternalTools(const QList<ExternalTool>& list);
NetworkProxyDetails* m_proxyDetails; NetworkProxyDetails* m_proxyDetails;

View file

@ -188,8 +188,8 @@ void Application::offerChanges() const {
qApp->showGuiMessage(Notification::Event::GeneralEvent, qApp->showGuiMessage(Notification::Event::GeneralEvent,
QSL(APP_NAME), QSL(APP_NAME),
QObject::tr("Welcome to %1.\n\nPlease, check NEW stuff included in this\n" QObject::tr("Welcome to %1.\n\nPlease, check NEW stuff included in this\n"
"version by clicking this popup notification.").arg(APP_LONG_NAME), "version by clicking this popup notification.").arg(QSL(APP_LONG_NAME)),
QSystemTrayIcon::MessageIcon::NoIcon, {}, {}, "Go to changelog", [] { QSystemTrayIcon::MessageIcon::NoIcon, {}, {}, tr("Go to changelog"), [] {
FormAbout(qApp->mainForm()).exec(); FormAbout(qApp->mainForm()).exec();
}); });
} }
@ -198,12 +198,12 @@ void Application::offerChanges() const {
bool Application::isAlreadyRunning() { bool Application::isAlreadyRunning() {
return m_allowMultipleInstances return m_allowMultipleInstances
? false ? false
: sendMessage((QStringList() << QSL("-%1").arg(CLI_IS_RUNNING) : sendMessage((QStringList() << QSL("-%1").arg(QSL(CLI_IS_RUNNING))
<< Application::arguments().mid(1)).join(ARGUMENTS_LIST_SEPARATOR)); << Application::arguments().mid(1)).join(QSL(ARGUMENTS_LIST_SEPARATOR)));
} }
QStringList Application::builtinSounds() const { QStringList Application::builtinSounds() const {
auto builtin_sounds = QDir(SOUNDS_BUILTIN_DIRECTORY).entryInfoList(QDir::Filter::Files, QDir::SortFlag::Name); auto builtin_sounds = QDir(QSL(SOUNDS_BUILTIN_DIRECTORY)).entryInfoList(QDir::Filter::Files, QDir::SortFlag::Name);
auto iter = boolinq::from(builtin_sounds).select([](const QFileInfo& i) { auto iter = boolinq::from(builtin_sounds).select([](const QFileInfo& i) {
return i.absoluteFilePath(); return i.absoluteFilePath();
}).toStdList(); }).toStdList();
@ -652,32 +652,32 @@ void Application::parseCmdArgumentsFromOtherInstance(const QString& message) {
<< "execution message."; << "execution message.";
#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 #if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
QStringList messages = message.split(ARGUMENTS_LIST_SEPARATOR, Qt::SplitBehaviorFlags::SkipEmptyParts); QStringList messages = message.split(QSL(ARGUMENTS_LIST_SEPARATOR), Qt::SplitBehaviorFlags::SkipEmptyParts);
#else #else
QStringList messages = message.split(ARGUMENTS_LIST_SEPARATOR, QString::SplitBehavior::SkipEmptyParts); QStringList messages = message.split(QSL(ARGUMENTS_LIST_SEPARATOR), QString::SplitBehavior::SkipEmptyParts);
#endif #endif
QCommandLineParser cmd_parser; QCommandLineParser cmd_parser;
messages.prepend(qApp->applicationFilePath()); messages.prepend(qApp->applicationFilePath());
cmd_parser.addOption(QCommandLineOption(QStringList() << CLI_QUIT_INSTANCE)); cmd_parser.addOption(QCommandLineOption({ QSL(CLI_QUIT_INSTANCE) }));
cmd_parser.addOption(QCommandLineOption(QStringList() << CLI_IS_RUNNING)); cmd_parser.addOption(QCommandLineOption({ QSL(CLI_IS_RUNNING) }));
cmd_parser.addPositionalArgument("urls", cmd_parser.addPositionalArgument(QSL("urls"),
"List of URL addresses pointing to individual online feeds which should be added.", QSL("List of URL addresses pointing to individual online feeds which should be added."),
"[url-1 ... url-n]"); QSL("[url-1 ... url-n]"));
if (!cmd_parser.parse(messages)) { if (!cmd_parser.parse(messages)) {
qCriticalNN << LOGSEC_CORE << cmd_parser.errorText(); qCriticalNN << LOGSEC_CORE << cmd_parser.errorText();
} }
if (cmd_parser.isSet(CLI_QUIT_INSTANCE)) { if (cmd_parser.isSet(QSL(CLI_QUIT_INSTANCE))) {
quit(); quit();
return; return;
} }
else if (cmd_parser.isSet(CLI_IS_RUNNING)) { else if (cmd_parser.isSet(QSL(CLI_IS_RUNNING))) {
showGuiMessage(Notification::Event::GeneralEvent, showGuiMessage(Notification::Event::GeneralEvent,
APP_NAME, QSL(APP_NAME),
tr("Application is already running."), tr("Application is already running."),
QSystemTrayIcon::MessageIcon::Information); QSystemTrayIcon::MessageIcon::Information);
mainForm()->display(); mainForm()->display();
@ -705,35 +705,35 @@ void Application::parseCmdArgumentsFromOtherInstance(const QString& message) {
} }
void Application::parseCmdArgumentsFromMyInstance() { void Application::parseCmdArgumentsFromMyInstance() {
QCommandLineOption help(QStringList() << CLI_HELP_SHORT << CLI_HELP_LONG, QCommandLineOption help({ QSL(CLI_HELP_SHORT), QSL(CLI_HELP_LONG) },
"Displays overview of CLI."); QSL("Displays overview of CLI."));
QCommandLineOption version(QStringList() << CLI_VER_SHORT << CLI_VER_LONG, QCommandLineOption version({ QSL(CLI_VER_SHORT), QSL(CLI_VER_LONG) },
"Displays version of the application."); QSL("Displays version of the application."));
QCommandLineOption log_file(QStringList() << CLI_LOG_SHORT << CLI_LOG_LONG, QCommandLineOption log_file({ QSL(CLI_LOG_SHORT), QSL(CLI_LOG_LONG) },
"Write application debug log to file. Note that logging to file may slow application down.", QSL("Write application debug log to file. Note that logging to file may slow application down."),
"log-file"); QSL("log-file"));
QCommandLineOption custom_data_folder(QStringList() << CLI_DAT_SHORT << CLI_DAT_LONG, QCommandLineOption custom_data_folder({ QSL(CLI_DAT_SHORT), QSL(CLI_DAT_LONG) },
"Use custom folder for user data and disable single instance application mode.", QSL("Use custom folder for user data and disable single instance application mode."),
"user-data-folder"); QSL("user-data-folder"));
QCommandLineOption disable_singleinstance(QStringList() << CLI_SIN_SHORT << CLI_SIN_LONG, QCommandLineOption disable_singleinstance({ QSL(CLI_SIN_SHORT), QSL(CLI_SIN_LONG) },
"Allow running of multiple application instances."); QSL("Allow running of multiple application instances."));
QCommandLineOption disable_debug(QStringList() << CLI_NDEBUG_SHORT << CLI_NDEBUG_LONG, QCommandLineOption disable_debug({ QSL(CLI_NDEBUG_SHORT), QSL(CLI_NDEBUG_LONG) },
"Completely disable stdout/stderr outputs."); QSL("Completely disable stdout/stderr outputs."));
m_cmdParser.addOptions({ help, version, log_file, custom_data_folder, disable_singleinstance, disable_debug }); m_cmdParser.addOptions({ help, version, log_file, custom_data_folder, disable_singleinstance, disable_debug });
m_cmdParser.addPositionalArgument("urls", m_cmdParser.addPositionalArgument(QSL("urls"),
"List of URL addresses pointing to individual online feeds which should be added.", QSL("List of URL addresses pointing to individual online feeds which should be added."),
"[url-1 ... url-n]"); QSL("[url-1 ... url-n]"));
m_cmdParser.setApplicationDescription(APP_NAME); m_cmdParser.setApplicationDescription(QSL(APP_NAME));
if (!m_cmdParser.parse(QCoreApplication::arguments())) { if (!m_cmdParser.parse(QCoreApplication::arguments())) {
qCriticalNN << LOGSEC_CORE << m_cmdParser.errorText(); qCriticalNN << LOGSEC_CORE << m_cmdParser.errorText();
} }
s_customLogFile = m_cmdParser.value(CLI_LOG_SHORT); s_customLogFile = m_cmdParser.value(QSL(CLI_LOG_SHORT));
if (!m_cmdParser.value(CLI_DAT_SHORT).isEmpty()) { if (!m_cmdParser.value(QSL(CLI_DAT_SHORT)).isEmpty()) {
auto data_folder = QDir::toNativeSeparators(m_cmdParser.value(CLI_DAT_SHORT)); auto data_folder = QDir::toNativeSeparators(m_cmdParser.value(QSL(CLI_DAT_SHORT)));
qDebugNN << LOGSEC_CORE qDebugNN << LOGSEC_CORE
<< "User wants to use custom directory for user data (and disable single instance mode):" << "User wants to use custom directory for user data (and disable single instance mode):"
@ -745,19 +745,19 @@ void Application::parseCmdArgumentsFromMyInstance() {
m_allowMultipleInstances = false; m_allowMultipleInstances = false;
} }
if (m_cmdParser.isSet(CLI_HELP_SHORT)) { if (m_cmdParser.isSet(QSL(CLI_HELP_SHORT))) {
m_cmdParser.showHelp(); m_cmdParser.showHelp();
} }
else if (m_cmdParser.isSet(CLI_VER_SHORT)) { else if (m_cmdParser.isSet(QSL(CLI_VER_SHORT))) {
m_cmdParser.showVersion(); m_cmdParser.showVersion();
} }
if (m_cmdParser.isSet(CLI_SIN_SHORT)) { if (m_cmdParser.isSet(QSL(CLI_SIN_SHORT))) {
m_allowMultipleInstances = true; m_allowMultipleInstances = true;
qDebugNN << LOGSEC_CORE << "Explicitly allowing this instance to run."; qDebugNN << LOGSEC_CORE << "Explicitly allowing this instance to run.";
} }
if (m_cmdParser.isSet(CLI_NDEBUG_SHORT)) { if (m_cmdParser.isSet(QSL(CLI_NDEBUG_SHORT))) {
s_disableDebug = true; s_disableDebug = true;
qDebugNN << LOGSEC_CORE << "Disabling any stdout/stderr outputs."; qDebugNN << LOGSEC_CORE << "Disabling any stdout/stderr outputs.";
} }

View file

@ -59,7 +59,7 @@ QList<ExternalTool> ExternalTool::toolsFromSettings() {
return tools; return tools;
} }
void ExternalTool::setToolsToSettings(QList<ExternalTool>& tools) { void ExternalTool::setToolsToSettings(QVector<ExternalTool>& tools) {
QStringList encode; QStringList encode;
for (ExternalTool tool : tools) { for (ExternalTool tool : tools) {

View file

@ -21,7 +21,7 @@ class ExternalTool {
public: public:
static ExternalTool fromString(const QString& str); static ExternalTool fromString(const QString& str);
static QList<ExternalTool> toolsFromSettings(); static QList<ExternalTool> toolsFromSettings();
static void setToolsToSettings(QList<ExternalTool>& tools); static void setToolsToSettings(QVector<ExternalTool>& tools);
private: private:
QString m_executable; QString m_executable;