summaryrefslogtreecommitdiff
path: root/slicer/db
diff options
context:
space:
mode:
Diffstat (limited to 'slicer/db')
-rw-r--r--slicer/db/sqlInsertSerializer.cpp7
-rw-r--r--slicer/db/sqlSelectDeserializer.cpp58
-rw-r--r--slicer/db/sqlTablePatchSerializer.cpp17
-rw-r--r--slicer/db/sqlUpdateSerializer.cpp7
4 files changed, 49 insertions, 40 deletions
diff --git a/slicer/db/sqlInsertSerializer.cpp b/slicer/db/sqlInsertSerializer.cpp
index c99df57..0881a1b 100644
--- a/slicer/db/sqlInsertSerializer.cpp
+++ b/slicer/db/sqlInsertSerializer.cpp
@@ -49,9 +49,10 @@ namespace Slicer {
void
SqlInsertSerializer::SerializeSequence(ModelPartParam mp) const
{
- auto ins = createInsert(mp->GetContainedModelPart());
- mp->OnEachChild([&ins, this](auto &&, auto && cmp, auto &&) {
- bindObjectAndExecute(cmp, ins.get());
+ mp->OnContained([this, mp](auto && cmp) {
+ mp->OnEachChild([ins = createInsert(cmp), this](auto &&, auto && chmp, auto &&) {
+ bindObjectAndExecute(chmp, ins.get());
+ });
});
}
diff --git a/slicer/db/sqlSelectDeserializer.cpp b/slicer/db/sqlSelectDeserializer.cpp
index 526f4b7..e11493e 100644
--- a/slicer/db/sqlSelectDeserializer.cpp
+++ b/slicer/db/sqlSelectDeserializer.cpp
@@ -47,10 +47,11 @@ namespace Slicer {
return;
}
if (!(*cmd)[0].isNull()) {
- auto fmp = mp->GetAnonChild();
- fmp->Create();
- fmp->SetValue(SqlSource((*cmd)[0]));
- fmp->Complete();
+ mp->OnAnonChild([this](auto && fmp, auto &&) {
+ fmp->Create();
+ fmp->SetValue(SqlSource((*cmd)[0]));
+ fmp->Complete();
+ });
}
if (cmd->fetch()) {
throw TooManyRowsReturned();
@@ -60,10 +61,11 @@ namespace Slicer {
void
SqlSelectDeserializer::DeserializeSequence(ModelPartParam omp)
{
- auto mp = omp->GetAnonChild();
- while (cmd->fetch()) {
- DeserializeRow(mp);
- }
+ omp->OnAnonChild([this](auto && mp, auto &&) {
+ while (cmd->fetch()) {
+ DeserializeRow(mp);
+ }
+ });
}
void
@@ -85,29 +87,33 @@ namespace Slicer {
void
SqlSelectDeserializer::DeserializeRow(ModelPartParam mp)
{
- auto rmp = mp->GetAnonChild();
- if (rmp) {
+ mp->OnAnonChild([this](auto && rmp, auto &&) {
switch (rmp->GetType()) {
case Slicer::ModelPartType::Complex: {
+ auto apply = [this](auto && rcmp) {
+ rcmp->Create();
+ for (auto col = 0U; col < columnCount; col += 1) {
+ const DB::Column & c = (*cmd)[col];
+ if (!c.isNull()) {
+ rcmp->OnChild(
+ [&c](auto && fmp, auto &&) {
+ if (fmp) {
+ fmp->Create();
+ fmp->SetValue(SqlSource(c));
+ fmp->Complete();
+ }
+ },
+ c.name, nullptr, false);
+ }
+ }
+ rcmp->Complete();
+ };
if (typeIdColIdx) {
std::string subclass;
(*cmd)[*typeIdColIdx] >> subclass;
- rmp = rmp->GetSubclassModelPart(subclass);
- }
- rmp->Create();
- for (auto col = 0U; col < columnCount; col += 1) {
- const DB::Column & c = (*cmd)[col];
- if (!c.isNull()) {
- auto fmpr = rmp->GetChildRef(c.name, nullptr, false);
- if (fmpr) {
- auto fmp = fmpr.Child();
- fmp->Create();
- fmp->SetValue(SqlSource(c));
- fmp->Complete();
- }
- }
+ return rmp->OnSubclass(apply, subclass);
}
- rmp->Complete();
+ apply(rmp);
} break;
case Slicer::ModelPartType::Simple: {
rmp->Create();
@@ -120,6 +126,6 @@ namespace Slicer {
default:
throw UnsupportedModelType();
}
- }
+ });
}
}
diff --git a/slicer/db/sqlTablePatchSerializer.cpp b/slicer/db/sqlTablePatchSerializer.cpp
index da5b0b2..ec0e344 100644
--- a/slicer/db/sqlTablePatchSerializer.cpp
+++ b/slicer/db/sqlTablePatchSerializer.cpp
@@ -32,14 +32,15 @@ namespace Slicer {
SqlInsertSerializer ins(db, tablePatch.src);
ins.Serialize(mpr);
- auto mp = mpr->GetContainedModelPart();
- mp->OnEachChild([this](const auto & name, const auto &, const auto & h) {
- if (isPKey(h)) {
- tablePatch.pk.insert(name);
- }
- if (isBind(h)) {
- tablePatch.cols.insert(name);
- }
+ mpr->OnContained([this](auto && mp) {
+ mp->OnEachChild([this](const auto & name, const auto &, const auto & h) {
+ if (isPKey(h)) {
+ tablePatch.pk.insert(name);
+ }
+ if (isBind(h)) {
+ tablePatch.cols.insert(name);
+ }
+ });
});
db->patchTable(&tablePatch);
diff --git a/slicer/db/sqlUpdateSerializer.cpp b/slicer/db/sqlUpdateSerializer.cpp
index c054764..152c923 100644
--- a/slicer/db/sqlUpdateSerializer.cpp
+++ b/slicer/db/sqlUpdateSerializer.cpp
@@ -49,9 +49,10 @@ namespace Slicer {
void
SqlUpdateSerializer::SerializeSequence(ModelPartParam mp) const
{
- auto ins = createUpdate(mp->GetContainedModelPart());
- mp->OnEachChild([&ins](auto &&, auto && cmp, auto &&) {
- bindObjectAndExecute(cmp, ins.get());
+ mp->OnContained([this, mp](auto && cmp) {
+ mp->OnEachChild([upd = createUpdate(cmp)](auto &&, auto && chmp, auto &&) {
+ bindObjectAndExecute(chmp, upd.get());
+ });
});
}