blob: 906174809b7127264d2155a4598c1769b8fb9358 [file] [log] [blame] [edit]
// Copyright 2013 The Flutter 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 "impeller/archivist/archive_location.h"
#include "impeller/archivist/archive_class_registration.h"
#include "impeller/archivist/archive_vector.h"
namespace impeller {
ArchiveLocation::ArchiveLocation(Archive& context,
ArchiveStatement& statement,
const ArchiveClassRegistration& registration,
PrimaryKey name)
: context_(context),
statement_(statement),
registration_(registration),
primary_key_(name) {}
PrimaryKey ArchiveLocation::GetPrimaryKey() const {
return primary_key_;
}
bool ArchiveLocation::Write(const std::string& member,
const std::string& item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.WriteValue(index.value(), item) : false;
}
bool ArchiveLocation::WriteIntegral(const std::string& member, int64_t item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.WriteValue(index.value(), item) : false;
}
bool ArchiveLocation::Write(const std::string& member, double item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.WriteValue(index.value(), item) : false;
}
bool ArchiveLocation::Write(const std::string& member, const Allocation& item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.WriteValue(index.value(), item) : false;
}
bool ArchiveLocation::Write(const std::string& member,
const ArchiveDef& otherDef,
const Archivable& other) {
auto index = registration_.FindColumnIndex(member);
if (!index.has_value()) {
return false;
}
/*
* We need to fully archive the other instance first because it could
* have a name that is auto assigned. In that case, we cannot ask it before
* archival (via `other.archiveName()`).
*/
auto row_id = context_.ArchiveInstance(otherDef, other);
if (!row_id.has_value()) {
return false;
}
/*
* Bind the name of the serializable
*/
if (!statement_.WriteValue(index.value(), row_id.value())) {
return false;
}
return true;
}
std::optional<int64_t> ArchiveLocation::WriteVectorKeys(
std::vector<int64_t>&& members) {
ArchiveVector vector(std::move(members));
return context_.ArchiveInstance(ArchiveVector::kArchiveDefinition, vector);
}
bool ArchiveLocation::ReadVectorKeys(PrimaryKey name,
std::vector<int64_t>& members) {
ArchiveVector vector;
if (!context_.UnarchiveInstance(ArchiveVector::kArchiveDefinition, name,
vector)) {
return false;
}
const auto& keys = vector.GetKeys();
std::move(keys.begin(), keys.end(), std::back_inserter(members));
return true;
}
bool ArchiveLocation::Read(const std::string& member, std::string& item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.ReadValue(index.value(), item) : false;
}
bool ArchiveLocation::ReadIntegral(const std::string& member, int64_t& item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.ReadValue(index.value(), item) : false;
}
bool ArchiveLocation::Read(const std::string& member, double& item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.ReadValue(index.value(), item) : false;
}
bool ArchiveLocation::Read(const std::string& member, Allocation& item) {
auto index = registration_.FindColumnIndex(member);
return index.has_value() ? statement_.ReadValue(index.value(), item) : false;
}
bool ArchiveLocation::Read(const std::string& member,
const ArchiveDef& otherDef,
Archivable& other) {
auto index = registration_.FindColumnIndex(member);
/*
* Make sure a member is present at that column
*/
if (!index.has_value()) {
return false;
}
/*
* Try to find the foreign key in the current items row
*/
int64_t foreignKey = 0;
if (!statement_.ReadValue(index.value(), foreignKey)) {
return false;
}
/*
* Find the other item and unarchive by this foreign key
*/
if (!context_.UnarchiveInstance(otherDef, foreignKey, other)) {
return false;
}
return true;
}
} // namespace impeller