7 #include "flutter/fml/logging.h"
18 FML_DCHECK(transaction_count_ == 0)
19 <<
"There must be no pending transactions";
23 return database_->IsValid();
26 std::optional<int64_t > Archive::ArchiveInstance(
33 auto transaction = database_->CreateTransaction(transaction_count_);
35 const auto* registration =
36 database_->GetRegistrationForDefinition(definition);
38 if (registration ==
nullptr) {
42 auto statement = registration->CreateInsertStatement();
44 if (!statement.IsValid() || !statement.Reset()) {
65 if (primary_key.has_value() &&
67 primary_key.value())) {
71 if (!archivable.
Write(item)) {
79 int64_t lastInsert = database_->GetLastInsertRowID();
81 if (primary_key.has_value() &&
82 lastInsert !=
static_cast<int64_t
>(primary_key.value())) {
90 transaction.MarkWritesAsReadyForCommit();
95 bool Archive::UnarchiveInstance(
const ArchiveDef& definition,
97 Archivable& archivable) {
99 archivable.Read(item);
103 return UnarchiveInstances(definition, stepper, name) == 1;
106 size_t Archive::UnarchiveInstances(
const ArchiveDef& definition,
113 const auto* registration =
114 database_->GetRegistrationForDefinition(definition);
116 if (registration ==
nullptr) {
120 const bool isQueryingSingle = primary_key.has_value();
122 auto statement = registration->CreateQueryStatement(isQueryingSingle);
124 if (!statement.IsValid() || !statement.Reset()) {
128 if (isQueryingSingle) {
134 primary_key.value())) {
139 if (statement.GetColumnCount() !=
140 registration->GetMemberCount() + 1 ) {
148 auto transaction = database_->CreateTransaction(transaction_count_);
150 size_t itemsRead = 0;
160 if (!stepper(item)) {
164 if (isQueryingSingle) {