diff --git a/components/brave_rewards/browser/BUILD.gn b/components/brave_rewards/browser/BUILD.gn index 21c84540f946..76fedc9a4ff1 100644 --- a/components/brave_rewards/browser/BUILD.gn +++ b/components/brave_rewards/browser/BUILD.gn @@ -80,6 +80,8 @@ source_set("browser") { "database/database_contribution_queue.h", "database/database_contribution_queue_publishers.cc", "database/database_contribution_queue_publishers.h", + "database/database_media_publisher_info.cc", + "database/database_media_publisher_info.h", "database/database_pending_contribution.cc", "database/database_pending_contribution.h", "database/database_promotion.cc", diff --git a/components/brave_rewards/browser/database/database_media_publisher_info.cc b/components/brave_rewards/browser/database/database_media_publisher_info.cc new file mode 100644 index 000000000000..5d281347d45d --- /dev/null +++ b/components/brave_rewards/browser/database/database_media_publisher_info.cc @@ -0,0 +1,140 @@ +/* Copyright (c) 2019 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include +#include + +#include "base/bind.h" +#include "base/strings/stringprintf.h" +#include "brave/components/brave_rewards/browser/database/database_media_publisher_info.h" +#include "sql/statement.h" +#include "sql/transaction.h" + +namespace brave_rewards { + +namespace { + const char* table_name_ = "media_publisher_info"; + const int minimum_version_ = 1; +} // namespace + +DatabaseMediaPublisherInfo::DatabaseMediaPublisherInfo( + int current_db_version) : + DatabaseTable(current_db_version) { +} + +DatabaseMediaPublisherInfo::~DatabaseMediaPublisherInfo() = default; + +bool DatabaseMediaPublisherInfo::Init(sql::Database* db) { + if (GetCurrentDBVersion() < minimum_version_) { + return true; + } + + sql::Transaction transaction(db); + if (!transaction.Begin()) { + return false; + } + + bool success = CreateTable(db); + if (!success) { + return false; + } + + success = CreateIndex(db); + if (!success) { + return false; + } + + return transaction.Commit(); +} + +bool DatabaseMediaPublisherInfo::CreateTable(sql::Database* db) { + if (db->DoesTableExist(table_name_)) { + return true; + } + + return CreateTableV1(db); +} + +bool DatabaseMediaPublisherInfo::CreateTableV1(sql::Database* db) { + const std::string query = base::StringPrintf( + "CREATE TABLE %s (" + "media_key TEXT NOT NULL PRIMARY KEY UNIQUE," + "publisher_id LONGVARCHAR NOT NULL," + "CONSTRAINT fk_%s_publisher_id" + " FOREIGN KEY (publisher_id)" + " REFERENCES publisher_info (publisher_id)" + " ON DELETE CASCADE" + ")", + table_name_, + table_name_); + + return db->Execute(query.c_str()); +} + +bool DatabaseMediaPublisherInfo::CreateIndex(sql::Database* db) { + return true; +} + +bool DatabaseMediaPublisherInfo::InsertOrUpdate( + sql::Database* db, + const std::string& media_key, + const std::string& publisher_key) { + if (media_key.empty() || publisher_key.empty()) { + return false; + } + + const std::string query = base::StringPrintf( + "INSERT OR REPLACE INTO %s (media_key, publisher_id) VALUES (?, ?)", + table_name_); + + sql::Statement statement( + db->GetCachedStatement(SQL_FROM_HERE, query.c_str())); + + statement.BindString(0, media_key); + statement.BindString(1, publisher_key); + + return statement.Run(); +} + +ledger::PublisherInfoPtr DatabaseMediaPublisherInfo::GetRecord( + sql::Database* db, + const std::string& media_key) { + if (media_key.empty()) { + return nullptr; + } + + const std::string query = base::StringPrintf( + "SELECT pi.publisher_id, pi.name, pi.url, pi.favIcon, " + "pi.provider, spi.status, pi.excluded " + "FROM %s as mpi " + "INNER JOIN publisher_info AS pi ON mpi.publisher_id = pi.publisher_id " + "LEFT JOIN server_publisher_info AS spi " + "ON spi.publisher_key = pi.publisher_id " + "WHERE mpi.media_key=?", + table_name_); + + sql::Statement statement(db->GetUniqueStatement(query.c_str())); + + statement.BindString(0, media_key); + + if (!statement.Step()) { + return nullptr; + } + + auto info = ledger::PublisherInfo::New(); + info->id = statement.ColumnString(0); + info->name = statement.ColumnString(1); + info->url = statement.ColumnString(2); + info->favicon_url = statement.ColumnString(3); + info->provider = statement.ColumnString(4); + info->status = + static_cast(statement.ColumnInt64(5)); + info->excluded = static_cast( + statement.ColumnInt(6)); + + return info; +} + +} // namespace brave_rewards diff --git a/components/brave_rewards/browser/database/database_media_publisher_info.h b/components/brave_rewards/browser/database/database_media_publisher_info.h new file mode 100644 index 000000000000..cffed39e3691 --- /dev/null +++ b/components/brave_rewards/browser/database/database_media_publisher_info.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2019 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_COMPONENTS_BRAVE_REWARDS_BROWSER_DATABASE_DATABASE_MEDIA_PUBLISHER_INFO_H_ +#define BRAVE_COMPONENTS_BRAVE_REWARDS_BROWSER_DATABASE_DATABASE_MEDIA_PUBLISHER_INFO_H_ + +#include + +#include "bat/ledger/mojom_structs.h" +#include "brave/components/brave_rewards/browser/database/database_table.h" + +namespace brave_rewards { + +class DatabaseMediaPublisherInfo: public DatabaseTable { + public: + explicit DatabaseMediaPublisherInfo(int current_db_version); + + ~DatabaseMediaPublisherInfo() override; + + bool Init(sql::Database* db) override; + + bool CreateTable(sql::Database* db) override; + + bool CreateIndex(sql::Database* db) override; + + bool InsertOrUpdate( + sql::Database* db, + const std::string& media_key, + const std::string& publisher_key); + + ledger::PublisherInfoPtr GetRecord( + sql::Database* db, + const std::string& media_key); + + private: + bool CreateTableV1(sql::Database* db); +}; + +} // namespace brave_rewards + +#endif // BRAVE_COMPONENTS_BRAVE_REWARDS_BROWSER_DATABASE_DATABASE_MEDIA_PUBLISHER_INFO_H_ diff --git a/components/brave_rewards/browser/database/publisher_info_database.cc b/components/brave_rewards/browser/database/publisher_info_database.cc index 6a5446908fc6..72fd9f42e041 100644 --- a/components/brave_rewards/browser/database/publisher_info_database.cc +++ b/components/brave_rewards/browser/database/publisher_info_database.cc @@ -54,6 +54,9 @@ PublisherInfoDatabase::PublisherInfoDatabase( pending_contribution_ = std::make_unique(GetCurrentVersion()); + + media_publisher_info_ = + std::make_unique(GetCurrentVersion()); } PublisherInfoDatabase::~PublisherInfoDatabase() { @@ -82,7 +85,6 @@ bool PublisherInfoDatabase::Init() { if (!CreatePublisherInfoTable() || !CreateActivityInfoTable() || - !CreateMediaPublisherInfoTable() || !CreateRecurringTipsTable()) { return false; } @@ -114,6 +116,10 @@ bool PublisherInfoDatabase::Init() { return false; } + if (!media_publisher_info_->Init(&GetDB())) { + return false; + } + // Version check. sql::InitStatus version_status = EnsureCurrentVersion(); if (version_status != sql::INIT_OK) { @@ -359,6 +365,51 @@ bool PublisherInfoDatabase::RestorePublishers() { return restore_q.Run(); } +bool PublisherInfoDatabase::GetExcludedList( + ledger::PublisherInfoList* list) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(list); + + if (!list) { + return false; + } + + bool initialized = Init(); + DCHECK(initialized); + + if (!initialized) { + return false; + } + + // We will use every attribute from publisher_info + const std::string query = + "SELECT pi.publisher_id, spi.status, pi.name," + "pi.favicon, pi.url, pi.provider " + "FROM publisher_info as pi " + "LEFT JOIN server_publisher_info AS spi " + "ON spi.publisher_key = pi.publisher_id " + "WHERE pi.excluded = 1"; + + sql::Statement info_sql(db_.GetUniqueStatement(query.c_str())); + + while (info_sql.Step()) { + std::string id(info_sql.ColumnString(0)); + + auto info = ledger::PublisherInfo::New(); + info->id = info_sql.ColumnString(0); + info->status = + static_cast(info_sql.ColumnInt64(1)); + info->name = info_sql.ColumnString(2); + info->favicon_url = info_sql.ColumnString(3); + info->url = info_sql.ColumnString(4); + info->provider = info_sql.ColumnString(5); + + list->push_back(std::move(info)); + } + + return true; +} + /** * * ACTIVITY INFO @@ -630,50 +681,22 @@ bool PublisherInfoDatabase::DeleteActivityInfo( * MEDIA PUBLISHER INFO * */ -bool PublisherInfoDatabase::CreateMediaPublisherInfoTable() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - const char* name = "media_publisher_info"; - if (GetDB().DoesTableExist(name)) { - return true; - } - - std::string sql; - sql.append("CREATE TABLE "); - sql.append(name); - sql.append( - "(" - "media_key TEXT NOT NULL PRIMARY KEY UNIQUE," - "publisher_id LONGVARCHAR NOT NULL," - "CONSTRAINT fk_media_publisher_info_publisher_id" - " FOREIGN KEY (publisher_id)" - " REFERENCES publisher_info (publisher_id)" - " ON DELETE CASCADE)"); - - return GetDB().Execute(sql.c_str()); -} - bool PublisherInfoDatabase::InsertOrUpdateMediaPublisherInfo( - const std::string& media_key, const std::string& publisher_id) { + const std::string& media_key, + const std::string& publisher_key) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); bool initialized = Init(); DCHECK(initialized); - if (!initialized || media_key.empty() || publisher_id.empty()) { + if (!initialized) { return false; } - sql::Statement statement(GetDB().GetCachedStatement( - SQL_FROM_HERE, - "INSERT OR REPLACE INTO media_publisher_info " - "(media_key, publisher_id) " - "VALUES (?, ?)")); - - statement.BindString(0, media_key); - statement.BindString(1, publisher_id); - - return statement.Run(); + return media_publisher_info_->InsertOrUpdate( + &GetDB(), + media_key, + publisher_key); } ledger::PublisherInfoPtr @@ -687,74 +710,7 @@ PublisherInfoDatabase::GetMediaPublisherInfo(const std::string& media_key) { return nullptr; } - sql::Statement info_sql(db_.GetUniqueStatement( - "SELECT pi.publisher_id, pi.name, pi.url, pi.favIcon, " - "pi.provider, spi.status, pi.excluded " - "FROM media_publisher_info as mpi " - "INNER JOIN publisher_info AS pi ON mpi.publisher_id = pi.publisher_id " - "LEFT JOIN server_publisher_info AS spi " - "ON spi.publisher_key = pi.publisher_id " - "WHERE mpi.media_key=?")); - - info_sql.BindString(0, media_key); - - if (info_sql.Step()) { - auto info = ledger::PublisherInfo::New(); - info->id = info_sql.ColumnString(0); - info->name = info_sql.ColumnString(1); - info->url = info_sql.ColumnString(2); - info->favicon_url = info_sql.ColumnString(3); - info->provider = info_sql.ColumnString(4); - info->status = - static_cast(info_sql.ColumnInt64(5)); - info->excluded = static_cast( - info_sql.ColumnInt(6)); - - return info; - } - - return nullptr; -} - -bool PublisherInfoDatabase::GetExcludedList( - ledger::PublisherInfoList* list) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - CHECK(list); - - bool initialized = Init(); - DCHECK(initialized); - - if (!initialized) { - return false; - } - - // We will use every attribute from publisher_info - std::string query = "SELECT pi.publisher_id, spi.status, pi.name," - "pi.favicon, pi.url, pi.provider " - "FROM publisher_info as pi " - "LEFT JOIN server_publisher_info AS spi " - "ON spi.publisher_key = pi.publisher_id " - "WHERE pi.excluded = 1"; - - sql::Statement info_sql(db_.GetUniqueStatement(query.c_str())); - - while (info_sql.Step()) { - std::string id(info_sql.ColumnString(0)); - - auto info = ledger::PublisherInfo::New(); - info->id = info_sql.ColumnString(0); - info->status = - static_cast(info_sql.ColumnInt64(1)); - info->name = info_sql.ColumnString(2); - info->favicon_url = info_sql.ColumnString(3); - info->url = info_sql.ColumnString(4); - info->provider = info_sql.ColumnString(5); - - list->push_back(std::move(info)); - } - - return true; + return media_publisher_info_->GetRecord(&GetDB(), media_key); } /** diff --git a/components/brave_rewards/browser/database/publisher_info_database.h b/components/brave_rewards/browser/database/publisher_info_database.h index 8923dcd83c35..becb3dc6a8b7 100644 --- a/components/brave_rewards/browser/database/publisher_info_database.h +++ b/components/brave_rewards/browser/database/publisher_info_database.h @@ -21,6 +21,7 @@ #include "bat/ledger/mojom_structs.h" #include "brave/components/brave_rewards/browser/database/database_contribution_info.h" #include "brave/components/brave_rewards/browser/database/database_contribution_queue.h" +#include "brave/components/brave_rewards/browser/database/database_media_publisher_info.h" #include "brave/components/brave_rewards/browser/database/database_pending_contribution.h" #include "brave/components/brave_rewards/browser/database/database_promotion.h" #include "brave/components/brave_rewards/browser/database/database_server_publisher_info.h" @@ -74,8 +75,9 @@ class PublisherInfoDatabase { bool GetExcludedList(ledger::PublisherInfoList* list); - bool InsertOrUpdateMediaPublisherInfo(const std::string& media_key, - const std::string& publisher_id); + bool InsertOrUpdateMediaPublisherInfo( + const std::string& media_key, + const std::string& publisher_key); ledger::PublisherInfoPtr GetMediaPublisherInfo( const std::string& media_key); @@ -152,8 +154,6 @@ class PublisherInfoDatabase { bool CreateActivityInfoIndex(); - bool CreateMediaPublisherInfoTable(); - bool CreateRecurringTipsTable(); bool CreateRecurringTipsIndex(); @@ -200,6 +200,7 @@ class PublisherInfoDatabase { std::unique_ptr unblinded_token_; std::unique_ptr contribution_info_; std::unique_ptr pending_contribution_; + std::unique_ptr media_publisher_info_; SEQUENCE_CHECKER(sequence_checker_); DISALLOW_COPY_AND_ASSIGN(PublisherInfoDatabase);