From 551a6dfbeafeb7f49d76e34a0ff72cf0fe60a53d Mon Sep 17 00:00:00 2001 From: Jacyking <791026912@qq.com> Date: Wed, 12 Jun 2024 10:52:10 +0800 Subject: [PATCH 1/2] fix update_some --- ormpp/mysql.hpp | 39 ++++++++------ ormpp/postgresql.hpp | 37 ++++++++------ ormpp/sqlite.hpp | 40 +++++++-------- tests/test_ormpp.cpp | 119 ++++++++++++++++++++++++++++--------------- 4 files changed, 141 insertions(+), 94 deletions(-) diff --git a/ormpp/mysql.hpp b/ormpp/mysql.hpp index 0475b35c..69eaae1f 100644 --- a/ormpp/mysql.hpp +++ b/ormpp/mysql.hpp @@ -917,22 +917,29 @@ class mysql { int stmt_execute(const T &t, OptType type, Args &&...args) { std::vector param_binds; constexpr auto arr = iguana::indexs_of(); - iguana::for_each(t, [&t, arr, ¶m_binds, type, this](auto item, auto i) { - if (type == OptType::insert && - is_auto_key(iguana::get_name(i).data())) { - return; - } - if constexpr (sizeof...(members) > 0) { - for (auto idx : arr) { - if (idx == decltype(i)::value) { - set_param_bind(param_binds, t.*item); - } - } - } - else { - set_param_bind(param_binds, t.*item); - } - }); + if constexpr (sizeof...(members) > 0) { + (set_param_bind(param_binds, iguana::get()>(t)), + ...); + } + else { + iguana::for_each(t, + [&t, arr, ¶m_binds, type, this](auto item, auto i) { + if (type == OptType::insert && + is_auto_key(iguana::get_name(i).data())) { + return; + } + if constexpr (sizeof...(members) > 0) { + for (auto idx : arr) { + if (idx == decltype(i)::value) { + set_param_bind(param_binds, t.*item); + } + } + } + else { + set_param_bind(param_binds, t.*item); + } + }); + } if constexpr (sizeof...(Args) == 0) { if (type == OptType::update) { diff --git a/ormpp/postgresql.hpp b/ormpp/postgresql.hpp index 700e7b67..16c88196 100644 --- a/ormpp/postgresql.hpp +++ b/ormpp/postgresql.hpp @@ -525,23 +525,30 @@ class postgresql { Args &&...args) { std::vector> param_values; constexpr auto arr = iguana::indexs_of(); - iguana::for_each(t, - [&t, arr, ¶m_values, type, this](auto item, auto i) { - if (type == OptType::insert && - is_auto_key(iguana::get_name(i).data())) { - return; - } - if constexpr (sizeof...(members) > 0) { - for (auto idx : arr) { - if (idx == decltype(i)::value) { - set_param_values(param_values, t.*item); + if constexpr (sizeof...(members) > 0) { + (set_param_values(param_values, + iguana::get()>(t)), + ...); + } + else { + iguana::for_each(t, + [&t, arr, ¶m_values, type, this](auto item, auto i) { + if (type == OptType::insert && + is_auto_key(iguana::get_name(i).data())) { + return; + } + if constexpr (sizeof...(members) > 0) { + for (auto idx : arr) { + if (idx == decltype(i)::value) { + set_param_values(param_values, t.*item); + } } } - } - else { - set_param_values(param_values, t.*item); - } - }); + else { + set_param_values(param_values, t.*item); + } + }); + } if constexpr (sizeof...(Args) == 0) { if (type == OptType::update) { diff --git a/ormpp/sqlite.hpp b/ormpp/sqlite.hpp index ff03da9d..533398a8 100644 --- a/ormpp/sqlite.hpp +++ b/ormpp/sqlite.hpp @@ -490,27 +490,25 @@ class sqlite { template int stmt_execute(const T &t, OptType type, Args &&...args) { - int index = 1; + size_t index = 0; bool bind_ok = true; - constexpr auto arr = iguana::indexs_of(); - iguana::for_each( - t, [&t, arr, &bind_ok, &index, type, this](auto item, auto i) { - if ((type == OptType::insert && - is_auto_key(iguana::get_name(i).data())) || - !bind_ok) { - return; - } - if constexpr (sizeof...(members) > 0) { - for (auto idx : arr) { - if (idx == decltype(i)::value) { - bind_ok = set_param_bind(t.*item, index++); - } - } - } - else { - bind_ok = set_param_bind(t.*item, index++); - } - }); + if constexpr (sizeof...(members) > 0) { + ((bind_ok && (bind_ok = set_param_bind( + iguana::get()>(t), ++index)), + true), + ...); + } + else { + iguana::for_each(t, + [&t, &bind_ok, &index, type, this](auto item, auto i) { + if ((type == OptType::insert && + is_auto_key(iguana::get_name(i).data())) || + !bind_ok) { + return; + } + bind_ok = set_param_bind(t.*item, ++index); + }); + } if constexpr (sizeof...(Args) == 0) { if (type == OptType::update) { @@ -519,7 +517,7 @@ class sqlite { return; } if (is_conflict_key(iguana::get_name(i).data())) { - bind_ok = set_param_bind(t.*item, index++); + bind_ok = set_param_bind(t.*item, ++index); } }); } diff --git a/tests/test_ormpp.cpp b/tests/test_ormpp.cpp index 54a1aab3..b287c6ad 100644 --- a/tests/test_ormpp.cpp +++ b/tests/test_ormpp.cpp @@ -1789,28 +1789,40 @@ TEST_CASE("update section filed") { CHECK(vec2.size() == 1); CHECK(vec1.front().name == "purecpp_a"); CHECK(vec2.front().name == "purecpp_b"); - mysql.update_some<&person::name, &person::age>(person{"purecpp", 100, 1}); - mysql.update_some<&person::name, &person::age>(person{"purecpp", 200}, + mysql.update_some<&person::age, &person::name>( + person{"purecpp_aa", 111, 1}); + mysql.update_some<&person::age, &person::name>(person{"purecpp_bb", 222}, "id=2"); - auto vec = mysql.query_s(); vec1 = mysql.query_s("id=?", 1); vec2 = mysql.query_s("id=?", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); - CHECK(vec1.front().age == 100); - CHECK(vec2.front().age == 200); - CHECK(vec1.front().name == "purecpp"); - CHECK(vec2.front().name == "purecpp"); + CHECK(vec1.front().age == 111); + CHECK(vec2.front().age == 222); + CHECK(vec1.front().name == "purecpp_aa"); + CHECK(vec2.front().name == "purecpp_bb"); mysql.update_some<&person::name, &person::age>( - std::vector{{"purecpp_aa", 111, 1}, {"purecpp_bb", 222, 2}}); + person{"purecpp_aaa", 333, 1}); + mysql.update_some<&person::name, &person::age>(person{"purecpp_bbb", 444}, + "id=2"); vec1 = mysql.query_s("id=?", 1); vec2 = mysql.query_s("id=?", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); - CHECK(vec1.front().age == 111); - CHECK(vec2.front().age == 222); - CHECK(vec1.front().name == "purecpp_aa"); - CHECK(vec2.front().name == "purecpp_bb"); + CHECK(vec1.front().age == 333); + CHECK(vec2.front().age == 444); + CHECK(vec1.front().name == "purecpp_aaa"); + CHECK(vec2.front().name == "purecpp_bbb"); + mysql.update_some<&person::name, &person::age>(std::vector{ + {"purecpp_aaaa", 555, 1}, {"purecpp_bbbb", 666, 2}}); + vec1 = mysql.query_s("id=?", 1); + vec2 = mysql.query_s("id=?", 2); + CHECK(vec1.size() == 1); + CHECK(vec2.size() == 1); + CHECK(vec1.front().age == 555); + CHECK(vec2.front().age == 666); + CHECK(vec1.front().name == "purecpp_aaaa"); + CHECK(vec2.front().name == "purecpp_bbbb"); } #endif #ifdef ORMPP_ENABLE_PG @@ -1822,35 +1834,46 @@ TEST_CASE("update section filed") { postgres.insert({"person_b", 2}); postgres.update_some<&person::name>(person{"purecpp_a", 0, 1}); postgres.update_some<&person::name>(person{"purecpp_b"}, "id=2"); - auto vec1 = postgres.query_s("id=$1", 1); - auto vec2 = postgres.query_s("id=$1", 2); + auto vec1 = postgres.query_s("id=?", 1); + auto vec2 = postgres.query_s("id=?", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); CHECK(vec1.front().name == "purecpp_a"); CHECK(vec2.front().name == "purecpp_b"); - postgres.update_some<&person::name, &person::age>( - person{"purecpp", 100, 1}); - postgres.update_some<&person::name, &person::age>(person{"purecpp", 200}, + postgres.update_some<&person::age, &person::name>( + person{"purecpp_aa", 111, 1}); + postgres.update_some<&person::age, &person::name>(person{"purecpp_bb", 222}, "id=2"); - auto vec = postgres.query_s(); - vec1 = postgres.query_s("id=$1", 1); - vec2 = postgres.query_s("id=$1", 2); - CHECK(vec1.size() == 1); - CHECK(vec2.size() == 1); - CHECK(vec1.front().age == 100); - CHECK(vec2.front().age == 200); - CHECK(vec1.front().name == "purecpp"); - CHECK(vec2.front().name == "purecpp"); - postgres.update_some<&person::name, &person::age>( - std::vector{{"purecpp_aa", 111, 1}, {"purecpp_bb", 222, 2}}); - vec1 = postgres.query_s("id=$1", 1); - vec2 = postgres.query_s("id=$1", 2); + vec1 = postgres.query_s("id=?", 1); + vec2 = postgres.query_s("id=?", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); CHECK(vec1.front().age == 111); CHECK(vec2.front().age == 222); CHECK(vec1.front().name == "purecpp_aa"); CHECK(vec2.front().name == "purecpp_bb"); + postgres.update_some<&person::name, &person::age>( + person{"purecpp_aaa", 333, 1}); + postgres.update_some<&person::name, &person::age>( + person{"purecpp_bbb", 444}, "id=2"); + vec1 = postgres.query_s("id=?", 1); + vec2 = postgres.query_s("id=?", 2); + CHECK(vec1.size() == 1); + CHECK(vec2.size() == 1); + CHECK(vec1.front().age == 333); + CHECK(vec2.front().age == 444); + CHECK(vec1.front().name == "purecpp_aaa"); + CHECK(vec2.front().name == "purecpp_bbb"); + postgres.update_some<&person::name, &person::age>(std::vector{ + {"purecpp_aaaa", 555, 1}, {"purecpp_bbbb", 666, 2}}); + vec1 = postgres.query_s("id=?", 1); + vec2 = postgres.query_s("id=?", 2); + CHECK(vec1.size() == 1); + CHECK(vec2.size() == 1); + CHECK(vec1.front().age == 555); + CHECK(vec2.front().age == 666); + CHECK(vec1.front().name == "purecpp_aaaa"); + CHECK(vec2.front().name == "purecpp_bbbb"); } #endif #ifdef ORMPP_ENABLE_SQLITE3 @@ -1868,28 +1891,40 @@ TEST_CASE("update section filed") { CHECK(vec2.size() == 1); CHECK(vec1.front().name == "purecpp_a"); CHECK(vec2.front().name == "purecpp_b"); - sqlite.update_some<&person::name, &person::age>(person{"purecpp", 100, 1}); - sqlite.update_some<&person::name, &person::age>(person{"purecpp", 200}, + sqlite.update_some<&person::age, &person::name>( + person{"purecpp_aa", 111, 1}); + sqlite.update_some<&person::age, &person::name>(person{"purecpp_bb", 222}, "id=2"); - auto vec = sqlite.query_s(); vec1 = sqlite.query_s("id=?", 1); vec2 = sqlite.query_s("id=?", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); - CHECK(vec1.front().age == 100); - CHECK(vec2.front().age == 200); - CHECK(vec1.front().name == "purecpp"); - CHECK(vec2.front().name == "purecpp"); + CHECK(vec1.front().age == 111); + CHECK(vec2.front().age == 222); + CHECK(vec1.front().name == "purecpp_aa"); + CHECK(vec2.front().name == "purecpp_bb"); sqlite.update_some<&person::name, &person::age>( - std::vector{{"purecpp_aa", 111, 1}, {"purecpp_bb", 222, 2}}); + person{"purecpp_aaa", 333, 1}); + sqlite.update_some<&person::name, &person::age>(person{"purecpp_bbb", 444}, + "id=2"); vec1 = sqlite.query_s("id=?", 1); vec2 = sqlite.query_s("id=?", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); - CHECK(vec1.front().age == 111); - CHECK(vec2.front().age == 222); - CHECK(vec1.front().name == "purecpp_aa"); - CHECK(vec2.front().name == "purecpp_bb"); + CHECK(vec1.front().age == 333); + CHECK(vec2.front().age == 444); + CHECK(vec1.front().name == "purecpp_aaa"); + CHECK(vec2.front().name == "purecpp_bbb"); + sqlite.update_some<&person::name, &person::age>(std::vector{ + {"purecpp_aaaa", 555, 1}, {"purecpp_bbbb", 666, 2}}); + vec1 = sqlite.query_s("id=?", 1); + vec2 = sqlite.query_s("id=?", 2); + CHECK(vec1.size() == 1); + CHECK(vec2.size() == 1); + CHECK(vec1.front().age == 555); + CHECK(vec2.front().age == 666); + CHECK(vec1.front().name == "purecpp_aaaa"); + CHECK(vec2.front().name == "purecpp_bbbb"); } #endif } \ No newline at end of file From 52401e54ae829961fc2ca527279afb6ac48650b0 Mon Sep 17 00:00:00 2001 From: Jacyking <791026912@qq.com> Date: Wed, 12 Jun 2024 10:55:32 +0800 Subject: [PATCH 2/2] fix update_some --- tests/test_ormpp.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_ormpp.cpp b/tests/test_ormpp.cpp index b287c6ad..72603bbe 100644 --- a/tests/test_ormpp.cpp +++ b/tests/test_ormpp.cpp @@ -1834,8 +1834,8 @@ TEST_CASE("update section filed") { postgres.insert({"person_b", 2}); postgres.update_some<&person::name>(person{"purecpp_a", 0, 1}); postgres.update_some<&person::name>(person{"purecpp_b"}, "id=2"); - auto vec1 = postgres.query_s("id=?", 1); - auto vec2 = postgres.query_s("id=?", 2); + auto vec1 = postgres.query_s("id=$1", 1); + auto vec2 = postgres.query_s("id=$1", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); CHECK(vec1.front().name == "purecpp_a"); @@ -1844,8 +1844,8 @@ TEST_CASE("update section filed") { person{"purecpp_aa", 111, 1}); postgres.update_some<&person::age, &person::name>(person{"purecpp_bb", 222}, "id=2"); - vec1 = postgres.query_s("id=?", 1); - vec2 = postgres.query_s("id=?", 2); + vec1 = postgres.query_s("id=$1", 1); + vec2 = postgres.query_s("id=$1", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); CHECK(vec1.front().age == 111); @@ -1856,8 +1856,8 @@ TEST_CASE("update section filed") { person{"purecpp_aaa", 333, 1}); postgres.update_some<&person::name, &person::age>( person{"purecpp_bbb", 444}, "id=2"); - vec1 = postgres.query_s("id=?", 1); - vec2 = postgres.query_s("id=?", 2); + vec1 = postgres.query_s("id=$1", 1); + vec2 = postgres.query_s("id=$1", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); CHECK(vec1.front().age == 333); @@ -1866,8 +1866,8 @@ TEST_CASE("update section filed") { CHECK(vec2.front().name == "purecpp_bbb"); postgres.update_some<&person::name, &person::age>(std::vector{ {"purecpp_aaaa", 555, 1}, {"purecpp_bbbb", 666, 2}}); - vec1 = postgres.query_s("id=?", 1); - vec2 = postgres.query_s("id=?", 2); + vec1 = postgres.query_s("id=$1", 1); + vec2 = postgres.query_s("id=$1", 2); CHECK(vec1.size() == 1); CHECK(vec2.size() == 1); CHECK(vec1.front().age == 555);