diff --git a/src/common/db.cpp b/src/common/db.cpp index 85d6142..503d25f 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -18,7 +18,8 @@ #include "db.h" -#include +#include "buffer.h" +#include "common.h" std::string getSqlType(FieldType type) { @@ -91,7 +92,7 @@ void value::load_fields(const tab &tab, buffer &b) while (!data.eof()) { field_value fv; - READ(data, fv.field_id); + READ(data, fv.field_id); READ(data, fv.size); auto i = tab.fields.find(fv.field_id); if (i == tab.fields.end()) @@ -146,3 +147,45 @@ void db::open(const path &p) for (auto &v : values) v.load_fields(t, b); } + +polygon4::tools::db::processed_db db::process() const +{ + auto process_string = [](const auto &s) + { + return str2utf8(s); + }; + + polygon4::tools::db::processed_db pdb; + for (auto &v : values) + { + auto tbl = t.tables.find(v.table_id); + if (tbl == t.tables.end()) + continue; + polygon4::tools::db::record r; + for (auto &f : v.fields) + { + auto fld = t.fields.find(f.field_id); + if (fld == t.fields.end()) + continue; + auto name = process_string(fld->second.name); + switch (fld->second.type) + { + case FieldType::String: + r[name] = process_string(f.s.c_str()); + break; + case FieldType::Integer: + r[name] = f.i; + break; + case FieldType::Float: + r[name] = f.f; + break; + default: + assert(false); + } + } + auto table_name = process_string(tbl->second.name); + auto row_name = process_string(v.name); + pdb[table_name][row_name] = r; + } + return pdb; +} diff --git a/src/common/db.h b/src/common/db.h index 33659b8..2dc2f72 100644 --- a/src/common/db.h +++ b/src/common/db.h @@ -90,6 +90,14 @@ struct value void load_fields(const tab &tab, buffer &b); }; +namespace polygon4::tools::db +{ + using value = std::variant; + using record = std::map; + using table = std::map; + using processed_db = std::map; +}; + struct db { uint32_t number_of_values = 0; @@ -99,4 +107,5 @@ struct db void load(const buffer &b); void open(const path &basename); + polygon4::tools::db::processed_db process() const; };