diff --git a/resources/misc/db_init_mysql.sql b/resources/misc/db_init_mysql.sql index 54d6fd185..68e397b7c 100644 --- a/resources/misc/db_init_mysql.sql +++ b/resources/misc/db_init_mysql.sql @@ -29,6 +29,7 @@ CREATE TABLE IF NOT EXISTS TtRssAccounts ( 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, FOREIGN KEY (id) REFERENCES Accounts (id) ); @@ -62,7 +63,7 @@ CREATE TABLE IF NOT EXISTS Feeds ( username TEXT, password TEXT, update_type INTEGER(1) NOT NULL CHECK (update_type >= 0), - update_interval INTEGER NOT NULL DEFAULT 15 CHECK (update_interval >= 5), + update_interval INTEGER NOT NULL CHECK (update_interval >= 5) DEFAULT 15, type INTEGER, account_id INTEGER NOT NULL, custom_id TEXT, @@ -74,16 +75,16 @@ DROP TABLE IF EXISTS Messages; -- ! CREATE TABLE IF NOT EXISTS Messages ( id INTEGER AUTO_INCREMENT PRIMARY KEY, - is_read INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_read >= 0 AND is_read <= 1), - is_deleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_deleted >= 0 AND is_deleted <= 1), - is_important INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_important >= 0 AND is_important <= 1), + is_read INTEGER(1) NOT NULL CHECK (is_read >= 0 AND is_read <= 1) DEFAULT 0, + is_deleted INTEGER(1) NOT NULL CHECK (is_deleted >= 0 AND is_deleted <= 1) DEFAULT 0, + is_important INTEGER(1) NOT NULL CHECK (is_important >= 0 AND is_important <= 1) DEFAULT 0 , feed TEXT NOT NULL, title TEXT NOT NULL CHECK (title != ''), url TEXT, author TEXT, date_created BIGINT NOT NULL CHECK (date_created != 0), contents TEXT, - is_pdeleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1), + is_pdeleted INTEGER(1) NOT NULL CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1) DEFAULT 0 , enclosures TEXT, account_id INTEGER NOT NULL, custom_id TEXT, diff --git a/resources/misc/db_init_sqlite.sql b/resources/misc/db_init_sqlite.sql index 157fb0ffc..d4c20de99 100644 --- a/resources/misc/db_init_sqlite.sql +++ b/resources/misc/db_init_sqlite.sql @@ -23,6 +23,7 @@ CREATE TABLE IF NOT EXISTS TtRssAccounts ( 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, FOREIGN KEY (id) REFERENCES Accounts (id) ); @@ -69,16 +70,16 @@ DROP TABLE IF EXISTS Messages; -- ! CREATE TABLE IF NOT EXISTS Messages ( id INTEGER PRIMARY KEY, - is_read INTEGER(1) NOT NULL CHECK (is_read >= 0 AND is_read <= 1) DEFAULT (0), - is_deleted INTEGER(1) NOT NULL CHECK (is_deleted >= 0 AND is_deleted <= 1) DEFAULT (0), - is_important INTEGER(1) NOT NULL CHECK (is_important >= 0 AND is_important <= 1) DEFAULT (0), + is_read INTEGER(1) NOT NULL CHECK (is_read >= 0 AND is_read <= 1) DEFAULT 0, + is_deleted INTEGER(1) NOT NULL CHECK (is_deleted >= 0 AND is_deleted <= 1) DEFAULT 0, + is_important INTEGER(1) NOT NULL CHECK (is_important >= 0 AND is_important <= 1) DEFAULT 0, feed TEXT NOT NULL, title TEXT NOT NULL CHECK (title != ''), url TEXT, author TEXT, date_created INTEGER NOT NULL CHECK (date_created != 0), contents TEXT, - is_pdeleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1), + is_pdeleted INTEGER(1) NOT NULL CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1) DEFAULT 0, enclosures TEXT, account_id INTEGER NOT NULL, custom_id TEXT, diff --git a/resources/misc/db_update_mysql_3_4.sql b/resources/misc/db_update_mysql_3_4.sql index b6acbcb72..f2c27f644 100644 --- a/resources/misc/db_update_mysql_3_4.sql +++ b/resources/misc/db_update_mysql_3_4.sql @@ -15,12 +15,13 @@ CREATE TABLE TtRssAccounts ( 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, FOREIGN KEY (id) REFERENCES Accounts (id) ); -- ! ALTER TABLE Messages -ADD COLUMN account_id INTEGER NOT NULL DEFAULT (1); +ADD COLUMN account_id INTEGER NOT NULL DEFAULT 1; -- ! ALTER TABLE Messages ADD COLUMN custom_id TEXT; @@ -38,7 +39,7 @@ ALTER TABLE Messages MODIFY url TEXT; -- ! ALTER TABLE Feeds -ADD COLUMN account_id INTEGER NOT NULL DEFAULT (1); +ADD COLUMN account_id INTEGER NOT NULL DEFAULT 1; -- ! ALTER TABLE Feeds ADD COLUMN custom_id TEXT; @@ -56,7 +57,7 @@ ALTER TABLE Feeds MODIFY type INTEGER; -- ! ALTER TABLE Categories -ADD COLUMN account_id INTEGER NOT NULL DEFAULT (1); +ADD COLUMN account_id INTEGER NOT NULL DEFAULT 1; -- ! ALTER TABLE Categories ADD COLUMN custom_id TEXT; diff --git a/resources/misc/db_update_sqlite_3_4.sql b/resources/misc/db_update_sqlite_3_4.sql index 33e985e6f..7366f1b5e 100644 --- a/resources/misc/db_update_sqlite_3_4.sql +++ b/resources/misc/db_update_sqlite_3_4.sql @@ -15,6 +15,7 @@ CREATE TABLE TtRssAccounts ( 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, FOREIGN KEY (id) REFERENCES Accounts (id) ); @@ -25,16 +26,16 @@ DROP TABLE Messages; -- ! CREATE TABLE Messages ( id INTEGER PRIMARY KEY, - is_read INTEGER(1) NOT NULL CHECK (is_read >= 0 AND is_read <= 1) DEFAULT (0), - is_deleted INTEGER(1) NOT NULL CHECK (is_deleted >= 0 AND is_deleted <= 1) DEFAULT (0), - is_important INTEGER(1) NOT NULL CHECK (is_important >= 0 AND is_important <= 1) DEFAULT (0), + is_read INTEGER(1) NOT NULL CHECK (is_read >= 0 AND is_read <= 1) DEFAULT 0, + is_deleted INTEGER(1) NOT NULL CHECK (is_deleted >= 0 AND is_deleted <= 1) DEFAULT 0, + is_important INTEGER(1) NOT NULL CHECK (is_important >= 0 AND is_important <= 1) DEFAULT 0, feed TEXT NOT NULL, title TEXT NOT NULL CHECK (title != ''), url TEXT, author TEXT, date_created INTEGER NOT NULL CHECK (date_created != 0), contents TEXT, - is_pdeleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1), + is_pdeleted INTEGER(1) NOT NULL CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1) DEFAULT 0, enclosures TEXT, account_id INTEGER NOT NULL, custom_id TEXT, diff --git a/src/gui/dialogs/formaddaccount.cpp b/src/gui/dialogs/formaddaccount.cpp index 60fa962af..d191d9128 100755 --- a/src/gui/dialogs/formaddaccount.cpp +++ b/src/gui/dialogs/formaddaccount.cpp @@ -59,9 +59,7 @@ void FormAddAccount::addSelectedAccount() { m_model->addServiceAccount(new_root); } else { - qApp->showGuiMessage(tr("Cannot add account"), - tr("Some critical error occurred, report this to developers."), - QSystemTrayIcon::Critical, parentWidget(), true); + qCritical("Cannot create new account."); } } diff --git a/src/services/tt-rss/gui/formeditaccount.cpp b/src/services/tt-rss/gui/formeditaccount.cpp index e0e1728b1..7d58ae34f 100755 --- a/src/services/tt-rss/gui/formeditaccount.cpp +++ b/src/services/tt-rss/gui/formeditaccount.cpp @@ -42,12 +42,12 @@ FormEditAccount::FormEditAccount(QWidget *parent) tr("No test done yet."), tr("Here, results of connection test are shown.")); - setTabOrder(m_ui->m_txtUrl->lineEdit(), m_ui->m_txtUsername->lineEdit()); + setTabOrder(m_ui->m_txtUrl->lineEdit(), m_ui->m_checkServerSideUpdate); + setTabOrder(m_ui->m_checkServerSideUpdate, m_ui->m_txtUsername->lineEdit()); setTabOrder(m_ui->m_txtUsername->lineEdit(), m_ui->m_txtPassword->lineEdit()); setTabOrder(m_ui->m_txtPassword->lineEdit(), m_ui->m_checkShowPassword); setTabOrder(m_ui->m_checkShowPassword, m_ui->m_gbHttpAuthentication); setTabOrder(m_ui->m_gbHttpAuthentication, m_ui->m_txtHttpUsername->lineEdit()); - setTabOrder(m_ui->m_txtHttpUsername->lineEdit(), m_ui->m_txtHttpPassword->lineEdit()); setTabOrder(m_ui->m_txtHttpPassword->lineEdit(), m_ui->m_checkShowHttpPassword); setTabOrder(m_ui->m_checkShowHttpPassword, m_ui->m_btnTestSetup); @@ -99,6 +99,7 @@ void FormEditAccount::execForEdit(TtRssServiceRoot *existing_root) { m_ui->m_txtUsername->lineEdit()->setText(existing_root->network()->username()); m_ui->m_txtPassword->lineEdit()->setText(existing_root->network()->password()); m_ui->m_txtUrl->lineEdit()->setText(existing_root->network()->url()); + m_ui->m_checkServerSideUpdate->setChecked(existing_root->network()->forceServerSideUpdate()); exec(); } @@ -120,6 +121,7 @@ void FormEditAccount::performTest() { factory.setAuthIsUsed(m_ui->m_gbHttpAuthentication->isChecked()); factory.setAuthUsername(m_ui->m_txtHttpUsername->lineEdit()->text()); factory.setAuthPassword(m_ui->m_txtHttpPassword->lineEdit()->text()); + factory.setForceServerSideUpdate(m_ui->m_checkServerSideUpdate->isChecked()); TtRssLoginResponse result = factory.login(); @@ -179,6 +181,7 @@ void FormEditAccount::onClickedOk() { m_editableRoot->network()->setAuthIsUsed(m_ui->m_gbHttpAuthentication->isChecked()); m_editableRoot->network()->setAuthUsername(m_ui->m_txtHttpUsername->lineEdit()->text()); m_editableRoot->network()->setAuthPassword(m_ui->m_txtHttpPassword->lineEdit()->text()); + m_editableRoot->network()->setForceServerSideUpdate(m_ui->m_checkServerSideUpdate->isChecked()); m_editableRoot->saveAccountDataToDatabase(); accept(); diff --git a/src/services/tt-rss/gui/formeditaccount.ui b/src/services/tt-rss/gui/formeditaccount.ui index adbf578f3..670b544db 100755 --- a/src/services/tt-rss/gui/formeditaccount.ui +++ b/src/services/tt-rss/gui/formeditaccount.ui @@ -14,7 +14,7 @@ Dialog - + Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported. @@ -65,7 +65,7 @@ - + Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported. @@ -80,7 +80,7 @@ true - true + false @@ -119,7 +119,7 @@ - + @@ -132,7 +132,7 @@ - + Qt::Horizontal @@ -159,13 +159,23 @@ - + &Test setup + + + + Force execution of server-side update when updating feeds from RSS Guard + + + true + + + diff --git a/src/services/tt-rss/network/ttrssnetworkfactory.cpp b/src/services/tt-rss/network/ttrssnetworkfactory.cpp index 51fccd388..d14b0957b 100755 --- a/src/services/tt-rss/network/ttrssnetworkfactory.cpp +++ b/src/services/tt-rss/network/ttrssnetworkfactory.cpp @@ -31,7 +31,7 @@ TtRssNetworkFactory::TtRssNetworkFactory() - : m_url(QString()), m_username(QString()), m_password(QString()), m_authIsUsed(false), + : m_url(QString()), m_username(QString()), m_password(QString()), m_forceServerSideUpdate(false), m_authIsUsed(false), m_authUsername(QString()), m_authPassword(QString()), m_sessionId(QString()), m_lastLoginTime(QDateTime()), m_lastError(QNetworkReply::NoError) { } @@ -145,14 +145,14 @@ TtRssGetFeedsCategoriesResponse TtRssNetworkFactory::getFeedsCategories() { return result; } -TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, bool force_update, int limit, int skip, +TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int limit, int skip, bool show_content, bool include_attachments, bool sanitize) { QtJson::JsonObject json; json["op"] = "getHeadlines"; json["sid"] = m_sessionId; json["feed_id"] = feed_id; - json["force_update"] = force_update; + json["force_update"] = m_forceServerSideUpdate; json["limit"] = limit; json["skip"] = skip; json["show_content"] = show_content; @@ -206,8 +206,16 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList m_lastError = network_reply.first; return result; } -bool TtRssNetworkFactory::authIsUsed() const -{ + +bool TtRssNetworkFactory::forceServerSideUpdate() const { + return m_forceServerSideUpdate; +} + +void TtRssNetworkFactory::setForceServerSideUpdate(bool force_server_side_update) { + m_forceServerSideUpdate = force_server_side_update; +} + +bool TtRssNetworkFactory::authIsUsed() const { return m_authIsUsed; } @@ -408,7 +416,7 @@ QList TtRssGetHeadlinesResponse::messages() const { QMap mapped = item.toMap(); Message message; - message.m_author = mapped["author"].toString(); + message.m_author = mapped["author"].toString(); message.m_isRead = !mapped["unread"].toBool(); message.m_isImportant = mapped["marked"].toBool(); message.m_contents = mapped["content"].toString(); diff --git a/src/services/tt-rss/network/ttrssnetworkfactory.h b/src/services/tt-rss/network/ttrssnetworkfactory.h index 55879056e..3d1cd2281 100755 --- a/src/services/tt-rss/network/ttrssnetworkfactory.h +++ b/src/services/tt-rss/network/ttrssnetworkfactory.h @@ -120,6 +120,10 @@ class TtRssNetworkFactory { QString authPassword() const; void setAuthPassword(const QString &auth_password); + bool forceServerSideUpdate() const; + void setForceServerSideUpdate(bool force_server_side_update); + + // Metadata. QDateTime lastLoginTime() const; @@ -137,7 +141,7 @@ class TtRssNetworkFactory { TtRssGetFeedsCategoriesResponse getFeedsCategories(); // Gets headlines (messages) from the server. - TtRssGetHeadlinesResponse getHeadlines(int feed_id, bool force_update, int limit, int skip, + TtRssGetHeadlinesResponse getHeadlines(int feed_id, int limit, int skip, bool show_content, bool include_attachments, bool sanitize); @@ -148,6 +152,7 @@ class TtRssNetworkFactory { QString m_url; QString m_username; QString m_password; + bool m_forceServerSideUpdate; bool m_authIsUsed; QString m_authUsername; QString m_authPassword; diff --git a/src/services/tt-rss/ttrssfeed.cpp b/src/services/tt-rss/ttrssfeed.cpp index f8ca2a0ca..2796008a1 100755 --- a/src/services/tt-rss/ttrssfeed.cpp +++ b/src/services/tt-rss/ttrssfeed.cpp @@ -91,7 +91,7 @@ int TtRssFeed::update() { int skip = 0; do { - TtRssGetHeadlinesResponse headlines = serviceRoot()->network()->getHeadlines(customId(), true, limit, skip, + TtRssGetHeadlinesResponse headlines = serviceRoot()->network()->getHeadlines(customId(), limit, skip, true, true, false); if (serviceRoot()->network()->lastError() != QNetworkReply::NoError) { diff --git a/src/services/tt-rss/ttrssserviceentrypoint.cpp b/src/services/tt-rss/ttrssserviceentrypoint.cpp index 37a8d2dc9..14f50bcc9 100755 --- a/src/services/tt-rss/ttrssserviceentrypoint.cpp +++ b/src/services/tt-rss/ttrssserviceentrypoint.cpp @@ -87,12 +87,12 @@ QList TtRssServiceEntryPoint::initializeSubtree() { 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->updateTitle(); roots.append(root); } diff --git a/src/services/tt-rss/ttrssserviceroot.cpp b/src/services/tt-rss/ttrssserviceroot.cpp index 92e828b35..f1dd2d921 100755 --- a/src/services/tt-rss/ttrssserviceroot.cpp +++ b/src/services/tt-rss/ttrssserviceroot.cpp @@ -426,7 +426,7 @@ void TtRssServiceRoot::saveAccountDataToDatabase() { query.prepare("UPDATE TtRssAccounts " "SET username = :username, password = :password, url = :url, auth_protected = :auth_protected, " - "auth_username = :auth_username, auth_password = :auth_password " + "auth_username = :auth_username, auth_password = :auth_password, force_update = :force_update " "WHERE id = :id;"); query.bindValue(QSL(":username"), m_network->username()); query.bindValue(QSL(":password"), TextFactory::encrypt(m_network->password())); @@ -434,6 +434,7 @@ void TtRssServiceRoot::saveAccountDataToDatabase() { query.bindValue(QSL(":auth_protected"), m_network->authIsUsed()); query.bindValue(QSL(":auth_username"), m_network->authUsername()); query.bindValue(QSL(":auth_password"), TextFactory::encrypt(m_network->authPassword())); + query.bindValue(QSL(":force_update"), m_network->forceServerSideUpdate()); query.bindValue(QSL(":id"), accountId()); if (query.exec()) { @@ -452,13 +453,26 @@ void TtRssServiceRoot::saveAccountDataToDatabase() { } int id_to_assign = query.value(0).toInt() + 1; + bool saved = true; - bool saved = query.exec(QString("INSERT INTO Accounts (id, type) VALUES (%1, '%2');").arg(QString::number(id_to_assign), - SERVICE_CODE_TT_RSS)) && - query.exec(QString("INSERT INTO TtRssAccounts (id, username, password, url) VALUES (%1, '%2', '%3', '%4');").arg(QString::number(id_to_assign), - network()->username(), - network()->password(), - network()->url())); + query.prepare(QSL("INSERT INTO Accounts (id, type) VALUES (:id, :type);")); + query.bindValue(QSL(":id"), id_to_assign); + query.bindValue(QSL(":type"), SERVICE_CODE_TT_RSS); + + saved &= query.exec(); + + query.prepare("INSERT INTO TtRssAccounts (id, username, password, auth_protected, auth_username, auth_password, url, force_update) " + "VALUES (:id, :username, :password, :auth_protected, :auth_username, :auth_password, :url, :force_update);"); + query.bindValue(QSL(":id"), id_to_assign); + query.bindValue(QSL(":username"), m_network->username()); + query.bindValue(QSL(":password"), TextFactory::encrypt(m_network->password())); + query.bindValue(QSL(":auth_protected"), m_network->authIsUsed()); + query.bindValue(QSL(":auth_username"), m_network->authUsername()); + query.bindValue(QSL(":auth_password"), TextFactory::encrypt(m_network->authPassword())); + query.bindValue(QSL(":url"), m_network->url()); + query.bindValue(QSL(":force_update"), m_network->forceServerSideUpdate()); + + saved &= query.exec(); if (saved) { setId(id_to_assign);