From c75cc00845b55ada676c471a8f5256e13b478a40 Mon Sep 17 00:00:00 2001 From: Jacyking <791026912@qq.com> Date: Tue, 18 Jun 2024 10:37:33 +0800 Subject: [PATCH 1/3] change is_char_array_v to iguana::array_v --- ormpp/mysql.hpp | 12 +++++++++--- ormpp/postgresql.hpp | 8 ++++---- ormpp/sqlite.hpp | 14 +++++++------- ormpp/utility.hpp | 10 +--------- tests/test_ormpp.cpp | 15 ++++++++------- 5 files changed, 29 insertions(+), 30 deletions(-) diff --git a/ormpp/mysql.hpp b/ormpp/mysql.hpp index 69eaae1..afd9aac 100644 --- a/ormpp/mysql.hpp +++ b/ormpp/mysql.hpp @@ -177,7 +177,13 @@ class mysql { param.buffer = (void *)(value.c_str()); param.buffer_length = (unsigned long)value.size(); } - else if constexpr (std::is_same_v || is_char_array_v) { + else if constexpr (iguana::array_v) { + param.buffer_type = MYSQL_TYPE_STRING; + param.buffer = (void *)(value.data()); + param.buffer_length = (unsigned long)value.size(); + } + else if constexpr (iguana::c_array_v || + std::is_same_v) { param.buffer_type = MYSQL_TYPE_STRING; param.buffer = (void *)(value); param.buffer_length = (unsigned long)strlen(value); @@ -221,7 +227,7 @@ class mysql { param_bind.buffer = &(mp.rbegin()->second[0]); param_bind.buffer_length = 65536; } - else if constexpr (is_char_array_v) { + else if constexpr (iguana::array_v) { param_bind.buffer_type = MYSQL_TYPE_VAR_STRING; std::vector tmp(sizeof(U), 0); mp.emplace(i, std::move(tmp)); @@ -262,7 +268,7 @@ class mysql { auto &vec = mp[i]; value = std::string(&vec[0], strlen(vec.data())); } - else if constexpr (is_char_array_v) { + else if constexpr (iguana::array_v) { auto &vec = mp[i]; memcpy(value, vec.data(), vec.size()); } diff --git a/ormpp/postgresql.hpp b/ormpp/postgresql.hpp index 16c8819..49574f5 100644 --- a/ormpp/postgresql.hpp +++ b/ormpp/postgresql.hpp @@ -708,13 +708,13 @@ class postgresql { sprintf(temp.data(), "%f", value); param_values.push_back(std::move(temp)); } - else if constexpr (std::is_same_v) { + else if constexpr (iguana::array_v || std::is_same_v) { std::vector temp = {}; std::copy(value.data(), value.data() + value.size() + 1, std::back_inserter(temp)); param_values.push_back(std::move(temp)); } - else if constexpr (is_char_array_v) { + else if constexpr (iguana::c_array_v) { std::vector temp = {}; std::copy(value, value + sizeof(U), std::back_inserter(temp)); param_values.push_back(std::move(temp)); @@ -749,10 +749,10 @@ class postgresql { else if constexpr (std::is_floating_point_v) { value = std::atof(PQgetvalue(res_, row, i)); } - else if constexpr (std::is_same_v) { + else if constexpr (iguana::array_v || std::is_same_v) { value = PQgetvalue(res_, row, i); } - else if constexpr (is_char_array_v) { + else if constexpr (iguana::c_array_v) { auto p = PQgetvalue(res_, row, i); memcpy(value, p, sizeof(U)); } diff --git a/ormpp/sqlite.hpp b/ormpp/sqlite.hpp index 533398a..fb29b0d 100644 --- a/ormpp/sqlite.hpp +++ b/ormpp/sqlite.hpp @@ -562,19 +562,16 @@ class sqlite { else if constexpr (std::is_floating_point_v) { return SQLITE_OK == sqlite3_bind_double(stmt_, i, value); } - else if constexpr (std::is_same_v) { + else if constexpr (iguana::array_v || std::is_same_v) { return SQLITE_OK == sqlite3_bind_text(stmt_, i, value.data(), value.size(), nullptr); } - else if constexpr (std::is_same_v || + std::is_same_v>>) { return SQLITE_OK == sqlite3_bind_text(stmt_, i, value, strlen(value), nullptr); } - else if constexpr (is_char_array_v) { - return SQLITE_OK == - sqlite3_bind_text(stmt_, i, value, sizeof(U), nullptr); - } #ifdef ORMPP_WITH_CSTRING else if constexpr (std::is_same_v) { return SQLITE_OK == sqlite3_bind_text(stmt_, i, value.GetString(), @@ -621,7 +618,10 @@ class sqlite { value.assign((const char *)sqlite3_column_text(stmt_, i), (size_t)sqlite3_column_bytes(stmt_, i)); } - else if constexpr (is_char_array_v) { + else if constexpr (iguana::array_v) { + memcpy(value.data(), sqlite3_column_text(stmt_, i), sizeof(U)); + } + else if constexpr (iguana::c_array_v) { memcpy(value, sqlite3_column_text(stmt_, i), sizeof(U)); } #ifdef ORMPP_WITH_CSTRING diff --git a/ormpp/utility.hpp b/ormpp/utility.hpp index 33e8842..e615d45 100644 --- a/ormpp/utility.hpp +++ b/ormpp/utility.hpp @@ -7,6 +7,7 @@ #include "entity.hpp" #include "iguana/reflection.hpp" +#include "iguana/util.hpp" #include "type_mapping.hpp" namespace ormpp { @@ -404,15 +405,6 @@ inline std::string generate_update_sql(Args &&...args) { inline bool is_empty(const std::string &t) { return t.empty(); } -template -constexpr bool is_char_array_v = std::is_array_v - &&std::is_same_v>>; - -template -inline constexpr size_t char_array_size(char (&)[N]) { - return N; -} - template inline std::string generate_delete_sql(Args &&...where_conditon) { std::string sql = "delete from "; diff --git a/tests/test_ormpp.cpp b/tests/test_ormpp.cpp index 72603bb..32e0a4d 100644 --- a/tests/test_ormpp.cpp +++ b/tests/test_ormpp.cpp @@ -52,8 +52,9 @@ struct simple { int id; double code; int age; + std::array arr; }; -REFLECTION(simple, id, code, age) +REFLECTION(simple, id, code, age, arr) // TEST_CASE(mysql performance){ // dbng mysql; @@ -760,16 +761,16 @@ TEST_CASE("delete") { TEST_CASE("query") { ormpp_key key{"id"}; - simple s1 = {1, 2.5, 3}; - simple s2 = {2, 3.5, 4}; - simple s3 = {3, 4.5, 5}; + simple s1 = {1, 2.5, 3, {"s1"}}; + simple s2 = {2, 3.5, 4, {"s2"}}; + simple s3 = {3, 4.5, 5, {"s3"}}; std::vector v{s1, s2, s3}; #ifdef ORMPP_ENABLE_MYSQL dbng mysql; if (mysql.connect(ip, username, password, db)) { + mysql.execute("drop table if exists simple"); mysql.create_datatable(key); - mysql.delete_records(); CHECK(mysql.insert(v) == 3); auto vec1 = mysql.query(); CHECK(vec1.size() == 3); @@ -781,8 +782,8 @@ TEST_CASE("query") { #ifdef ORMPP_ENABLE_PG dbng postgres; if (postgres.connect(ip, username, password, db)) { + postgres.execute("drop table if exists simple"); postgres.create_datatable(key); - postgres.delete_records(); CHECK(postgres.insert(v) == 3); auto vec1 = postgres.query(); CHECK(vec1.size() == 3); @@ -794,8 +795,8 @@ TEST_CASE("query") { #ifdef ORMPP_ENABLE_SQLITE3 dbng sqlite; if (sqlite.connect(db)) { + sqlite.execute("drop table if exists simple"); sqlite.create_datatable(key); - sqlite.delete_records(); CHECK(sqlite.insert(v) == 3); auto vec1 = sqlite.query(); CHECK(vec1.size() == 3); From 97189273ae6d105ff550ef8079a3847adec876ae Mon Sep 17 00:00:00 2001 From: Jacyking <791026912@qq.com> Date: Tue, 18 Jun 2024 11:14:02 +0800 Subject: [PATCH 2/3] change is_char_array_v to iguana::array_v --- ormpp/mysql.hpp | 2 +- ormpp/postgresql.hpp | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ormpp/mysql.hpp b/ormpp/mysql.hpp index afd9aac..a501577 100644 --- a/ormpp/mysql.hpp +++ b/ormpp/mysql.hpp @@ -270,7 +270,7 @@ class mysql { } else if constexpr (iguana::array_v) { auto &vec = mp[i]; - memcpy(value, vec.data(), vec.size()); + memcpy(value.data(), vec.data(), value.size()); } else if constexpr (std::is_same_v) { auto &vec = mp[i]; diff --git a/ormpp/postgresql.hpp b/ormpp/postgresql.hpp index 49574f5..0853e14 100644 --- a/ormpp/postgresql.hpp +++ b/ormpp/postgresql.hpp @@ -708,7 +708,7 @@ class postgresql { sprintf(temp.data(), "%f", value); param_values.push_back(std::move(temp)); } - else if constexpr (iguana::array_v || std::is_same_v) { + else if constexpr (std::is_same_v) { std::vector temp = {}; std::copy(value.data(), value.data() + value.size() + 1, std::back_inserter(temp)); @@ -719,6 +719,10 @@ class postgresql { std::copy(value, value + sizeof(U), std::back_inserter(temp)); param_values.push_back(std::move(temp)); } + else if constexpr (iguana::array_v) { + auto p = PQgetvalue(res_, row, i); + memcpy(value.data(), p, value.size()); + } else { static_assert(!sizeof(U), "this type has not supported yet"); } From 6d840f114fed82d4adc6ddc53738b7736afd0dfd Mon Sep 17 00:00:00 2001 From: Jacyking <791026912@qq.com> Date: Tue, 18 Jun 2024 11:24:14 +0800 Subject: [PATCH 3/3] change is_char_array_v to iguana::array_v --- ormpp/postgresql.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ormpp/postgresql.hpp b/ormpp/postgresql.hpp index 0853e14..ac104c5 100644 --- a/ormpp/postgresql.hpp +++ b/ormpp/postgresql.hpp @@ -708,7 +708,7 @@ class postgresql { sprintf(temp.data(), "%f", value); param_values.push_back(std::move(temp)); } - else if constexpr (std::is_same_v) { + else if constexpr (iguana::array_v || std::is_same_v) { std::vector temp = {}; std::copy(value.data(), value.data() + value.size() + 1, std::back_inserter(temp)); @@ -719,10 +719,6 @@ class postgresql { std::copy(value, value + sizeof(U), std::back_inserter(temp)); param_values.push_back(std::move(temp)); } - else if constexpr (iguana::array_v) { - auto p = PQgetvalue(res_, row, i); - memcpy(value.data(), p, value.size()); - } else { static_assert(!sizeof(U), "this type has not supported yet"); } @@ -753,13 +749,17 @@ class postgresql { else if constexpr (std::is_floating_point_v) { value = std::atof(PQgetvalue(res_, row, i)); } - else if constexpr (iguana::array_v || std::is_same_v) { + else if constexpr (std::is_same_v) { value = PQgetvalue(res_, row, i); } else if constexpr (iguana::c_array_v) { auto p = PQgetvalue(res_, row, i); memcpy(value, p, sizeof(U)); } + else if constexpr (iguana::array_v) { + auto p = PQgetvalue(res_, row, i); + memcpy(value.data(), p, value.size()); + } else { static_assert(!sizeof(U), "this type has not supported yet"); }