blob: cab3b26fa1b2ee668dcc756403478d08f4607f6a [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/explore_sites/get_images_task.h"
#include "chrome/browser/android/explore_sites/explore_sites_schema.h"
#include "sql/database.h"
#include "sql/meta_table.h"
#include "sql/statement.h"
#include "sql/transaction.h"
namespace explore_sites {
namespace {
const char kSelectCategoryImagesSql[] = R"(SELECT favicon
FROM sites
LEFT JOIN site_blacklist ON (sites.url = site_blacklist.url)
WHERE category_id = ? AND NOT removed AND site_blacklist.url IS NULL
LIMIT ?;)";
const char kSelectSiteImageSql[] =
"SELECT favicon FROM sites WHERE site_id = ?;";
} // namespace
EncodedImageList GetCategoryImagesSync(int category_id,
int max_images,
sql::Database* db) {
DCHECK(db);
sql::Statement category_statement(
db->GetCachedStatement(SQL_FROM_HERE, kSelectCategoryImagesSql));
category_statement.BindInt64(0, category_id);
category_statement.BindInt64(1, max_images);
EncodedImageList result;
while (category_statement.Step()) {
int byte_length = category_statement.ColumnByteLength(0);
result.push_back(std::make_unique<std::vector<uint8_t>>(byte_length));
category_statement.ColumnBlobAsVector(0, result.back().get());
}
if (!category_statement.Succeeded())
return EncodedImageList();
return result;
}
EncodedImageList GetSiteImageSync(int site_id, sql::Database* db) {
DCHECK(db);
sql::Statement site_statement(
db->GetCachedStatement(SQL_FROM_HERE, kSelectSiteImageSql));
site_statement.BindInt64(0, site_id);
EncodedImageList result;
while (site_statement.Step()) {
int byte_length = site_statement.ColumnByteLength(0);
result.push_back(std::make_unique<std::vector<uint8_t>>(byte_length));
site_statement.ColumnBlobAsVector(0, result.back().get());
}
if (!site_statement.Succeeded())
return EncodedImageList();
return result;
}
GetImagesTask::GetImagesTask(ExploreSitesStore* store,
int site_id,
EncodedImageListCallback callback)
: store_(store),
data_type_(DataType::kSite),
id_(site_id),
max_results_(1),
callback_(std::move(callback)),
weak_ptr_factory_(this) {}
GetImagesTask::GetImagesTask(ExploreSitesStore* store,
int category_id,
int max_images,
EncodedImageListCallback callback)
: store_(store),
data_type_(DataType::kCategory),
id_(category_id),
max_results_(max_images),
callback_(std::move(callback)),
weak_ptr_factory_(this) {}
GetImagesTask::~GetImagesTask() = default;
void GetImagesTask::Run() {
switch (data_type_) {
case DataType::kCategory:
store_->Execute(base::BindOnce(&GetCategoryImagesSync, id_, max_results_),
base::BindOnce(&GetImagesTask::FinishedExecuting,
weak_ptr_factory_.GetWeakPtr()),
EncodedImageList());
break;
case DataType::kSite:
store_->Execute(base::BindOnce(&GetSiteImageSync, id_),
base::BindOnce(&GetImagesTask::FinishedExecuting,
weak_ptr_factory_.GetWeakPtr()),
EncodedImageList());
break;
}
}
void GetImagesTask::FinishedExecuting(EncodedImageList images) {
TaskComplete();
DVLOG(1) << "Finished getting images, resulting in " << images.size()
<< " images.";
std::move(callback_).Run(std::move(images));
}
} // namespace explore_sites