Formatted src/services/sqlite

This commit is contained in:
Aaron Po
2026-07-19 04:10:33 -04:00
parent 34a036d7b3
commit 5d48d6757a
5 changed files with 319 additions and 317 deletions

View File

@@ -9,26 +9,26 @@
#include "services/database/sqlite_export_service_helpers.h" #include "services/database/sqlite_export_service_helpers.h"
void SqliteExportService::Finalize() { void SqliteExportService::Finalize() {
if (db_handle_ == nullptr) { if (db_handle_ == nullptr) {
return; return;
} }
try { try {
insert_user_address_stmt_.reset(); insert_user_address_stmt_.reset();
insert_user_stmt_.reset(); insert_user_stmt_.reset();
insert_brewery_address_stmt_.reset(); insert_brewery_address_stmt_.reset();
insert_brewery_stmt_.reset(); insert_brewery_stmt_.reset();
insert_city_stmt_.reset(); insert_city_stmt_.reset();
if (transaction_open_) { if (transaction_open_) {
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, "COMMIT;", "Failed to commit SQLite transaction"); db_handle_, "COMMIT;", "Failed to commit SQLite transaction");
transaction_open_ = false; transaction_open_ = false;
} }
db_handle_.reset(); db_handle_.reset();
city_cache_.clear(); city_cache_.clear();
} catch (...) { } catch (...) {
RollbackAndCloseNoThrow(); RollbackAndCloseNoThrow();
throw; throw;
} }
} }

View File

@@ -12,99 +12,99 @@
#include "services/database/sqlite_export_service.h" #include "services/database/sqlite_export_service.h"
std::filesystem::path SqliteExportService::BuildDatabasePath() const { std::filesystem::path SqliteExportService::BuildDatabasePath() const {
std::filesystem::path base_filename("biergarten_seed_" + run_timestamp_utc_ + std::filesystem::path base_filename("biergarten_seed_" + run_timestamp_utc_ +
".sqlite"); ".sqlite");
std::filesystem::path candidate = output_path_ / base_filename; std::filesystem::path candidate = output_path_ / base_filename;
for (int suffix = 1; std::filesystem::exists(candidate); ++suffix) { for (int suffix = 1; std::filesystem::exists(candidate); ++suffix) {
candidate = output_path_ / std::filesystem::path( candidate = output_path_ / std::filesystem::path(
std::format("biergarten_seed_{}-{}.sqlite", std::format("biergarten_seed_{}-{}.sqlite",
run_timestamp_utc_, suffix)); run_timestamp_utc_, suffix));
} }
return candidate; return candidate;
} }
void SqliteExportService::InitializeSchema() const { void SqliteExportService::InitializeSchema() const {
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, sqlite_export_service_internal::kCreateCitiesTableSql, db_handle_, sqlite_export_service_internal::kCreateCitiesTableSql,
"Failed to create SQLite cities table"); "Failed to create SQLite cities table");
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, sqlite_export_service_internal::kCreateBreweriesTableSql, db_handle_, sqlite_export_service_internal::kCreateBreweriesTableSql,
"Failed to create SQLite breweries table"); "Failed to create SQLite breweries table");
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, db_handle_,
sqlite_export_service_internal::kCreateBreweryAddressesTableSql, sqlite_export_service_internal::kCreateBreweryAddressesTableSql,
"Failed to create SQLite brewery_addresses table"); "Failed to create SQLite brewery_addresses table");
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, sqlite_export_service_internal::kCreateUsersTableSql, db_handle_, sqlite_export_service_internal::kCreateUsersTableSql,
"Failed to create SQLite users table"); "Failed to create SQLite users table");
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, sqlite_export_service_internal::kCreateUserAddressesTableSql, db_handle_, sqlite_export_service_internal::kCreateUserAddressesTableSql,
"Failed to create SQLite user_addresses table"); "Failed to create SQLite user_addresses table");
} }
void SqliteExportService::PrepareStatements() { void SqliteExportService::PrepareStatements() {
insert_city_stmt_ = sqlite_export_service_internal::PrepareStatement( insert_city_stmt_ = sqlite_export_service_internal::PrepareStatement(
db_handle_, sqlite_export_service_internal::kInsertCitySql, db_handle_, sqlite_export_service_internal::kInsertCitySql,
"Failed to prepare SQLite city insert statement"); "Failed to prepare SQLite city insert statement");
insert_brewery_stmt_ = sqlite_export_service_internal::PrepareStatement( insert_brewery_stmt_ = sqlite_export_service_internal::PrepareStatement(
db_handle_, sqlite_export_service_internal::kInsertBrewerySql, db_handle_, sqlite_export_service_internal::kInsertBrewerySql,
"Failed to prepare SQLite brewery insert statement"); "Failed to prepare SQLite brewery insert statement");
insert_brewery_address_stmt_ = insert_brewery_address_stmt_ =
sqlite_export_service_internal::PrepareStatement( sqlite_export_service_internal::PrepareStatement(
db_handle_, sqlite_export_service_internal::kInsertBreweryAddressSql, db_handle_, sqlite_export_service_internal::kInsertBreweryAddressSql,
"Failed to prepare SQLite brewery address insert statement"); "Failed to prepare SQLite brewery address insert statement");
insert_user_stmt_ = sqlite_export_service_internal::PrepareStatement( insert_user_stmt_ = sqlite_export_service_internal::PrepareStatement(
db_handle_, sqlite_export_service_internal::kInsertUserSql, db_handle_, sqlite_export_service_internal::kInsertUserSql,
"Failed to prepare SQLite user insert statement"); "Failed to prepare SQLite user insert statement");
insert_user_address_stmt_ = sqlite_export_service_internal::PrepareStatement( insert_user_address_stmt_ = sqlite_export_service_internal::PrepareStatement(
db_handle_, sqlite_export_service_internal::kInsertUserAddressSql, db_handle_, sqlite_export_service_internal::kInsertUserAddressSql,
"Failed to prepare SQLite user address insert statement"); "Failed to prepare SQLite user address insert statement");
} }
void SqliteExportService::RollbackAndCloseNoThrow() noexcept { void SqliteExportService::RollbackAndCloseNoThrow() noexcept {
if (db_handle_ == nullptr) { if (db_handle_ == nullptr) {
return; return;
} }
if (transaction_open_) { if (transaction_open_) {
sqlite_export_service_internal::RollbackTransactionNoThrow(db_handle_); sqlite_export_service_internal::RollbackTransactionNoThrow(db_handle_);
transaction_open_ = false; transaction_open_ = false;
} }
insert_user_address_stmt_.reset(); insert_user_address_stmt_.reset();
insert_user_stmt_.reset(); insert_user_stmt_.reset();
insert_brewery_address_stmt_.reset(); insert_brewery_address_stmt_.reset();
insert_brewery_stmt_.reset(); insert_brewery_stmt_.reset();
insert_city_stmt_.reset(); insert_city_stmt_.reset();
db_handle_.reset(); db_handle_.reset();
city_cache_.clear(); city_cache_.clear();
} }
void SqliteExportService::Initialize() { void SqliteExportService::Initialize() {
if (db_handle_ != nullptr) { if (db_handle_ != nullptr) {
throw std::runtime_error("SQLite export service is already initialized"); throw std::runtime_error("SQLite export service is already initialized");
} }
run_timestamp_utc_ = date_time_provider_->GetUtcTimestamp(); run_timestamp_utc_ = date_time_provider_->GetUtcTimestamp();
database_path_ = BuildDatabasePath(); database_path_ = BuildDatabasePath();
std::filesystem::create_directories(database_path_.parent_path()); std::filesystem::create_directories(database_path_.parent_path());
db_handle_ = sqlite_export_service_internal::OpenDatabase(database_path_); db_handle_ = sqlite_export_service_internal::OpenDatabase(database_path_);
try { try {
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, "PRAGMA foreign_keys = ON;", db_handle_, "PRAGMA foreign_keys = ON;",
"Failed to enable SQLite foreign keys"); "Failed to enable SQLite foreign keys");
InitializeSchema(); InitializeSchema();
PrepareStatements(); PrepareStatements();
sqlite_export_service_internal::ExecSql( sqlite_export_service_internal::ExecSql(
db_handle_, "BEGIN IMMEDIATE TRANSACTION;", db_handle_, "BEGIN IMMEDIATE TRANSACTION;",
"Failed to begin SQLite transaction"); "Failed to begin SQLite transaction");
transaction_open_ = true; transaction_open_ = true;
} catch (...) { } catch (...) {
RollbackAndCloseNoThrow(); RollbackAndCloseNoThrow();
throw; throw;
} }
} }

View File

@@ -12,164 +12,165 @@
#include "services/database/sqlite_export_service_helpers.h" #include "services/database/sqlite_export_service_helpers.h"
std::string SqliteExportService::BuildCityKey(const City& city) { std::string SqliteExportService::BuildCityKey(const City& city) {
std::ostringstream key_stream; std::ostringstream key_stream;
key_stream << city.city << '\n' key_stream << city.city << '\n'
<< city.state_province << '\n' << city.state_province << '\n'
<< city.iso3166_2 << '\n' << city.iso3166_2 << '\n'
<< city.country << '\n' << city.country << '\n'
<< city.iso3166_1 << '\n' << city.iso3166_1 << '\n'
<< sqlite_export_service_internal::SerializeVector( << sqlite_export_service_internal::SerializeVector(
city.local_languages); city.local_languages);
return key_stream.str(); return key_stream.str();
} }
sqlite3_int64 SqliteExportService::ResolveCityId(const City& city) { sqlite3_int64 SqliteExportService::ResolveCityId(const City& city) {
const std::string city_key = BuildCityKey(city); const std::string city_key = BuildCityKey(city);
const auto cached_city = city_cache_.find(city_key); const auto cached_city = city_cache_.find(city_key);
if (cached_city != city_cache_.end()) { if (cached_city != city_cache_.end()) {
return cached_city->second; return cached_city->second;
} }
const std::string local_languages_json = const std::string local_languages_json =
sqlite_export_service_internal::SerializeVector(city.local_languages); sqlite_export_service_internal::SerializeVector(city.local_languages);
const std::string city_regex_json = const std::string city_regex_json =
sqlite_export_service_internal::SerializeVector( sqlite_export_service_internal::SerializeVector(
city.postal_code.city_regexes); city.postal_code.city_regexes);
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kCityCityBindIndex, .index = sqlite_export_service_internal::kCityCityBindIndex,
.value = city.city, .value = city.city,
.action = "Failed to bind SQLite city name"}); .action = "Failed to bind SQLite city name"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kCityStateProvinceBindIndex, .index = sqlite_export_service_internal::kCityStateProvinceBindIndex,
.value = city.state_province, .value = city.state_province,
.action = "Failed to bind SQLite city state/province"}); .action = "Failed to bind SQLite city state/province"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kCityIso31662BindIndex, .index = sqlite_export_service_internal::kCityIso31662BindIndex,
.value = city.iso3166_2, .value = city.iso3166_2,
.action = "Failed to bind SQLite city ISO 3166-2 code"}); .action = "Failed to bind SQLite city ISO 3166-2 code"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kCityCountryBindIndex, .index = sqlite_export_service_internal::kCityCountryBindIndex,
.value = city.country, .value = city.country,
.action = "Failed to bind SQLite city country"}); .action = "Failed to bind SQLite city country"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kCityIso31661BindIndex, .index = sqlite_export_service_internal::kCityIso31661BindIndex,
.value = city.iso3166_1, .value = city.iso3166_1,
.action = "Failed to bind SQLite city ISO 3166-1 code"}); .action = "Failed to bind SQLite city ISO 3166-1 code"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kCityLanguagesBindIndex, .index = sqlite_export_service_internal::kCityLanguagesBindIndex,
.value = local_languages_json, .value = local_languages_json,
.action = "Failed to bind SQLite city languages"}); .action = "Failed to bind SQLite city languages"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal:: .index = sqlite_export_service_internal::
kCityPostalCodeCountryFormatRegexBindIndex, kCityPostalCodeCountryFormatRegexBindIndex,
.value = city.postal_code.country_format_regex, .value = city.postal_code.country_format_regex,
.action = "Failed to bind SQLite city postal-code format regex"}); .action = "Failed to bind SQLite city postal-code format regex"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_city_stmt_, insert_city_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal:: .index = sqlite_export_service_internal::
kCityPostalCodeCityRegexJsonBindIndex, kCityPostalCodeCityRegexJsonBindIndex,
.value = city_regex_json, .value = city_regex_json,
.action = "Failed to bind SQLite city postal-code city regexes"}); .action = "Failed to bind SQLite city postal-code city regexes"});
sqlite_export_service_internal::StepStatement( sqlite_export_service_internal::StepStatement(
db_handle_, insert_city_stmt_, "Failed to insert SQLite city row"); db_handle_, insert_city_stmt_, "Failed to insert SQLite city row");
const sqlite3_int64 city_id = const sqlite3_int64 city_id =
sqlite_export_service_internal::LastInsertRowId(db_handle_); sqlite_export_service_internal::LastInsertRowId(db_handle_);
city_cache_.emplace(city_key, city_id); city_cache_.emplace(city_key, city_id);
sqlite_export_service_internal::ResetStatement(insert_city_stmt_); sqlite_export_service_internal::ResetStatement(insert_city_stmt_);
return city_id; return city_id;
} }
uint64_t SqliteExportService::ProcessRecord(const BreweryRecord& brewery) { uint64_t SqliteExportService::ProcessRecord(const BreweryRecord& brewery) {
if (db_handle_ == nullptr || !transaction_open_) { if (db_handle_ == nullptr || !transaction_open_) {
throw std::runtime_error("SQLite export service is not initialized"); throw std::runtime_error("SQLite export service is not initialized");
} }
const sqlite3_int64 city_id = ResolveCityId(brewery.address.city); const sqlite3_int64 city_id = ResolveCityId(brewery.address.city);
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_brewery_stmt_, insert_brewery_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kBreweryEnglishNameBindIndex, .index =
.value = brewery.brewery.name_en, sqlite_export_service_internal::kBreweryEnglishNameBindIndex,
.action = "Failed to bind SQLite brewery English name"}); .value = brewery.brewery.name_en,
.action = "Failed to bind SQLite brewery English name"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_brewery_stmt_, insert_brewery_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal:: .index = sqlite_export_service_internal::
kBreweryEnglishDescriptionBindIndex, kBreweryEnglishDescriptionBindIndex,
.value = brewery.brewery.description_en, .value = brewery.brewery.description_en,
.action = "Failed to bind SQLite brewery English description"}); .action = "Failed to bind SQLite brewery English description"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_brewery_stmt_, insert_brewery_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kBreweryLocalNameBindIndex, .index = sqlite_export_service_internal::kBreweryLocalNameBindIndex,
.value = brewery.brewery.name_local, .value = brewery.brewery.name_local,
.action = "Failed to bind SQLite brewery local name"}); .action = "Failed to bind SQLite brewery local name"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_brewery_stmt_, insert_brewery_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = .index = sqlite_export_service_internal::
sqlite_export_service_internal::kBreweryLocalDescriptionBindIndex, kBreweryLocalDescriptionBindIndex,
.value = brewery.brewery.description_local, .value = brewery.brewery.description_local,
.action = "Failed to bind SQLite brewery local description"}); .action = "Failed to bind SQLite brewery local description"});
sqlite_export_service_internal::StepStatement( sqlite_export_service_internal::StepStatement(
db_handle_, insert_brewery_stmt_, "Failed to insert SQLite brewery row"); db_handle_, insert_brewery_stmt_, "Failed to insert SQLite brewery row");
const sqlite3_int64 brewery_id = const sqlite3_int64 brewery_id =
sqlite_export_service_internal::LastInsertRowId(db_handle_); sqlite_export_service_internal::LastInsertRowId(db_handle_);
sqlite_export_service_internal::ResetStatement(insert_brewery_stmt_); sqlite_export_service_internal::ResetStatement(insert_brewery_stmt_);
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_brewery_address_stmt_, insert_brewery_address_stmt_,
sqlite_export_service_internal::BoundParam<sqlite3_int64>{ sqlite_export_service_internal::BoundParam<sqlite3_int64>{
.index = .index = sqlite_export_service_internal::
sqlite_export_service_internal::kBreweryAddressBreweryIdBindIndex, kBreweryAddressBreweryIdBindIndex,
.value = brewery_id, .value = brewery_id,
.action = "Failed to bind SQLite brewery address brewery id"}); .action = "Failed to bind SQLite brewery address brewery id"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_brewery_address_stmt_, insert_brewery_address_stmt_,
sqlite_export_service_internal::BoundParam<sqlite3_int64>{ sqlite_export_service_internal::BoundParam<sqlite3_int64>{
.index = .index =
sqlite_export_service_internal::kBreweryAddressCityIdBindIndex, sqlite_export_service_internal::kBreweryAddressCityIdBindIndex,
.value = city_id, .value = city_id,
.action = "Failed to bind SQLite brewery address city id"}); .action = "Failed to bind SQLite brewery address city id"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_brewery_address_stmt_, insert_brewery_address_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal:: .index = sqlite_export_service_internal::
kBreweryAddressPostalCodeBindIndex, kBreweryAddressPostalCodeBindIndex,
.value = brewery.address.postal_code, .value = brewery.address.postal_code,
.action = "Failed to bind SQLite brewery address postal code"}); .action = "Failed to bind SQLite brewery address postal code"});
sqlite_export_service_internal::StepStatement( sqlite_export_service_internal::StepStatement(
db_handle_, insert_brewery_address_stmt_, db_handle_, insert_brewery_address_stmt_,
"Failed to insert SQLite brewery address row"); "Failed to insert SQLite brewery address row");
sqlite_export_service_internal::ResetStatement(insert_brewery_address_stmt_); sqlite_export_service_internal::ResetStatement(insert_brewery_address_stmt_);
return static_cast<uint64_t>(brewery_id); return static_cast<uint64_t>(brewery_id);
} }

View File

@@ -9,94 +9,95 @@
#include "services/database/sqlite_export_service_helpers.h" #include "services/database/sqlite_export_service_helpers.h"
uint64_t SqliteExportService::ProcessRecord(const UserRecord& user) { uint64_t SqliteExportService::ProcessRecord(const UserRecord& user) {
if (db_handle_ == nullptr || !transaction_open_) { if (db_handle_ == nullptr || !transaction_open_) {
throw std::runtime_error("SQLite export service is not initialized"); throw std::runtime_error("SQLite export service is not initialized");
} }
const sqlite3_int64 city_id = ResolveCityId(user.address.city); const sqlite3_int64 city_id = ResolveCityId(user.address.city);
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_stmt_, insert_user_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kUserFirstNameBindIndex, .index = sqlite_export_service_internal::kUserFirstNameBindIndex,
.value = user.user.first_name, .value = user.user.first_name,
.action = "Failed to bind SQLite user first name"}); .action = "Failed to bind SQLite user first name"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_stmt_, insert_user_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kUserLastNameBindIndex, .index = sqlite_export_service_internal::kUserLastNameBindIndex,
.value = user.user.last_name, .value = user.user.last_name,
.action = "Failed to bind SQLite user last name"}); .action = "Failed to bind SQLite user last name"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_stmt_, insert_user_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kUserGenderBindIndex, .index = sqlite_export_service_internal::kUserGenderBindIndex,
.value = user.user.gender, .value = user.user.gender,
.action = "Failed to bind SQLite user gender"}); .action = "Failed to bind SQLite user gender"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_stmt_, insert_user_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kUserUsernameBindIndex, .index = sqlite_export_service_internal::kUserUsernameBindIndex,
.value = user.user.username, .value = user.user.username,
.action = "Failed to bind SQLite user username"}); .action = "Failed to bind SQLite user username"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_stmt_, insert_user_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = sqlite_export_service_internal::kUserBioBindIndex, .index = sqlite_export_service_internal::kUserBioBindIndex,
.value = user.user.bio, .value = user.user.bio,
.action = "Failed to bind SQLite user bio"}); .action = "Failed to bind SQLite user bio"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_stmt_, insert_user_stmt_,
sqlite_export_service_internal::BoundParam<double>{ sqlite_export_service_internal::BoundParam<double>{
.index = sqlite_export_service_internal::kUserActivityWeightBindIndex, .index =
.value = static_cast<double>(user.user.activity_weight), sqlite_export_service_internal::kUserActivityWeightBindIndex,
.action = "Failed to bind SQLite user activity weight"}); .value = static_cast<double>(user.user.activity_weight),
sqlite_export_service_internal::Bind( .action = "Failed to bind SQLite user activity weight"});
insert_user_stmt_, sqlite_export_service_internal::Bind(
sqlite_export_service_internal::BoundParam<std::string_view>{ insert_user_stmt_,
.index = sqlite_export_service_internal::kUserEmailBindIndex, sqlite_export_service_internal::BoundParam<std::string_view>{
.value = user.email, .index = sqlite_export_service_internal::kUserEmailBindIndex,
.action = "Failed to bind SQLite user email"}); .value = user.email,
sqlite_export_service_internal::Bind( .action = "Failed to bind SQLite user email"});
insert_user_stmt_, sqlite_export_service_internal::Bind(
sqlite_export_service_internal::BoundParam<std::string_view>{ insert_user_stmt_,
.index = sqlite_export_service_internal::kUserDateOfBirthBindIndex, sqlite_export_service_internal::BoundParam<std::string_view>{
.value = user.date_of_birth, .index = sqlite_export_service_internal::kUserDateOfBirthBindIndex,
.action = "Failed to bind SQLite user date of birth"}); .value = user.date_of_birth,
.action = "Failed to bind SQLite user date of birth"});
sqlite_export_service_internal::StepStatement( sqlite_export_service_internal::StepStatement(
db_handle_, insert_user_stmt_, "Failed to insert SQLite user row"); db_handle_, insert_user_stmt_, "Failed to insert SQLite user row");
const sqlite3_int64 user_id = const sqlite3_int64 user_id =
sqlite_export_service_internal::LastInsertRowId(db_handle_); sqlite_export_service_internal::LastInsertRowId(db_handle_);
sqlite_export_service_internal::ResetStatement(insert_user_stmt_); sqlite_export_service_internal::ResetStatement(insert_user_stmt_);
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_address_stmt_, insert_user_address_stmt_,
sqlite_export_service_internal::BoundParam<sqlite3_int64>{ sqlite_export_service_internal::BoundParam<sqlite3_int64>{
.index = sqlite_export_service_internal::kUserAddressUserIdBindIndex, .index = sqlite_export_service_internal::kUserAddressUserIdBindIndex,
.value = user_id, .value = user_id,
.action = "Failed to bind SQLite user address user id"}); .action = "Failed to bind SQLite user address user id"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_address_stmt_, insert_user_address_stmt_,
sqlite_export_service_internal::BoundParam<sqlite3_int64>{ sqlite_export_service_internal::BoundParam<sqlite3_int64>{
.index = sqlite_export_service_internal::kUserAddressCityIdBindIndex, .index = sqlite_export_service_internal::kUserAddressCityIdBindIndex,
.value = city_id, .value = city_id,
.action = "Failed to bind SQLite user address city id"}); .action = "Failed to bind SQLite user address city id"});
sqlite_export_service_internal::Bind( sqlite_export_service_internal::Bind(
insert_user_address_stmt_, insert_user_address_stmt_,
sqlite_export_service_internal::BoundParam<std::string_view>{ sqlite_export_service_internal::BoundParam<std::string_view>{
.index = .index =
sqlite_export_service_internal::kUserAddressPostalCodeBindIndex, sqlite_export_service_internal::kUserAddressPostalCodeBindIndex,
.value = user.address.postal_code, .value = user.address.postal_code,
.action = "Failed to bind SQLite user address postal code"}); .action = "Failed to bind SQLite user address postal code"});
sqlite_export_service_internal::StepStatement( sqlite_export_service_internal::StepStatement(
db_handle_, insert_user_address_stmt_, db_handle_, insert_user_address_stmt_,
"Failed to insert SQLite user address row"); "Failed to insert SQLite user address row");
sqlite_export_service_internal::ResetStatement(insert_user_address_stmt_); sqlite_export_service_internal::ResetStatement(insert_user_address_stmt_);
return static_cast<uint64_t>(user_id); return static_cast<uint64_t>(user_id);
} }

View File

@@ -12,7 +12,7 @@ SqliteExportService::SqliteExportService(const ApplicationOptions& options)
output_path_(options.pipeline.output_path) {} output_path_(options.pipeline.output_path) {}
SqliteExportService::~SqliteExportService() { SqliteExportService::~SqliteExportService() {
if (db_handle_ != nullptr) { if (db_handle_ != nullptr) {
RollbackAndCloseNoThrow(); RollbackAndCloseNoThrow();
} }
} }