working on unification of SQL logic
This commit is contained in:
parent
2c64bb1569
commit
f2a8f63f91
|
@ -1,100 +1,44 @@
|
||||||
DROP TABLE IF EXISTS Information;
|
CREATE TABLE Information (
|
||||||
-- !
|
inf_key TEXT NOT NULL UNIQUE CHECK (inf_key != ''),
|
||||||
CREATE TABLE IF NOT EXISTS Information (
|
inf_value TEXT
|
||||||
id INTEGER PRIMARY KEY,
|
|
||||||
inf_key TEXT NOT NULL,
|
|
||||||
inf_value TEXT NOT NULL
|
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
INSERT INTO Information VALUES (1, 'schema_version', '1');
|
INSERT INTO Information VALUES ('schema_version', '1');
|
||||||
-- !
|
-- !
|
||||||
CREATE TABLE IF NOT EXISTS Accounts (
|
CREATE TABLE Accounts (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
type TEXT NOT NULL CHECK (type != ''),
|
type TEXT NOT NULL CHECK (type != ''), /* ID of the account type. Each account defines its own, for example 'ttrss'. */
|
||||||
proxy_type INTEGER NOT NULL CHECK (proxy_type >= 0) DEFAULT 0,
|
proxy_type INTEGER NOT NULL DEFAULT 0 CHECK (proxy_type >= 0),
|
||||||
proxy_host TEXT,
|
proxy_host TEXT,
|
||||||
proxy_port INTEGER,
|
proxy_port INTEGER,
|
||||||
proxy_username TEXT,
|
proxy_username TEXT,
|
||||||
proxy_password TEXT
|
proxy_password TEXT,
|
||||||
|
/* Custom attributes dynamically mapped to actual account data fields. */
|
||||||
|
custom_data_1 TEXT,
|
||||||
|
custom_data_2 TEXT,
|
||||||
|
custom_data_3 TEXT,
|
||||||
|
custom_data_4 TEXT,
|
||||||
|
custom_data_5 TEXT,
|
||||||
|
custom_data_6 TEXT,
|
||||||
|
custom_data_7 TEXT,
|
||||||
|
custom_data_8 TEXT,
|
||||||
|
custom_data_9 TEXT,
|
||||||
|
custom_data_10 TEXT,
|
||||||
|
custom_data_11 TEXT,
|
||||||
|
custom_data_12 TEXT,
|
||||||
|
custom_data_13 TEXT,
|
||||||
|
custom_data_14 TEXT,
|
||||||
|
custom_data_15 TEXT,
|
||||||
|
custom_data_16 TEXT,
|
||||||
|
custom_data_17 TEXT,
|
||||||
|
custom_data_18 TEXT,
|
||||||
|
custom_data_19 TEXT,
|
||||||
|
custom_data_20 TEXT
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
CREATE TABLE IF NOT EXISTS TtRssAccounts (
|
CREATE TABLE Categories (
|
||||||
id INTEGER,
|
|
||||||
username TEXT NOT NULL,
|
|
||||||
password TEXT,
|
|
||||||
auth_protected INTEGER(1) NOT NULL CHECK (auth_protected >= 0 AND auth_protected <= 1) DEFAULT 0,
|
|
||||||
auth_username TEXT,
|
|
||||||
auth_password TEXT,
|
|
||||||
url TEXT NOT NULL,
|
|
||||||
force_update INTEGER(1) NOT NULL CHECK (force_update >= 0 AND force_update <= 1) DEFAULT 0,
|
|
||||||
update_only_unread INTEGER(1) NOT NULL CHECK (update_only_unread >= 0 AND update_only_unread <= 1) DEFAULT 0,
|
|
||||||
|
|
||||||
FOREIGN KEY (id) REFERENCES Accounts (id)
|
|
||||||
);
|
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS OwnCloudAccounts (
|
|
||||||
id INTEGER,
|
|
||||||
username TEXT NOT NULL,
|
|
||||||
password TEXT,
|
|
||||||
url TEXT NOT NULL,
|
|
||||||
force_update INTEGER(1) NOT NULL CHECK (force_update >= 0 AND force_update <= 1) DEFAULT 0,
|
|
||||||
msg_limit INTEGER NOT NULL DEFAULT -1 CHECK (msg_limit >= -1),
|
|
||||||
update_only_unread INTEGER(1) NOT NULL CHECK (update_only_unread >= 0 AND update_only_unread <= 1) DEFAULT 0,
|
|
||||||
|
|
||||||
FOREIGN KEY (id) REFERENCES Accounts (id)
|
|
||||||
);
|
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS InoreaderAccounts (
|
|
||||||
id INTEGER,
|
|
||||||
username TEXT NOT NULL,
|
|
||||||
app_id TEXT,
|
|
||||||
app_key TEXT,
|
|
||||||
redirect_url TEXT,
|
|
||||||
refresh_token TEXT,
|
|
||||||
msg_limit INTEGER NOT NULL DEFAULT -1 CHECK (msg_limit >= -1),
|
|
||||||
|
|
||||||
FOREIGN KEY (id) REFERENCES Accounts (id)
|
|
||||||
);
|
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS GmailAccounts (
|
|
||||||
id INTEGER,
|
|
||||||
username TEXT NOT NULL,
|
|
||||||
app_id TEXT,
|
|
||||||
app_key TEXT,
|
|
||||||
redirect_url TEXT,
|
|
||||||
refresh_token TEXT,
|
|
||||||
msg_limit INTEGER NOT NULL DEFAULT -1 CHECK (msg_limit >= -1),
|
|
||||||
|
|
||||||
FOREIGN KEY (id) REFERENCES Accounts (id)
|
|
||||||
);
|
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS GoogleReaderApiAccounts (
|
|
||||||
id INTEGER,
|
|
||||||
type INTEGER NOT NULL CHECK (type >= 1),
|
|
||||||
username TEXT NOT NULL,
|
|
||||||
password TEXT,
|
|
||||||
url TEXT NOT NULL,
|
|
||||||
msg_limit INTEGER NOT NULL DEFAULT -1 CHECK (msg_limit >= -1),
|
|
||||||
|
|
||||||
FOREIGN KEY (id) REFERENCES Accounts (id)
|
|
||||||
);
|
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS FeedlyAccounts (
|
|
||||||
id INTEGER,
|
|
||||||
username TEXT NOT NULL,
|
|
||||||
developer_access_token TEXT,
|
|
||||||
refresh_token TEXT,
|
|
||||||
msg_limit INTEGER NOT NULL DEFAULT -1 CHECK (msg_limit >= -1),
|
|
||||||
update_only_unread INTEGER(1) NOT NULL DEFAULT 0 CHECK (update_only_unread >= 0 AND update_only_unread <= 1),
|
|
||||||
|
|
||||||
FOREIGN KEY (id) REFERENCES Accounts (id)
|
|
||||||
);
|
|
||||||
-- !
|
|
||||||
DROP TABLE IF EXISTS Categories;
|
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS Categories (
|
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
parent_id INTEGER NOT NULL,
|
parent_id INTEGER NOT NULL CHECK (parent_id >= -1), /* Root categories contain -1 here. */
|
||||||
title TEXT NOT NULL CHECK (title != ''),
|
title TEXT NOT NULL CHECK (title != ''),
|
||||||
description TEXT,
|
description TEXT,
|
||||||
date_created INTEGER,
|
date_created INTEGER,
|
||||||
|
@ -105,15 +49,13 @@ CREATE TABLE IF NOT EXISTS Categories (
|
||||||
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
DROP TABLE IF EXISTS Feeds;
|
CREATE TABLE Feeds (
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS Feeds (
|
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
title TEXT NOT NULL CHECK (title != ''),
|
title TEXT NOT NULL CHECK (title != ''),
|
||||||
description TEXT,
|
description TEXT,
|
||||||
date_created INTEGER,
|
date_created INTEGER,
|
||||||
icon BLOB,
|
icon BLOB,
|
||||||
category INTEGER NOT NULL CHECK (category >= -1),
|
category INTEGER NOT NULL CHECK (category >= -1), /* Root feeds contain -1 here. */
|
||||||
encoding TEXT,
|
encoding TEXT,
|
||||||
source_type INTEGER,
|
source_type INTEGER,
|
||||||
url TEXT,
|
url TEXT,
|
||||||
|
@ -122,7 +64,7 @@ CREATE TABLE IF NOT EXISTS Feeds (
|
||||||
username TEXT,
|
username TEXT,
|
||||||
password TEXT,
|
password TEXT,
|
||||||
update_type INTEGER(1) NOT NULL CHECK (update_type >= 0),
|
update_type INTEGER(1) NOT NULL CHECK (update_type >= 0),
|
||||||
update_interval INTEGER NOT NULL CHECK (update_interval >= 1) DEFAULT 15,
|
update_interval INTEGER NOT NULL DEFAULT 15 CHECK (update_interval >= 1),
|
||||||
type INTEGER,
|
type INTEGER,
|
||||||
account_id INTEGER NOT NULL,
|
account_id INTEGER NOT NULL,
|
||||||
custom_id TEXT,
|
custom_id TEXT,
|
||||||
|
@ -130,20 +72,18 @@ CREATE TABLE IF NOT EXISTS Feeds (
|
||||||
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
DROP TABLE IF EXISTS Messages;
|
CREATE TABLE Messages (
|
||||||
-- !
|
|
||||||
CREATE TABLE IF NOT EXISTS Messages (
|
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
is_read INTEGER(1) NOT NULL CHECK (is_read >= 0 AND is_read <= 1) DEFAULT 0,
|
is_read INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_read >= 0 AND is_read <= 1),
|
||||||
is_deleted INTEGER(1) NOT NULL CHECK (is_deleted >= 0 AND is_deleted <= 1) DEFAULT 0,
|
is_deleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_deleted >= 0 AND is_deleted <= 1),
|
||||||
is_important INTEGER(1) NOT NULL CHECK (is_important >= 0 AND is_important <= 1) DEFAULT 0,
|
is_important INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_important >= 0 AND is_important <= 1),
|
||||||
feed TEXT NOT NULL,
|
feed TEXT NOT NULL,
|
||||||
title TEXT NOT NULL CHECK (title != ''),
|
title TEXT NOT NULL CHECK (title != ''),
|
||||||
url TEXT,
|
url TEXT,
|
||||||
author TEXT,
|
author TEXT,
|
||||||
date_created INTEGER NOT NULL CHECK (date_created != 0),
|
date_created INTEGER NOT NULL CHECK (date_created != 0),
|
||||||
contents TEXT,
|
contents TEXT,
|
||||||
is_pdeleted INTEGER(1) NOT NULL CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1) DEFAULT 0,
|
is_pdeleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1),
|
||||||
enclosures TEXT,
|
enclosures TEXT,
|
||||||
account_id INTEGER NOT NULL,
|
account_id INTEGER NOT NULL,
|
||||||
custom_id TEXT,
|
custom_id TEXT,
|
||||||
|
@ -152,13 +92,13 @@ CREATE TABLE IF NOT EXISTS Messages (
|
||||||
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
CREATE TABLE IF NOT EXISTS MessageFilters (
|
CREATE TABLE MessageFilters (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
name TEXT NOT NULL CHECK (name != ''),
|
name TEXT NOT NULL CHECK (name != ''),
|
||||||
script TEXT NOT NULL CHECK (script != '')
|
script TEXT NOT NULL CHECK (script != '')
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
CREATE TABLE IF NOT EXISTS MessageFiltersInFeeds (
|
CREATE TABLE MessageFiltersInFeeds (
|
||||||
filter INTEGER NOT NULL,
|
filter INTEGER NOT NULL,
|
||||||
feed_custom_id TEXT NOT NULL,
|
feed_custom_id TEXT NOT NULL,
|
||||||
account_id INTEGER NOT NULL,
|
account_id INTEGER NOT NULL,
|
||||||
|
@ -167,7 +107,7 @@ CREATE TABLE IF NOT EXISTS MessageFiltersInFeeds (
|
||||||
FOREIGN KEY (account_id) REFERENCES Accounts (id) ON DELETE CASCADE
|
FOREIGN KEY (account_id) REFERENCES Accounts (id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
CREATE TABLE IF NOT EXISTS Labels (
|
CREATE TABLE Labels (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
name TEXT NOT NULL CHECK (name != ''),
|
name TEXT NOT NULL CHECK (name != ''),
|
||||||
color VARCHAR(7),
|
color VARCHAR(7),
|
||||||
|
@ -177,7 +117,7 @@ CREATE TABLE IF NOT EXISTS Labels (
|
||||||
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
FOREIGN KEY (account_id) REFERENCES Accounts (id)
|
||||||
);
|
);
|
||||||
-- !
|
-- !
|
||||||
CREATE TABLE IF NOT EXISTS LabelsInMessages (
|
CREATE TABLE LabelsInMessages (
|
||||||
label TEXT NOT NULL, /* Custom ID of label. */
|
label TEXT NOT NULL, /* Custom ID of label. */
|
||||||
message TEXT NOT NULL, /* Custom ID of message. */
|
message TEXT NOT NULL, /* Custom ID of message. */
|
||||||
account_id INTEGER NOT NULL,
|
account_id INTEGER NOT NULL,
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#include "exceptions/applicationexception.h"
|
#include "exceptions/applicationexception.h"
|
||||||
#include "miscellaneous/application.h"
|
#include "miscellaneous/application.h"
|
||||||
#include "miscellaneous/iconfactory.h"
|
#include "miscellaneous/iconfactory.h"
|
||||||
#include "miscellaneous/textfactory.h"
|
|
||||||
#include "network-web/oauth2service.h"
|
#include "network-web/oauth2service.h"
|
||||||
#include "services/abstract/category.h"
|
#include "services/abstract/category.h"
|
||||||
#include "services/feedly/definitions.h"
|
#include "services/feedly/definitions.h"
|
||||||
|
@ -1682,130 +1681,6 @@ void DatabaseQueries::fillBaseAccountData(const QSqlDatabase& db, ServiceRoot* a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ServiceRoot*> DatabaseQueries::getGreaderAccounts(const QSqlDatabase& db, bool* ok) {
|
|
||||||
QSqlQuery query(db);
|
|
||||||
QList<ServiceRoot*> roots;
|
|
||||||
|
|
||||||
if (query.exec("SELECT * FROM GoogleReaderApiAccounts;")) {
|
|
||||||
while (query.next()) {
|
|
||||||
auto* root = new GreaderServiceRoot();
|
|
||||||
|
|
||||||
root->setId(query.value(0).toInt());
|
|
||||||
root->setAccountId(query.value(0).toInt());
|
|
||||||
root->network()->setService(GreaderServiceRoot::Service(query.value(1).toInt()));
|
|
||||||
root->network()->setUsername(query.value(2).toString());
|
|
||||||
root->network()->setPassword(TextFactory::decrypt(query.value(3).toString()));
|
|
||||||
root->network()->setBaseUrl(query.value(4).toString());
|
|
||||||
root->network()->setBatchSize(query.value(5).toInt());
|
|
||||||
root->updateTitleIcon();
|
|
||||||
|
|
||||||
fillBaseAccountData(db, root);
|
|
||||||
|
|
||||||
roots.append(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarningNN << LOGSEC_GREADER
|
|
||||||
<< "Getting list of activated accounts failed: '"
|
|
||||||
<< query.lastError().text()
|
|
||||||
<< "'.";
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return roots;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<ServiceRoot*> DatabaseQueries::getOwnCloudAccounts(const QSqlDatabase& db, bool* ok) {
|
|
||||||
QSqlQuery query(db);
|
|
||||||
QList<ServiceRoot*> roots;
|
|
||||||
|
|
||||||
if (query.exec("SELECT * FROM OwnCloudAccounts;")) {
|
|
||||||
while (query.next()) {
|
|
||||||
auto* root = new OwnCloudServiceRoot();
|
|
||||||
|
|
||||||
root->setId(query.value(0).toInt());
|
|
||||||
root->setAccountId(query.value(0).toInt());
|
|
||||||
root->network()->setAuthUsername(query.value(1).toString());
|
|
||||||
root->network()->setAuthPassword(TextFactory::decrypt(query.value(2).toString()));
|
|
||||||
root->network()->setUrl(query.value(3).toString());
|
|
||||||
root->network()->setForceServerSideUpdate(query.value(4).toBool());
|
|
||||||
root->network()->setBatchSize(query.value(5).toInt());
|
|
||||||
root->network()->setDownloadOnlyUnreadMessages(query.value(6).toBool());
|
|
||||||
root->updateTitle();
|
|
||||||
|
|
||||||
fillBaseAccountData(db, root);
|
|
||||||
|
|
||||||
roots.append(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarningNN << LOGSEC_NEXTCLOUD
|
|
||||||
<< "Getting list of activated accounts failed: '"
|
|
||||||
<< query.lastError().text()
|
|
||||||
<< "'.";
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return roots;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<ServiceRoot*> DatabaseQueries::getTtRssAccounts(const QSqlDatabase& db, bool* ok) {
|
|
||||||
QSqlQuery query(db);
|
|
||||||
QList<ServiceRoot*> roots;
|
|
||||||
|
|
||||||
if (query.exec("SELECT * FROM TtRssAccounts;")) {
|
|
||||||
while (query.next()) {
|
|
||||||
auto* root = new TtRssServiceRoot();
|
|
||||||
|
|
||||||
root->setId(query.value(0).toInt());
|
|
||||||
root->setAccountId(query.value(0).toInt());
|
|
||||||
root->network()->setUsername(query.value(1).toString());
|
|
||||||
root->network()->setPassword(TextFactory::decrypt(query.value(2).toString()));
|
|
||||||
root->network()->setAuthIsUsed(query.value(3).toBool());
|
|
||||||
root->network()->setAuthUsername(query.value(4).toString());
|
|
||||||
root->network()->setAuthPassword(TextFactory::decrypt(query.value(5).toString()));
|
|
||||||
root->network()->setUrl(query.value(6).toString());
|
|
||||||
root->network()->setForceServerSideUpdate(query.value(7).toBool());
|
|
||||||
root->network()->setDownloadOnlyUnreadMessages(query.value(8).toBool());
|
|
||||||
root->updateTitle();
|
|
||||||
|
|
||||||
fillBaseAccountData(db, root);
|
|
||||||
|
|
||||||
roots.append(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarningNN << LOGSEC_TTRSS
|
|
||||||
<< "Getting list of activated accounts failed: '"
|
|
||||||
<< query.lastError().text()
|
|
||||||
<< "'.";
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return roots;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseQueries::deleteOwnCloudAccount(const QSqlDatabase& db, int account_id) {
|
bool DatabaseQueries::deleteOwnCloudAccount(const QSqlDatabase& db, int account_id) {
|
||||||
QSqlQuery q(db);
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
@ -1978,6 +1853,63 @@ bool DatabaseQueries::createOwnCloudAccount(const QSqlDatabase& db, int id_to_as
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DatabaseQueries::createOverwriteAccount(const QSqlDatabase& db, ServiceRoot* account) {
|
||||||
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
if (account->accountId() <= 0) {
|
||||||
|
// We need to insert account first.
|
||||||
|
q.prepare(QSL("INSERT INTO Accounts (type) VALUES (:type);"));
|
||||||
|
q.bindValue(QSL(":type"), account->code());
|
||||||
|
|
||||||
|
if (!q.exec()) {
|
||||||
|
throw ApplicationException(q.lastError().text());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
account->setId(q.lastInsertId().toInt());
|
||||||
|
account->setAccountId(account->id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we construct the SQL update query.
|
||||||
|
auto proxy = account->networkProxy();
|
||||||
|
QString sql_statement = QSL("UPDATE Accounts "
|
||||||
|
"SET proxy_type = :proxy_type, proxy_host = :proxy_host, proxy_port = :proxy_port, "
|
||||||
|
" proxy_username = :proxy_username, proxy_password = :proxy_password%1 "
|
||||||
|
"WHERE id = :id");
|
||||||
|
auto custom_attributes = account->customDatabaseAttributes();
|
||||||
|
QStringList custom_sql_clauses;
|
||||||
|
|
||||||
|
for (int i = 0; i < custom_attributes.size(); i++) {
|
||||||
|
QString target_data = account->property(custom_attributes.at(i).m_name.toLocal8Bit()).toString();
|
||||||
|
|
||||||
|
if (custom_attributes.at(i).m_encrypted) {
|
||||||
|
target_data = TextFactory::encrypt(target_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
custom_sql_clauses.append(QSL("custom_data_%1 = '%2'").arg(QString::number(i + 1),
|
||||||
|
target_data));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!custom_sql_clauses.isEmpty()) {
|
||||||
|
sql_statement = sql_statement.arg(QSL(", ") + custom_sql_clauses.join(QSL(", ")));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sql_statement = sql_statement.arg(QString());
|
||||||
|
}
|
||||||
|
|
||||||
|
q.prepare(sql_statement);
|
||||||
|
q.bindValue(QSL(":proxy_type"), proxy.type());
|
||||||
|
q.bindValue(QSL(":proxy_host"), proxy.hostName());
|
||||||
|
q.bindValue(QSL(":proxy_port"), proxy.port());
|
||||||
|
q.bindValue(QSL(":proxy_username"), proxy.user());
|
||||||
|
q.bindValue(QSL(":proxy_password"), TextFactory::encrypt(proxy.password()));
|
||||||
|
q.bindValue(QSL(":id"), account->accountId());
|
||||||
|
|
||||||
|
if (!q.exec()) {
|
||||||
|
throw ApplicationException(q.lastError().text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int DatabaseQueries::createBaseAccount(const QSqlDatabase& db, const QString& code, bool* ok) {
|
int DatabaseQueries::createBaseAccount(const QSqlDatabase& db, const QString& code, bool* ok) {
|
||||||
QSqlQuery q(db);
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
@ -2478,38 +2410,6 @@ void DatabaseQueries::removeMessageFilterFromFeed(const QSqlDatabase& db, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ServiceRoot*> DatabaseQueries::getStandardAccounts(const QSqlDatabase& db, bool* ok) {
|
|
||||||
QSqlQuery q(db);
|
|
||||||
QList<ServiceRoot*> roots;
|
|
||||||
|
|
||||||
q.setForwardOnly(true);
|
|
||||||
q.prepare(QSL("SELECT id FROM Accounts WHERE type = :type;"));
|
|
||||||
q.bindValue(QSL(":type"), SERVICE_CODE_STD_RSS);
|
|
||||||
|
|
||||||
if (q.exec()) {
|
|
||||||
while (q.next()) {
|
|
||||||
auto* root = new StandardServiceRoot();
|
|
||||||
|
|
||||||
root->setAccountId(q.value(0).toInt());
|
|
||||||
|
|
||||||
fillBaseAccountData(db, root);
|
|
||||||
|
|
||||||
roots.append(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return roots;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseQueries::deleteFeedlyAccount(const QSqlDatabase& db, int account_id) {
|
bool DatabaseQueries::deleteFeedlyAccount(const QSqlDatabase& db, int account_id) {
|
||||||
QSqlQuery q(db);
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
@ -2624,91 +2524,6 @@ QStringList DatabaseQueries::getAllRecipients(const QSqlDatabase& db, int accoun
|
||||||
return rec;
|
return rec;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ServiceRoot*> DatabaseQueries::getFeedlyAccounts(const QSqlDatabase& db, bool* ok) {
|
|
||||||
QSqlQuery query(db);
|
|
||||||
QList<ServiceRoot*> roots;
|
|
||||||
|
|
||||||
if (query.exec("SELECT * FROM FeedlyAccounts;")) {
|
|
||||||
while (query.next()) {
|
|
||||||
auto* root = new FeedlyServiceRoot();
|
|
||||||
|
|
||||||
root->setId(query.value(0).toInt());
|
|
||||||
root->setAccountId(query.value(0).toInt());
|
|
||||||
root->network()->setUsername(query.value(1).toString());
|
|
||||||
root->network()->setDeveloperAccessToken(query.value(2).toString());
|
|
||||||
|
|
||||||
#if defined(FEEDLY_OFFICIAL_SUPPORT)
|
|
||||||
root->network()->oauth()->setRefreshToken(query.value(3).toString());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
root->network()->setBatchSize(query.value(4).toInt());
|
|
||||||
root->network()->setDownloadOnlyUnreadMessages(query.value(5).toBool());
|
|
||||||
root->updateTitle();
|
|
||||||
|
|
||||||
fillBaseAccountData(db, root);
|
|
||||||
|
|
||||||
roots.append(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarningNN << LOGSEC_GMAIL
|
|
||||||
<< "Getting list of activated accounts failed: '"
|
|
||||||
<< query.lastError().text()
|
|
||||||
<< "'.";
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return roots;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<ServiceRoot*> DatabaseQueries::getGmailAccounts(const QSqlDatabase& db, bool* ok) {
|
|
||||||
QSqlQuery query(db);
|
|
||||||
QList<ServiceRoot*> roots;
|
|
||||||
|
|
||||||
if (query.exec("SELECT * FROM GmailAccounts;")) {
|
|
||||||
while (query.next()) {
|
|
||||||
auto* root = new GmailServiceRoot();
|
|
||||||
|
|
||||||
root->setId(query.value(0).toInt());
|
|
||||||
root->setAccountId(query.value(0).toInt());
|
|
||||||
root->network()->setUsername(query.value(1).toString());
|
|
||||||
root->network()->oauth()->setClientId(query.value(2).toString());
|
|
||||||
root->network()->oauth()->setClientSecret(query.value(3).toString());
|
|
||||||
root->network()->oauth()->setRefreshToken(query.value(5).toString());
|
|
||||||
root->network()->oauth()->setRedirectUrl(query.value(4).toString());
|
|
||||||
root->network()->setBatchSize(query.value(6).toInt());
|
|
||||||
root->updateTitle();
|
|
||||||
|
|
||||||
fillBaseAccountData(db, root);
|
|
||||||
|
|
||||||
roots.append(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarningNN << LOGSEC_GMAIL
|
|
||||||
<< "Getting list of activated accounts failed: '"
|
|
||||||
<< query.lastError().text()
|
|
||||||
<< "'.";
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return roots;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseQueries::deleteGmailAccount(const QSqlDatabase& db, int account_id) {
|
bool DatabaseQueries::deleteGmailAccount(const QSqlDatabase& db, int account_id) {
|
||||||
QSqlQuery q(db);
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
@ -2747,47 +2562,6 @@ bool DatabaseQueries::storeNewOauthTokens(const QSqlDatabase& db, const QString&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ServiceRoot*> DatabaseQueries::getInoreaderAccounts(const QSqlDatabase& db, bool* ok) {
|
|
||||||
QSqlQuery query(db);
|
|
||||||
QList<ServiceRoot*> roots;
|
|
||||||
|
|
||||||
if (query.exec("SELECT * FROM InoreaderAccounts;")) {
|
|
||||||
while (query.next()) {
|
|
||||||
auto* root = new InoreaderServiceRoot();
|
|
||||||
|
|
||||||
root->setId(query.value(0).toInt());
|
|
||||||
root->setAccountId(query.value(0).toInt());
|
|
||||||
root->network()->setUsername(query.value(1).toString());
|
|
||||||
root->network()->oauth()->setClientId(query.value(2).toString());
|
|
||||||
root->network()->oauth()->setClientSecret(query.value(3).toString());
|
|
||||||
root->network()->oauth()->setRefreshToken(query.value(5).toString());
|
|
||||||
root->network()->oauth()->setRedirectUrl(query.value(4).toString());
|
|
||||||
root->network()->setBatchSize(query.value(6).toInt());
|
|
||||||
root->updateTitle();
|
|
||||||
|
|
||||||
fillBaseAccountData(db, root);
|
|
||||||
|
|
||||||
roots.append(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarningNN << LOGSEC_INOREADER
|
|
||||||
<< "Getting list of activated accounts failed: '"
|
|
||||||
<< query.lastError().text()
|
|
||||||
<< "'.";
|
|
||||||
|
|
||||||
if (ok != nullptr) {
|
|
||||||
*ok = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return roots;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseQueries::overwriteGmailAccount(const QSqlDatabase& db, const QString& username, const QString& app_id,
|
bool DatabaseQueries::overwriteGmailAccount(const QSqlDatabase& db, const QString& username, const QString& app_id,
|
||||||
const QString& app_key, const QString& redirect_url,
|
const QString& app_key, const QString& redirect_url,
|
||||||
const QString& refresh_token, int batch_size, int account_id) {
|
const QString& refresh_token, int batch_size, int account_id) {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "services/abstract/rootitem.h"
|
#include "services/abstract/rootitem.h"
|
||||||
|
|
||||||
#include "core/messagefilter.h"
|
#include "core/messagefilter.h"
|
||||||
|
#include "miscellaneous/textfactory.h"
|
||||||
#include "services/abstract/category.h"
|
#include "services/abstract/category.h"
|
||||||
#include "services/abstract/label.h"
|
#include "services/abstract/label.h"
|
||||||
#include "services/abstract/serviceroot.h"
|
#include "services/abstract/serviceroot.h"
|
||||||
|
@ -89,9 +90,12 @@ class DatabaseQueries {
|
||||||
bool* ok = nullptr);
|
bool* ok = nullptr);
|
||||||
|
|
||||||
// Common account methods.
|
// Common account methods.
|
||||||
|
template<typename T>
|
||||||
|
static QList<ServiceRoot*> getAccounts(const QSqlDatabase& db, const QString& code, bool* ok = nullptr);
|
||||||
static bool storeNewOauthTokens(const QSqlDatabase& db, const QString& table_name,
|
static bool storeNewOauthTokens(const QSqlDatabase& db, const QString& table_name,
|
||||||
const QString& refresh_token, int account_id);
|
const QString& refresh_token, int account_id);
|
||||||
static void fillBaseAccountData(const QSqlDatabase& db, ServiceRoot* account, bool* ok = nullptr);
|
static void fillBaseAccountData(const QSqlDatabase& db, ServiceRoot* account, bool* ok = nullptr);
|
||||||
|
static void createOverwriteAccount(const QSqlDatabase& db, ServiceRoot* account);
|
||||||
static int createBaseAccount(const QSqlDatabase& db, const QString& code, bool* ok = nullptr);
|
static int createBaseAccount(const QSqlDatabase& db, const QString& code, bool* ok = nullptr);
|
||||||
static void editBaseAccount(const QSqlDatabase& db, ServiceRoot* account, bool* ok = nullptr);
|
static void editBaseAccount(const QSqlDatabase& db, ServiceRoot* account, bool* ok = nullptr);
|
||||||
static int updateMessages(QSqlDatabase db, const QList<Message>& messages, const QString& feed_custom_id,
|
static int updateMessages(QSqlDatabase db, const QList<Message>& messages, const QString& feed_custom_id,
|
||||||
|
@ -147,14 +151,12 @@ class DatabaseQueries {
|
||||||
const QString& username, const QString& password, Feed::AutoUpdateType auto_update_type,
|
const QString& username, const QString& password, Feed::AutoUpdateType auto_update_type,
|
||||||
int auto_update_interval, StandardFeed::SourceType source_type,
|
int auto_update_interval, StandardFeed::SourceType source_type,
|
||||||
const QString& post_process_script, StandardFeed::Type feed_format);
|
const QString& post_process_script, StandardFeed::Type feed_format);
|
||||||
static QList<ServiceRoot*> getStandardAccounts(const QSqlDatabase& db, bool* ok = nullptr);
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static void fillFeedData(T* feed, const QSqlRecord& sql_record);
|
static void fillFeedData(T* feed, const QSqlRecord& sql_record);
|
||||||
|
|
||||||
// Feedly account.
|
// Feedly account.
|
||||||
static bool deleteFeedlyAccount(const QSqlDatabase& db, int account_id);
|
static bool deleteFeedlyAccount(const QSqlDatabase& db, int account_id);
|
||||||
static QList<ServiceRoot*> getFeedlyAccounts(const QSqlDatabase& db, bool* ok = nullptr);
|
|
||||||
static bool createFeedlyAccount(const QSqlDatabase& db,
|
static bool createFeedlyAccount(const QSqlDatabase& db,
|
||||||
const QString& username,
|
const QString& username,
|
||||||
const QString& developer_access_token,
|
const QString& developer_access_token,
|
||||||
|
@ -172,7 +174,6 @@ class DatabaseQueries {
|
||||||
|
|
||||||
// Greader account.
|
// Greader account.
|
||||||
static bool deleteGreaderAccount(const QSqlDatabase& db, int account_id);
|
static bool deleteGreaderAccount(const QSqlDatabase& db, int account_id);
|
||||||
static QList<ServiceRoot*> getGreaderAccounts(const QSqlDatabase& db, bool* ok = nullptr);
|
|
||||||
static bool createGreaderAccount(const QSqlDatabase& db, int id_to_assign, const QString& username,
|
static bool createGreaderAccount(const QSqlDatabase& db, int id_to_assign, const QString& username,
|
||||||
const QString& password, GreaderServiceRoot::Service service,
|
const QString& password, GreaderServiceRoot::Service service,
|
||||||
const QString& url, int batch_size);
|
const QString& url, int batch_size);
|
||||||
|
@ -181,7 +182,6 @@ class DatabaseQueries {
|
||||||
int account_id);
|
int account_id);
|
||||||
|
|
||||||
// Nextcloud account.
|
// Nextcloud account.
|
||||||
static QList<ServiceRoot*> getOwnCloudAccounts(const QSqlDatabase& db, bool* ok = nullptr);
|
|
||||||
static bool deleteOwnCloudAccount(const QSqlDatabase& db, int account_id);
|
static bool deleteOwnCloudAccount(const QSqlDatabase& db, int account_id);
|
||||||
static bool overwriteOwnCloudAccount(const QSqlDatabase& db, const QString& username, const QString& password,
|
static bool overwriteOwnCloudAccount(const QSqlDatabase& db, const QString& username, const QString& password,
|
||||||
const QString& url, bool force_server_side_feed_update, int batch_size,
|
const QString& url, bool force_server_side_feed_update, int batch_size,
|
||||||
|
@ -191,7 +191,6 @@ class DatabaseQueries {
|
||||||
bool download_only_unread_messages, int batch_size);
|
bool download_only_unread_messages, int batch_size);
|
||||||
|
|
||||||
// TT-RSS acccount.
|
// TT-RSS acccount.
|
||||||
static QList<ServiceRoot*> getTtRssAccounts(const QSqlDatabase& db, bool* ok = nullptr);
|
|
||||||
static bool deleteTtRssAccount(const QSqlDatabase& db, int account_id);
|
static bool deleteTtRssAccount(const QSqlDatabase& db, int account_id);
|
||||||
static bool overwriteTtRssAccount(const QSqlDatabase& db, const QString& username, const QString& password,
|
static bool overwriteTtRssAccount(const QSqlDatabase& db, const QString& username, const QString& password,
|
||||||
bool auth_protected, const QString& auth_username, const QString& auth_password,
|
bool auth_protected, const QString& auth_username, const QString& auth_password,
|
||||||
|
@ -205,7 +204,6 @@ class DatabaseQueries {
|
||||||
// Gmail account.
|
// Gmail account.
|
||||||
static QStringList getAllRecipients(const QSqlDatabase& db, int account_id);
|
static QStringList getAllRecipients(const QSqlDatabase& db, int account_id);
|
||||||
static bool deleteGmailAccount(const QSqlDatabase& db, int account_id);
|
static bool deleteGmailAccount(const QSqlDatabase& db, int account_id);
|
||||||
static QList<ServiceRoot*> getGmailAccounts(const QSqlDatabase& db, bool* ok = nullptr);
|
|
||||||
static bool overwriteGmailAccount(const QSqlDatabase& db, const QString& username, const QString& app_id,
|
static bool overwriteGmailAccount(const QSqlDatabase& db, const QString& username, const QString& app_id,
|
||||||
const QString& app_key, const QString& redirect_url, const QString& refresh_token,
|
const QString& app_key, const QString& redirect_url, const QString& refresh_token,
|
||||||
int batch_size, int account_id);
|
int batch_size, int account_id);
|
||||||
|
@ -215,7 +213,6 @@ class DatabaseQueries {
|
||||||
|
|
||||||
// Inoreader account.
|
// Inoreader account.
|
||||||
static bool deleteInoreaderAccount(const QSqlDatabase& db, int account_id);
|
static bool deleteInoreaderAccount(const QSqlDatabase& db, int account_id);
|
||||||
static QList<ServiceRoot*> getInoreaderAccounts(const QSqlDatabase& db, bool* ok = nullptr);
|
|
||||||
static bool overwriteInoreaderAccount(const QSqlDatabase& db, const QString& username, const QString& app_id,
|
static bool overwriteInoreaderAccount(const QSqlDatabase& db, const QString& username, const QString& app_id,
|
||||||
const QString& app_key, const QString& redirect_url, const QString& refresh_token,
|
const QString& app_key, const QString& redirect_url, const QString& refresh_token,
|
||||||
int batch_size, int account_id);
|
int batch_size, int account_id);
|
||||||
|
@ -241,6 +238,63 @@ inline void DatabaseQueries::fillFeedData(StandardFeed* feed, const QSqlRecord&
|
||||||
Q_UNUSED(sql_record)
|
Q_UNUSED(sql_record)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
QList<ServiceRoot*> DatabaseQueries::getAccounts(const QSqlDatabase& db, const QString& code, bool* ok) {
|
||||||
|
QSqlQuery query(db);
|
||||||
|
QList<ServiceRoot*> roots;
|
||||||
|
|
||||||
|
if (query.exec(QSL("SELECT * FROM Accounts WHERE type = '%1';").arg(code))) {
|
||||||
|
while (query.next()) {
|
||||||
|
ServiceRoot* root = new T();
|
||||||
|
|
||||||
|
// Load common data.
|
||||||
|
root->setId(query.value(QSL("id")).toInt());
|
||||||
|
root->setAccountId(root->id());
|
||||||
|
|
||||||
|
QNetworkProxy proxy(QNetworkProxy::ProxyType(query.value(QSL("proxy_type")).toInt()),
|
||||||
|
query.value(QSL("proxy_host")).toString(),
|
||||||
|
query.value(QSL("proxy_port")).toInt(),
|
||||||
|
query.value(QSL("proxy_username")).toString(),
|
||||||
|
TextFactory::decrypt(query.value(QSL("proxy_password")).toString()));
|
||||||
|
|
||||||
|
root->setNetworkProxy(proxy);
|
||||||
|
|
||||||
|
// Load account-specific custom data.
|
||||||
|
auto custom_attributes = root->customDatabaseAttributes();
|
||||||
|
|
||||||
|
for (int i = 0; i < custom_attributes.size(); i++) {
|
||||||
|
const QString target_db_attribute = QSL("custom_data_%1").arg(QString::number(i + 1));
|
||||||
|
QString target_data = query.value(target_db_attribute).toString();
|
||||||
|
|
||||||
|
if (custom_attributes.at(i).m_encrypted) {
|
||||||
|
target_data = TextFactory::decrypt(target_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
root->setProperty(custom_attributes.at(i).m_name.toLocal8Bit(), target_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
roots.append(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ok != nullptr) {
|
||||||
|
*ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qWarningNN << LOGSEC_DB
|
||||||
|
<< "Loading of accounts with code"
|
||||||
|
<< QUOTE_W_SPACE(code)
|
||||||
|
<< "failed with error:"
|
||||||
|
<< QUOTE_W_SPACE_DOT(query.lastError().text());
|
||||||
|
|
||||||
|
if (ok != nullptr) {
|
||||||
|
*ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return roots;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Assignment DatabaseQueries::getCategories(const QSqlDatabase& db, int account_id, bool* ok) {
|
Assignment DatabaseQueries::getCategories(const QSqlDatabase& db, int account_id, bool* ok) {
|
||||||
Assignment categories;
|
Assignment categories;
|
||||||
|
|
|
@ -21,14 +21,16 @@ FormAccountDetails::FormAccountDetails(const QIcon& icon, QWidget* parent)
|
||||||
void FormAccountDetails::apply() {
|
void FormAccountDetails::apply() {
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("FormAccountDetails"));
|
QSqlDatabase database = qApp->database()->connection(QSL("FormAccountDetails"));
|
||||||
|
|
||||||
if (m_creatingNew) {
|
/*
|
||||||
m_account->setAccountId(DatabaseQueries::createBaseAccount(database, m_account->code()));
|
if (m_creatingNew) {
|
||||||
}
|
m_account->setAccountId(DatabaseQueries::createBaseAccount(database, m_account->code()));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
m_account->setNetworkProxy(m_proxyDetails->proxy());
|
m_account->setNetworkProxy(m_proxyDetails->proxy());
|
||||||
|
|
||||||
// NOTE: We edit account common attributes here directly.
|
// NOTE: We edit account common attributes here directly.
|
||||||
DatabaseQueries::editBaseAccount(database, m_account);
|
//DatabaseQueries::editBaseAccount(database, m_account);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormAccountDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) {
|
void FormAccountDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) {
|
||||||
|
|
|
@ -256,6 +256,10 @@ ServiceRoot::LabelOperation ServiceRoot::supportedLabelOperations() const {
|
||||||
return LabelOperation::Adding | LabelOperation::Editing | LabelOperation::Deleting;
|
return LabelOperation::Adding | LabelOperation::Editing | LabelOperation::Deleting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<CustomDatabaseEntry> ServiceRoot::customDatabaseAttributes() const {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
void ServiceRoot::itemChanged(const QList<RootItem*>& items) {
|
void ServiceRoot::itemChanged(const QList<RootItem*>& items) {
|
||||||
emit dataChanged(items);
|
emit dataChanged(items);
|
||||||
}
|
}
|
||||||
|
@ -393,7 +397,9 @@ void ServiceRoot::syncIn() {
|
||||||
requestItemExpand({ this }, true);
|
requestItemExpand({ this }, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServiceRoot::performInitialAssembly(const Assignment& categories, const Assignment& feeds, const QList<Label*>& labels) {
|
void ServiceRoot::performInitialAssembly(const Assignment& categories,
|
||||||
|
const Assignment& feeds,
|
||||||
|
const QList<Label*>& labels) {
|
||||||
// All data are now obtained, lets create the hierarchy.
|
// All data are now obtained, lets create the hierarchy.
|
||||||
assembleCategories(categories);
|
assembleCategories(categories);
|
||||||
assembleFeeds(feeds);
|
assembleFeeds(feeds);
|
||||||
|
@ -401,10 +407,12 @@ void ServiceRoot::performInitialAssembly(const Assignment& categories, const Ass
|
||||||
// As the last item, add recycle bin, which is needed.
|
// As the last item, add recycle bin, which is needed.
|
||||||
appendChild(recycleBin());
|
appendChild(recycleBin());
|
||||||
appendChild(importantNode());
|
appendChild(importantNode());
|
||||||
appendChild(labelsNode());
|
|
||||||
|
|
||||||
labelsNode()->loadLabels(labels);
|
if (labelsNode() != nullptr) {
|
||||||
requestItemExpand({ labelsNode() }, true);
|
appendChild(labelsNode());
|
||||||
|
labelsNode()->loadLabels(labels);
|
||||||
|
requestItemExpand({ labelsNode() }, true);
|
||||||
|
}
|
||||||
|
|
||||||
updateCounts(true);
|
updateCounts(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,14 @@ typedef QList<QPair<int, RootItem*>> Assignment;
|
||||||
typedef QPair<int, RootItem*> AssignmentItem;
|
typedef QPair<int, RootItem*> AssignmentItem;
|
||||||
typedef QPair<Message, RootItem::Importance> ImportanceChange;
|
typedef QPair<Message, RootItem::Importance> ImportanceChange;
|
||||||
|
|
||||||
|
struct CustomDatabaseEntry {
|
||||||
|
public:
|
||||||
|
CustomDatabaseEntry(const QString& name, bool encrypted = false) : m_name(name), m_encrypted(encrypted) {}
|
||||||
|
|
||||||
|
QString m_name;
|
||||||
|
bool m_encrypted;
|
||||||
|
};
|
||||||
|
|
||||||
// THIS IS the root node of the service.
|
// THIS IS the root node of the service.
|
||||||
// NOTE: The root usually contains some core functionality of the
|
// NOTE: The root usually contains some core functionality of the
|
||||||
// service like service account username/password etc.
|
// service like service account username/password etc.
|
||||||
|
@ -53,6 +61,7 @@ class ServiceRoot : public RootItem {
|
||||||
virtual bool supportsFeedAdding() const;
|
virtual bool supportsFeedAdding() const;
|
||||||
virtual bool supportsCategoryAdding() const;
|
virtual bool supportsCategoryAdding() const;
|
||||||
virtual LabelOperation supportedLabelOperations() const;
|
virtual LabelOperation supportedLabelOperations() const;
|
||||||
|
virtual QList<CustomDatabaseEntry> customDatabaseAttributes() const;
|
||||||
|
|
||||||
// Returns list of specific actions for "Add new item" main window menu.
|
// Returns list of specific actions for "Add new item" main window menu.
|
||||||
// So typical list of returned actions could look like:
|
// So typical list of returned actions could look like:
|
||||||
|
|
|
@ -19,7 +19,7 @@ ServiceRoot* FeedlyEntryPoint::createNewRoot() const {
|
||||||
QList<ServiceRoot*> FeedlyEntryPoint::initializeSubtree() const {
|
QList<ServiceRoot*> FeedlyEntryPoint::initializeSubtree() const {
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("FeedlyEntryPoint"));
|
QSqlDatabase database = qApp->database()->connection(QSL("FeedlyEntryPoint"));
|
||||||
|
|
||||||
return DatabaseQueries::getFeedlyAccounts(database);
|
return DatabaseQueries::getAccounts<FeedlyServiceRoot>(database, code());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString FeedlyEntryPoint::name() const {
|
QString FeedlyEntryPoint::name() const {
|
||||||
|
|
|
@ -21,7 +21,7 @@ ServiceRoot* GmailEntryPoint::createNewRoot() const {
|
||||||
QList<ServiceRoot*> GmailEntryPoint::initializeSubtree() const {
|
QList<ServiceRoot*> GmailEntryPoint::initializeSubtree() const {
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("GmailEntryPoint"));
|
QSqlDatabase database = qApp->database()->connection(QSL("GmailEntryPoint"));
|
||||||
|
|
||||||
return DatabaseQueries::getGmailAccounts(database);
|
return DatabaseQueries::getAccounts<GmailServiceRoot>(database, code());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GmailEntryPoint::name() const {
|
QString GmailEntryPoint::name() const {
|
||||||
|
|
|
@ -19,7 +19,7 @@ ServiceRoot* GreaderEntryPoint::createNewRoot() const {
|
||||||
QList<ServiceRoot*> GreaderEntryPoint::initializeSubtree() const {
|
QList<ServiceRoot*> GreaderEntryPoint::initializeSubtree() const {
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("GreaderEntryPoint"));
|
QSqlDatabase database = qApp->database()->connection(QSL("GreaderEntryPoint"));
|
||||||
|
|
||||||
return DatabaseQueries::getGreaderAccounts(database);
|
return DatabaseQueries::getAccounts<GreaderServiceRoot>(database, code());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GreaderEntryPoint::name() const {
|
QString GreaderEntryPoint::name() const {
|
||||||
|
|
|
@ -22,7 +22,7 @@ ServiceRoot* InoreaderEntryPoint::createNewRoot() const {
|
||||||
QList<ServiceRoot*> InoreaderEntryPoint::initializeSubtree() const {
|
QList<ServiceRoot*> InoreaderEntryPoint::initializeSubtree() const {
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("InoreaderEntryPoint"));
|
QSqlDatabase database = qApp->database()->connection(QSL("InoreaderEntryPoint"));
|
||||||
|
|
||||||
return DatabaseQueries::getInoreaderAccounts(database);
|
return DatabaseQueries::getAccounts<InoreaderServiceRoot>(database, code());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString InoreaderEntryPoint::name() const {
|
QString InoreaderEntryPoint::name() const {
|
||||||
|
|
|
@ -19,7 +19,7 @@ ServiceRoot* OwnCloudServiceEntryPoint::createNewRoot() const {
|
||||||
QList<ServiceRoot*> OwnCloudServiceEntryPoint::initializeSubtree() const {
|
QList<ServiceRoot*> OwnCloudServiceEntryPoint::initializeSubtree() const {
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("OwnCloudServiceEntryPoint"));
|
QSqlDatabase database = qApp->database()->connection(QSL("OwnCloudServiceEntryPoint"));
|
||||||
|
|
||||||
return DatabaseQueries::getOwnCloudAccounts(database);
|
return DatabaseQueries::getAccounts<OwnCloudServiceRoot>(database, code());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString OwnCloudServiceEntryPoint::name() const {
|
QString OwnCloudServiceEntryPoint::name() const {
|
||||||
|
|
|
@ -38,5 +38,5 @@ QList<ServiceRoot*> StandardServiceEntryPoint::initializeSubtree() const {
|
||||||
// Check DB if standard account is enabled.
|
// Check DB if standard account is enabled.
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("StandardServiceEntryPoint"));
|
QSqlDatabase database = qApp->database()->connection(QSL("StandardServiceEntryPoint"));
|
||||||
|
|
||||||
return DatabaseQueries::getStandardAccounts(database);
|
return DatabaseQueries::getAccounts<StandardServiceRoot>(database, code());
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ void FormEditTtRssAccount::apply() {
|
||||||
account<TtRssServiceRoot>()->network()->setForceServerSideUpdate(m_details->m_ui.m_checkServerSideUpdate->isChecked());
|
account<TtRssServiceRoot>()->network()->setForceServerSideUpdate(m_details->m_ui.m_checkServerSideUpdate->isChecked());
|
||||||
account<TtRssServiceRoot>()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked());
|
account<TtRssServiceRoot>()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked());
|
||||||
|
|
||||||
account<TtRssServiceRoot>()->saveAccountDataToDatabase(m_creatingNew);
|
account<TtRssServiceRoot>()->saveAccountDataToDatabase();
|
||||||
accept();
|
accept();
|
||||||
|
|
||||||
if (!m_creatingNew) {
|
if (!m_creatingNew) {
|
||||||
|
|
|
@ -42,5 +42,5 @@ QList<ServiceRoot*> TtRssServiceEntryPoint::initializeSubtree() const {
|
||||||
// Check DB if standard account is enabled.
|
// Check DB if standard account is enabled.
|
||||||
QSqlDatabase database = qApp->database()->connection(QSL("TtRssServiceEntryPoint"));
|
QSqlDatabase database = qApp->database()->connection(QSL("TtRssServiceEntryPoint"));
|
||||||
|
|
||||||
return DatabaseQueries::getTtRssAccounts(database);
|
return DatabaseQueries::getAccounts<TtRssServiceRoot>(database, code());
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ void TtRssServiceRoot::start(bool freshly_activated) {
|
||||||
loadCacheFromFile();
|
loadCacheFromFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateTitle();
|
||||||
|
|
||||||
if (getSubTreeFeeds().isEmpty()) {
|
if (getSubTreeFeeds().isEmpty()) {
|
||||||
syncIn();
|
syncIn();
|
||||||
}
|
}
|
||||||
|
@ -200,6 +202,13 @@ void TtRssServiceRoot::saveAllCachedData(bool ignore_errors) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<CustomDatabaseEntry> TtRssServiceRoot::customDatabaseAttributes() const {
|
||||||
|
return {
|
||||||
|
{ QSL("username") }, { QSL("password"), true }, { QSL("auth_protected") }, { QSL("auth_username") },
|
||||||
|
{ QSL("auth_password"), true }, { QSL("url") }, { QSL("force_update") }, { QSL("download_only_unread") }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
QString TtRssServiceRoot::additionalTooltip() const {
|
QString TtRssServiceRoot::additionalTooltip() const {
|
||||||
return tr("Username: %1\nServer: %2\n"
|
return tr("Username: %1\nServer: %2\n"
|
||||||
"Last error: %3\nLast login on: %4").arg(m_network->username(),
|
"Last error: %3\nLast login on: %4").arg(m_network->username(),
|
||||||
|
@ -214,29 +223,10 @@ TtRssNetworkFactory* TtRssServiceRoot::network() const {
|
||||||
return m_network;
|
return m_network;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TtRssServiceRoot::saveAccountDataToDatabase(bool creating_new) {
|
void TtRssServiceRoot::saveAccountDataToDatabase() {
|
||||||
QSqlDatabase database = qApp->database()->connection(metaObject()->className());
|
QSqlDatabase database = qApp->database()->connection(metaObject()->className());
|
||||||
|
|
||||||
if (!creating_new) {
|
DatabaseQueries::createOverwriteAccount(database, this);
|
||||||
// We are overwritting previously saved data.
|
|
||||||
if (DatabaseQueries::overwriteTtRssAccount(database, m_network->username(), m_network->password(),
|
|
||||||
m_network->authIsUsed(), m_network->authUsername(),
|
|
||||||
m_network->authPassword(), m_network->url(),
|
|
||||||
m_network->forceServerSideUpdate(), m_network->downloadOnlyUnreadMessages(),
|
|
||||||
accountId())) {
|
|
||||||
updateTitle();
|
|
||||||
itemChanged(QList<RootItem*>() << this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (DatabaseQueries::createTtRssAccount(database, accountId(), m_network->username(),
|
|
||||||
m_network->password(), m_network->authIsUsed(),
|
|
||||||
m_network->authUsername(), m_network->authPassword(),
|
|
||||||
m_network->url(), m_network->forceServerSideUpdate(),
|
|
||||||
m_network->downloadOnlyUnreadMessages())) {
|
|
||||||
updateTitle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TtRssServiceRoot::loadFromDatabase() {
|
void TtRssServiceRoot::loadFromDatabase() {
|
||||||
|
@ -255,7 +245,71 @@ void TtRssServiceRoot::updateTitle() {
|
||||||
host = m_network->url();
|
host = m_network->url();
|
||||||
}
|
}
|
||||||
|
|
||||||
setTitle(m_network->username() + QSL(" (Tiny Tiny RSS)"));
|
setTitle(TextFactory::extractUsernameFromEmail(m_network->username()) + QSL(" (Tiny Tiny RSS)"));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TtRssServiceRoot::username() const {
|
||||||
|
return m_network->username();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setUsername(const QString& username) {
|
||||||
|
m_network->setUsername(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TtRssServiceRoot::password() const {
|
||||||
|
return m_network->password();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setPassword(const QString& password) {
|
||||||
|
m_network->setPassword(password);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TtRssServiceRoot::authProtected() const {
|
||||||
|
return m_network->authIsUsed();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setAuthProtected(bool auth_protected) {
|
||||||
|
m_network->setAuthIsUsed(auth_protected);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TtRssServiceRoot::authUsername() const {
|
||||||
|
return m_network->authUsername();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setAuthUsername(const QString& auth_username) {
|
||||||
|
m_network->setAuthUsername(auth_username);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TtRssServiceRoot::authPassword() const {
|
||||||
|
return m_network->authPassword();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setAuthPassword(const QString& auth_password) {
|
||||||
|
m_network->setAuthPassword(auth_password);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TtRssServiceRoot::url() const {
|
||||||
|
return m_network->url();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setUrl(const QString& url) {
|
||||||
|
m_network->setUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TtRssServiceRoot::forceUpdate() const {
|
||||||
|
return m_network->forceServerSideUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setForceUpdate(bool force_update) {
|
||||||
|
m_network->setForceServerSideUpdate(force_update);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TtRssServiceRoot::downloadOnlyUnread() const {
|
||||||
|
return m_network->downloadOnlyUnreadMessages();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TtRssServiceRoot::setDownloadOnlyUnread(bool download_only_unread) {
|
||||||
|
m_network->setDownloadOnlyUnreadMessages(download_only_unread);
|
||||||
}
|
}
|
||||||
|
|
||||||
RootItem* TtRssServiceRoot::obtainNewTreeForSyncIn() const {
|
RootItem* TtRssServiceRoot::obtainNewTreeForSyncIn() const {
|
||||||
|
|
|
@ -14,6 +14,14 @@ class TtRssNetworkFactory;
|
||||||
|
|
||||||
class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot {
|
class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QString username READ username WRITE setUsername)
|
||||||
|
Q_PROPERTY(QString password READ password WRITE setPassword)
|
||||||
|
Q_PROPERTY(bool auth_protected READ authProtected WRITE setAuthProtected)
|
||||||
|
Q_PROPERTY(QString auth_username READ authUsername WRITE setAuthUsername)
|
||||||
|
Q_PROPERTY(QString auth_password READ authPassword WRITE setAuthPassword)
|
||||||
|
Q_PROPERTY(QString url READ url WRITE setUrl)
|
||||||
|
Q_PROPERTY(bool force_update READ forceUpdate WRITE setForceUpdate)
|
||||||
|
Q_PROPERTY(bool download_only_unread READ downloadOnlyUnread WRITE setDownloadOnlyUnread)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit TtRssServiceRoot(RootItem* parent = nullptr);
|
explicit TtRssServiceRoot(RootItem* parent = nullptr);
|
||||||
|
@ -33,13 +41,39 @@ class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot {
|
||||||
virtual void addNewFeed(RootItem* selected_item, const QString& url = QString());
|
virtual void addNewFeed(RootItem* selected_item, const QString& url = QString());
|
||||||
virtual QString additionalTooltip() const;
|
virtual QString additionalTooltip() const;
|
||||||
virtual void saveAllCachedData(bool ignore_errors);
|
virtual void saveAllCachedData(bool ignore_errors);
|
||||||
|
virtual QList<CustomDatabaseEntry> customDatabaseAttributes() const;
|
||||||
|
|
||||||
// Access to network.
|
// Access to network.
|
||||||
TtRssNetworkFactory* network() const;
|
TtRssNetworkFactory* network() const;
|
||||||
|
|
||||||
void saveAccountDataToDatabase(bool creating_new);
|
void saveAccountDataToDatabase();
|
||||||
void updateTitle();
|
void updateTitle();
|
||||||
|
|
||||||
|
// Support for dynamic DB attributes.
|
||||||
|
QString username() const;
|
||||||
|
void setUsername(const QString& username);
|
||||||
|
|
||||||
|
QString password() const;
|
||||||
|
void setPassword(const QString& password);
|
||||||
|
|
||||||
|
bool authProtected() const;
|
||||||
|
void setAuthProtected(bool auth_protected);
|
||||||
|
|
||||||
|
QString authUsername() const;
|
||||||
|
void setAuthUsername(const QString& auth_username);
|
||||||
|
|
||||||
|
QString authPassword() const;
|
||||||
|
void setAuthPassword(const QString& auth_password);
|
||||||
|
|
||||||
|
QString url() const;
|
||||||
|
void setUrl(const QString& url);
|
||||||
|
|
||||||
|
bool forceUpdate() const;
|
||||||
|
void setForceUpdate(bool force_update);
|
||||||
|
|
||||||
|
bool downloadOnlyUnread() const;
|
||||||
|
void setDownloadOnlyUnread(bool download_only_unread);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual RootItem* obtainNewTreeForSyncIn() const;
|
virtual RootItem* obtainNewTreeForSyncIn() const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue