17 ArchiveClassRegistration::ArchiveClassRegistration(
ArchiveDatabase& database,
19 : database_(database), definition_(
std::move(definition)) {
20 for (
size_t i = 0; i < definition_.members.size(); i++) {
22 column_map_[definition_.members[i]] = i + 1;
24 is_valid_ = CreateTable();
27 const std::string& ArchiveClassRegistration::GetClassName()
const {
28 return definition_.table_name;
31 size_t ArchiveClassRegistration::GetMemberCount()
const {
32 return column_map_.size();
35 bool ArchiveClassRegistration::IsValid()
const {
39 std::optional<size_t> ArchiveClassRegistration::FindColumnIndex(
40 const std::string& member)
const {
41 auto found = column_map_.find(member);
42 if (found == column_map_.end()) {
44 << definition_.table_name
45 <<
"'. Did you forget to register it?";
51 bool ArchiveClassRegistration::CreateTable() {
52 if (definition_.table_name.empty() || definition_.members.empty()) {
56 std::stringstream stream;
62 stream <<
"CREATE TABLE IF NOT EXISTS " << definition_.table_name <<
" ("
65 for (
size_t i = 0, columns = definition_.members.size(); i < columns; i++) {
66 stream << definition_.members[i];
67 if (i != columns - 1) {
73 auto statement = database_.CreateStatement(stream.str());
75 if (!statement.IsValid()) {
79 if (!statement.Reset()) {
83 return statement.Execute() == ArchiveStatement::Result::kDone;
88 std::stringstream stream;
90 for (
size_t i = 0, columns = definition_.members.size(); i < columns; i++) {
91 stream << definition_.members[i];
92 if (i != columns - 1) {
96 stream <<
" FROM " << definition_.table_name;
106 return database_.CreateStatement(stream.str());
110 std::stringstream stream;
111 stream <<
"INSERT OR REPLACE INTO " << definition_.table_name
113 for (
size_t i = 0, columns = definition_.members.size(); i < columns; i++) {
115 if (i != columns - 1) {
121 return database_.CreateStatement(stream.str());