// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/ash/components/file_manager/indexing/file_index_service.h"
#include <memory>
#include "base/task/thread_pool.h"
#include "chromeos/ash/components/file_manager/indexing/sql_storage.h"
namespace ash::file_manager {
// FileIndexService provides asynchronous version of operations defined in
// the FileIndex class. The current structure of the classes is as follows:
//
// [ FileIndexService ]---<>[ SequenceBound<FileIndex> ]
// |
// |
// [ IndexStorage ]<>----------------'
// [ (interface) ]
// ^
// |
// -------+--------.
// | |
// [ RamStorage ] [ SqlStorage ]
namespace {
base::FilePath MakeDbPath(base::FilePath& profile_path) {
return profile_path.AppendASCII("file_manager").AppendASCII("file_index.db");
}
constexpr char kSqlDatabaseUmaTag[] =
"FileBrowser.FileIndex.SqlDatabase.Status";
} // namespace
FileIndexService::FileIndexService(base::FilePath profile_path)
: file_index_(base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), base::TaskPriority::USER_BLOCKING,
base::TaskShutdownBehavior::BLOCK_SHUTDOWN}),
std::make_unique<SqlStorage>(MakeDbPath(profile_path),
kSqlDatabaseUmaTag)) {}
FileIndexService::~FileIndexService() = default;
void FileIndexService::Init(IndexingOperationCallback callback) {
if (inited_ != OpResults::kUndefined) {
std::move(callback).Run(inited_);
return;
}
file_index_.AsyncCall(&FileIndex::Init)
.Then(base::BindOnce(
[](IndexingOperationCallback callback, OpResults* inited,
OpResults result) {
*inited = result;
std::move(callback).Run(result);
},
std::move(callback), &inited_));
}
void FileIndexService::PutFileInfo(const FileInfo& file_info,
IndexingOperationCallback callback) {
if (inited_ != OpResults::kSuccess) {
std::move(callback).Run(OpResults::kUninitialized);
return;
}
file_index_.AsyncCall(&FileIndex::PutFileInfo)
.WithArgs(file_info)
.Then(std::move(callback));
}
void FileIndexService::SetTerms(const std::vector<Term>& terms,
const GURL& url,
IndexingOperationCallback callback) {
if (inited_ != OpResults::kSuccess) {
std::move(callback).Run(kUninitialized);
return;
}
file_index_.AsyncCall(&FileIndex::SetTerms)
.WithArgs(terms, url)
.Then(std::move(callback));
}
void FileIndexService::AddTerms(const std::vector<Term>& terms,
const GURL& url,
IndexingOperationCallback callback) {
if (inited_ != OpResults::kSuccess) {
std::move(callback).Run(kUninitialized);
return;
}
file_index_.AsyncCall(&FileIndex::AddTerms)
.WithArgs(terms, url)
.Then(std::move(callback));
}
void FileIndexService::RemoveFile(const GURL& url,
IndexingOperationCallback callback) {
if (inited_ != OpResults::kSuccess) {
std::move(callback).Run(kUninitialized);
return;
}
file_index_.AsyncCall(&FileIndex::RemoveFile)
.WithArgs(url)
.Then(std::move(callback));
}
void FileIndexService::MoveFile(const GURL& old_url,
const GURL& new_url,
IndexingOperationCallback callback) {
if (inited_ != OpResults::kSuccess) {
std::move(callback).Run(kUninitialized);
return;
}
file_index_.AsyncCall(&FileIndex::MoveFile)
.WithArgs(old_url, new_url)
.Then(std::move(callback));
}
void FileIndexService::RemoveTerms(const std::vector<Term>& terms,
const GURL& url,
IndexingOperationCallback callback) {
if (inited_ != OpResults::kSuccess) {
std::move(callback).Run(kUninitialized);
return;
}
file_index_.AsyncCall(&FileIndex::RemoveTerms)
.WithArgs(terms, url)
.Then(std::move(callback));
}
// Searches the index for file info matching the specified query.
void FileIndexService::Search(const Query& query,
SearchResultsCallback callback) {
if (inited_ != OpResults::kSuccess) {
std::move(callback).Run(SearchResults());
return;
}
file_index_.AsyncCall(&FileIndex::Search)
.WithArgs(query)
.Then(std::move(callback));
}
} // namespace ash::file_manager