Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Publisher list improvements #5301

Merged
merged 5 commits into from
Apr 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

#include <map>
#include <utility>
#include <vector>

#include "base/strings/stringprintf.h"
#include "bat/ledger/internal/database/database_server_publisher_amounts.h"
Expand Down Expand Up @@ -173,30 +172,56 @@ bool DatabaseServerPublisherAmounts::MigrateToV15(
return true;
}

void DatabaseServerPublisherAmounts::InsertOrUpdate(
void DatabaseServerPublisherAmounts::InsertOrUpdateList(
ledger::DBTransaction* transaction,
const ledger::PublisherBanner& info) {
const std::vector<ledger::PublisherBanner>& list) {
DCHECK(transaction);

// It's ok if social links are empty
if (info.amounts.empty()) {
if (list.empty()) {
return;
}

for (const auto& amount : info.amounts) {
const std::string query = base::StringPrintf(
"INSERT OR REPLACE INTO %s "
"(publisher_key, amount) VALUES (?, ?)",
const std::string base_query = base::StringPrintf(
"INSERT OR REPLACE INTO %s VALUES ",
kTableName);

auto command = ledger::DBCommand::New();
command->type = ledger::DBCommand::Type::RUN;
command->command = query;
size_t i = 0;
std::string query;
for (const auto& info : list) {
// It's ok if amounts are empty
if (info.amounts.empty()) {
continue;
}

if (i == 0) {
query += base_query;
}

BindString(command.get(), 0, info.publisher_key);
BindDouble(command.get(), 1, amount);
transaction->commands.push_back(std::move(command));
for (const auto& amount : info.amounts) {
if (i == kBatchLimit) {
query += base_query;
i = 0;
}

query += base::StringPrintf(
R"(("%s",%g))",
info.publisher_key.c_str(),
amount);
query += (i == kBatchLimit - 1) ? ";" : ",";
i++;
}
}

if (query.empty()) {
return;
}

query.pop_back();

auto command = ledger::DBCommand::New();
command->type = ledger::DBCommand::Type::EXECUTE;
command->command = query;
transaction->commands.push_back(std::move(command));
}

void DatabaseServerPublisherAmounts::GetRecord(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#define BRAVELEDGER_DATABASE_DATABASE_SERVER_PUBLISHER_AMOUNTS_H_

#include <string>
#include <vector>

#include "bat/ledger/internal/database/database_table.h"

Expand All @@ -19,9 +20,9 @@ class DatabaseServerPublisherAmounts: public DatabaseTable {

bool Migrate(ledger::DBTransaction* transaction, const int target) override;

void InsertOrUpdate(
void InsertOrUpdateList(
ledger::DBTransaction* transaction,
const ledger::PublisherBanner& info);
const std::vector<ledger::PublisherBanner>& list);

void GetRecord(
const std::string& publisher_key,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,9 @@ void DatabaseServerPublisherBanner::InsertOrUpdateList(
"VALUES (?, ?, ?, ?, ?)",
kTableName);

ledger::DBCommandPtr command;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was there a reason for pulling this variable out of the loop?

for (const auto& info : list) {
auto command = ledger::DBCommand::New();
command = ledger::DBCommand::New();
command->type = ledger::DBCommand::Type::RUN;
command->command = query;

Expand All @@ -220,11 +221,11 @@ void DatabaseServerPublisherBanner::InsertOrUpdateList(
BindString(command.get(), 4, info.logo);

transaction->commands.push_back(std::move(command));

links_->InsertOrUpdate(transaction.get(), info);
amounts_->InsertOrUpdate(transaction.get(), info);
}

links_->InsertOrUpdateList(transaction.get(), list);
amounts_->InsertOrUpdateList(transaction.get(), list);

auto transaction_callback = std::bind(&OnResultCallback,
_1,
callback);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,26 +129,42 @@ void DatabaseServerPublisherInfo::InsertOrUpdatePartialList(
return;
}

const std::string query = base::StringPrintf(
"INSERT OR REPLACE INTO %s "
"(publisher_key, status, excluded, address) "
"VALUES (?, ?, ?, ?)",
const std::string base_query = base::StringPrintf(
"INSERT OR REPLACE INTO %s VALUES ",
kTableName);

auto transaction = ledger::DBTransaction::New();
size_t i = 0;
std::string main_query = base_query;
for (const auto& info : list) {
auto command = ledger::DBCommand::New();
command->type = ledger::DBCommand::Type::RUN;
command->command = query;
if (i == kBatchLimit) {
main_query += base_query;
i = 0;
}

BindString(command.get(), 0, info.publisher_key);
BindInt(command.get(), 1, static_cast<int>(info.status));
BindBool(command.get(), 2, info.excluded);
BindString(command.get(), 3, info.address);
main_query += base::StringPrintf(
R"(("%s",%d,%d,"%s"))",
info.publisher_key.c_str(),
static_cast<int>(info.status),
info.excluded,
info.address.c_str());
main_query += (i == kBatchLimit - 1) ? ";" : ",";
i++;
}

transaction->commands.push_back(std::move(command));
if (main_query.empty()) {
callback(ledger::Result::LEDGER_ERROR);
return;
}

main_query.pop_back();

auto transaction = ledger::DBTransaction::New();
auto command = ledger::DBCommand::New();
command->type = ledger::DBCommand::Type::EXECUTE;
command->command = main_query;

transaction->commands.push_back(std::move(command));

auto transaction_callback = std::bind(&OnResultCallback,
_1,
callback);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,36 +175,61 @@ bool DatabaseServerPublisherLinks::MigrateToV15(
return true;
}

void DatabaseServerPublisherLinks::InsertOrUpdate(
void DatabaseServerPublisherLinks::InsertOrUpdateList(
ledger::DBTransaction* transaction,
const ledger::PublisherBanner& info) {
const std::vector<ledger::PublisherBanner>& list) {
DCHECK(transaction);

// It's ok if links are empty
if (info.links.empty()) {
if (list.empty()) {
return;
}

for (const auto& link : info.links) {
if (link.second.empty()) {
const std::string base_query = base::StringPrintf(
"INSERT OR REPLACE INTO %s VALUES ",
kTableName);

size_t i = 0;
std::string query;
for (const auto& info : list) {
// It's ok if links are empty
if (info.links.empty()) {
continue;
}

const std::string query = base::StringPrintf(
"INSERT OR REPLACE INTO %s "
"(publisher_key, provider, link) "
"VALUES (?, ?, ?)",
kTableName);
if (i == 0) {
query += base_query;
}

auto command = ledger::DBCommand::New();
command->type = ledger::DBCommand::Type::RUN;
command->command = query;
for (const auto& link : info.links) {
if (link.second.empty()) {
continue;
}

if (i == kBatchLimit) {
query += base_query;
i = 0;
}

query += base::StringPrintf(
R"(("%s","%s","%s"))",
info.publisher_key.c_str(),
link.first.c_str(),
link.second.c_str());
query += (i == kBatchLimit - 1) ? ";" : ",";
i++;
}
}

BindString(command.get(), 0, info.publisher_key);
BindString(command.get(), 1, link.first);
BindString(command.get(), 2, link.second);
transaction->commands.push_back(std::move(command));
if (query.empty()) {
return;
}

query.pop_back();

auto command = ledger::DBCommand::New();
command->type = ledger::DBCommand::Type::EXECUTE;
command->command = query;
transaction->commands.push_back(std::move(command));
}

void DatabaseServerPublisherLinks::GetRecord(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <map>
#include <string>
#include <vector>

#include "bat/ledger/internal/database/database_table.h"

Expand All @@ -20,9 +21,9 @@ class DatabaseServerPublisherLinks: public DatabaseTable {

bool Migrate(ledger::DBTransaction* transaction, const int target) override;

void InsertOrUpdate(
void InsertOrUpdateList(
ledger::DBTransaction* transaction,
const ledger::PublisherBanner& info);
const std::vector<ledger::PublisherBanner>& list);

void GetRecord(
const std::string& publisher_key,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

namespace braveledger_database {

const size_t kBatchLimit = 999;

bool DropTable(
ledger::DBTransaction* transaction,
const std::string& table_name);
Expand Down
Loading