9 #include "flutter/fml/logging.h"
21 FML_DCHECK(transaction_count_ == 0)
22 <<
"There must be no pending transactions";
26 return database_->IsValid();
29 std::optional<int64_t > Archive::ArchiveInstance(
36 auto transaction = database_->CreateTransaction(transaction_count_);
38 const auto* registration =
39 database_->GetRegistrationForDefinition(definition);
41 if (registration ==
nullptr) {
45 auto statement = registration->CreateInsertStatement();
47 if (!statement.IsValid() || !statement.Reset()) {
68 if (primary_key.has_value() &&
70 primary_key.value())) {
74 if (!archivable.
Write(item)) {
82 int64_t lastInsert = database_->GetLastInsertRowID();
84 if (primary_key.has_value() &&
85 lastInsert !=
static_cast<int64_t
>(primary_key.value())) {
93 transaction.MarkWritesAsReadyForCommit();
98 bool Archive::UnarchiveInstance(
const ArchiveDef& definition,
100 Archivable& archivable) {
102 archivable.Read(item);
106 return UnarchiveInstances(definition, stepper, name) == 1;
109 size_t Archive::UnarchiveInstances(
const ArchiveDef& definition,
116 const auto* registration =
117 database_->GetRegistrationForDefinition(definition);
119 if (registration ==
nullptr) {
123 const bool isQueryingSingle = primary_key.has_value();
125 auto statement = registration->CreateQueryStatement(isQueryingSingle);
127 if (!statement.IsValid() || !statement.Reset()) {
131 if (isQueryingSingle) {
137 primary_key.value())) {
142 if (statement.GetColumnCount() !=
143 registration->GetMemberCount() + 1 ) {
151 auto transaction = database_->CreateTransaction(transaction_count_);
153 size_t itemsRead = 0;
163 if (!stepper(item)) {
167 if (isQueryingSingle) {