// 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 ArchiveLocation::WriteVectorKeys( std::vector&& members) { ArchiveVector vector(std::move(members)); return context_.ArchiveInstance(ArchiveVector::kArchiveDefinition, vector); } bool ArchiveLocation::ReadVectorKeys(PrimaryKey name, std::vector& 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