diff --git a/CMakeLists.txt b/CMakeLists.txt index f5dd4c0f..4e1381dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,8 @@ include(cmake/dependency.cmake) if (ENABLE_MYSQL) include_directories(${MYSQL_INCLUDE_DIR} include) +elseif(ENABLE_MARIADB) + include_directories(${MARIADB_INCLUDE_DIR} include) else() include_directories(include) endif() diff --git a/cmake/develop.cmake b/cmake/develop.cmake index d207c010..04bd3901 100644 --- a/cmake/develop.cmake +++ b/cmake/develop.cmake @@ -69,12 +69,19 @@ if (ENABLE_MYSQL) add_definitions(-DORMPP_ENABLE_MYSQL) endif() +option(ENABLE_MARIADB "Enable mariadb" OFF) +if (ENABLE_MARIADB) + include(cmake/mariadb.cmake) + message(STATUS "ENABLE_MARIADB") + add_definitions(-DORMPP_ENABLE_MYSQL) +endif() + option(ENABLE_PG "Enable pg" OFF) if (ENABLE_PG) message(STATUS "ENABLE_PG") add_definitions(-DORMPP_ENABLE_PG) endif() -if (NOT ENABLE_SQLITE3 AND NOT ENABLE_MYSQL AND NOT ENABLE_PG) -message(FATAL_ERROR "please enable a option") +if (NOT ENABLE_SQLITE3 AND NOT ENABLE_MYSQL AND NOT ENABLE_MARIADB AND NOT ENABLE_PG) +message(FATAL_ERROR "please enable a option, ENABLE_SQLITE3 or ENABLE_MYSQL or ENABLE_MARIADB or ENABLE_PG") endif() \ No newline at end of file diff --git a/cmake/mariadb.cmake b/cmake/mariadb.cmake new file mode 100644 index 00000000..27af23c0 --- /dev/null +++ b/cmake/mariadb.cmake @@ -0,0 +1,63 @@ +# - Find mariadb +# Find the native MariaDB includes and library +# +# MARIADB_INCLUDE_DIR - where to find mysql.h, etc. +# MARIADB_LIBRARIES - List of libraries when using MariaDB. +# MARIADB_FOUND - True if MariaDB found. + +IF (MARIADB_INCLUDE_DIR) + # Already in cache, be silent + SET(MARIADB_FIND_QUIETLY TRUE) +ENDIF (MARIADB_INCLUDE_DIR) + +IF (UNIX) + FIND_PATH(MARIADB_INCLUDE_DIR mysql.h + /usr/local/include/mariadb + /usr/include/mariadb + ) +ELSEIF (WIN32) + FIND_PATH(MARIADB_INCLUDE_DIR mysql.h + $ENV{PROGRAMFILES}/MariaDB*/include + $ENV{SYSTEMDRIVE}/MariaDB*/include + ) +ENDIF() + +SET(MARIADB_NAMES mariadb) +IF (UNIX) + FIND_LIBRARY(MARIADB_LIBRARY + NAMES ${MARIADB_NAMES} + PATHS /usr/lib /usr/local/lib + PATH_SUFFIXES mariadb + ) +ELSEIF (WIN32) + FIND_LIBRARY(MARIADB_LIBRARY + NAMES ${MARIADB_NAMES} + PATHS $ENV{PROGRAMFILES}/MariaDB*/lib + $ENV{SYSTEMDRIVE}/MariaDB*/lib + PATH_SUFFIXES mariadb + ) +ENDIF() + +IF (MARIADB_INCLUDE_DIR AND MARIADB_LIBRARY) + SET(MARIADB_FOUND TRUE) + SET( MARIADB_LIBRARY ${MARIADB_LIBRARY} ) +ELSE (MARIADB_INCLUDE_DIR AND MARIADB_LIBRARY) + SET(MARIADB_FOUND FALSE) + SET( MARIADB_LIBRARY ) +ENDIF (MARIADB_INCLUDE_DIR AND MARIADB_LIBRARY) + +IF (MARIADB_FOUND) + #IF (NOT MARIADB_FIND_QUIETLY) + MESSAGE(STATUS "Found MariaDB: ${MARIADB_LIBRARY}") + #ENDIF (NOT MARIADB_FIND_QUIETLY) +ELSE (MARIADB_FOUND) + IF (MARIADB_FIND_REQUIRED) + MESSAGE(STATUS "Looked for MariaDB libraries named ${MARIADB_NAMES}.") + MESSAGE(FATAL_ERROR "Could NOT find MariaDB library") + ENDIF (MARIADB_FIND_REQUIRED) +ENDIF (MARIADB_FOUND) + +MARK_AS_ADVANCED( + MARIADB_LIBRARY + MARIADB_INCLUDE_DIR + ) \ No newline at end of file diff --git a/cmake/mysql.cmake b/cmake/mysql.cmake index 539f3284..68c847fc 100644 --- a/cmake/mysql.cmake +++ b/cmake/mysql.cmake @@ -10,17 +10,33 @@ IF (MYSQL_INCLUDE_DIR) SET(MYSQL_FIND_QUIETLY TRUE) ENDIF (MYSQL_INCLUDE_DIR) -FIND_PATH(MYSQL_INCLUDE_DIR mysql.h - /usr/local/include/mysql - /usr/include/mysql -) +IF (UNIX) + FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + /usr/local/include/mysql + /usr/include/mysql + ) +ELSEIF (WIN32) + FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + $ENV{PROGRAMFILES}/MySQL/*/include + $ENV{SYSTEMDRIVE}/MySQL/*/include + ) +ENDIF() SET(MYSQL_NAMES mysqlclient mysqlclient_r) -FIND_LIBRARY(MYSQL_LIBRARY - NAMES ${MYSQL_NAMES} - PATHS /usr/lib /usr/local/lib - PATH_SUFFIXES mysql -) +IF (UNIX) + FIND_LIBRARY(MYSQL_LIBRARY + NAMES ${MYSQL_NAMES} + PATHS /usr/lib /usr/local/lib + PATH_SUFFIXES mysql + ) +ELSEIF (WIN32) + FIND_LIBRARY(MYSQL_LIBRARY + NAMES ${MYSQL_NAMES} + PATHS $ENV{PROGRAMFILES}/MySQL/*/lib + $ENV{SYSTEMDRIVE}/MySQL/*/lib + PATH_SUFFIXES mysql + ) +ENDIF() IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) SET(MYSQL_FOUND TRUE) diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index fadaef43..b7e1d656 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -13,6 +13,10 @@ if (ENABLE_MYSQL) endif() endif() +if (ENABLE_MARIADB) + target_link_libraries(${PROJECT_NAME} ${MARIADB_LIBRARY}) +endif() + if (ENABLE_SQLITE3) target_link_libraries(${PROJECT_NAME} sqlite3) endif() diff --git a/include/mysql.hpp b/include/mysql.hpp index a830842f..b39a661b 100644 --- a/include/mysql.hpp +++ b/include/mysql.hpp @@ -82,7 +82,7 @@ class mysql { reset_error(); std::string sql = generate_createtb_sql(std::forward(args)...); sql += " DEFAULT CHARSET=utf8"; -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif if (mysql_query(con_, sql.data())) { @@ -136,7 +136,7 @@ class mysql { bool delete_records(Args &&...where_conditon) { reset_error(); auto sql = generate_delete_sql(std::forward(where_conditon)...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif if (mysql_query(con_, sql.data())) { @@ -158,7 +158,7 @@ class mysql { constexpr auto SIZE = std::tuple_size_v; std::string sql = s; -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif constexpr auto Args_Size = sizeof...(Args); @@ -344,9 +344,9 @@ class mysql { return v; } - template + template void set_param_bind(MYSQL_BIND ¶m_bind, T &&value, int i, - std::map> &mp, bool &is_null) { + std::map> &mp, B &is_null) { using U = std::remove_const_t>; if constexpr (is_optional_v::value) { return set_param_bind(param_bind, *value, i, mp, is_null); @@ -377,7 +377,7 @@ class mysql { param_bind.buffer = &(mp.rbegin()->second[0]); param_bind.buffer_length = 65536; } - param_bind.is_null = &is_null; + param_bind.is_null = (B)&is_null; } template @@ -417,7 +417,7 @@ class mysql { Args &&...args) { reset_error(); std::string sql = generate_query_sql(args...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif constexpr auto SIZE = iguana::get_value(); @@ -435,9 +435,9 @@ class mysql { return {}; } + std::array().is_null), SIZE> nulls = {}; std::array param_binds = {}; std::map> mp; - std::array nulls = {}; std::vector v; T t{}; @@ -743,7 +743,7 @@ class mysql { template int insert_impl(const std::string &sql, const T &t, bool get_insert_id = false, Args &&...args) { -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif stmt_ = mysql_stmt_init(con_); @@ -759,13 +759,13 @@ class mysql { if (stmt_execute(t) < 0) return INT_MIN; - return get_insert_id ? stmt_->insert_id : 1; + return get_insert_id ? stmt_->mysql->insert_id : 1; } template int insert_impl(const std::string &sql, const std::vector &t, bool get_insert_id = false, Args &&...args) { -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif stmt_ = mysql_stmt_init(con_); @@ -792,7 +792,8 @@ class mysql { } b = commit(); - return b ? (get_insert_id ? stmt_->insert_id : (int)t.size()) : INT_MIN; + return b ? (get_insert_id ? stmt_->mysql->insert_id : (int)t.size()) + : INT_MIN; } template diff --git a/include/postgresql.hpp b/include/postgresql.hpp index 883ef1b0..12bf7171 100644 --- a/include/postgresql.hpp +++ b/include/postgresql.hpp @@ -65,7 +65,7 @@ class postgresql { // PQclear(res_); std::string sql = generate_createtb_sql(std::forward(args)...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif res_ = PQexec(con_, sql.data()); @@ -176,7 +176,7 @@ class postgresql { constexpr std::enable_if_t, std::vector> query( Args &&...args) { std::string sql = generate_query_sql(std::forward(args)...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif constexpr auto SIZE = iguana::get_value(); @@ -213,7 +213,7 @@ class postgresql { constexpr auto SIZE = std::tuple_size_v; std::string sql = s; -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif constexpr auto Args_Size = sizeof...(Args); @@ -265,7 +265,7 @@ class postgresql { template constexpr bool delete_records(Args &&...where_conditon) { auto sql = generate_delete_sql(std::forward(where_conditon)...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif res_ = PQexec(con_, sql.data()); @@ -515,7 +515,7 @@ class postgresql { template constexpr int insert_impl(const std::string &sql, const T &t, Args &&...args) { -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif std::vector> param_values; diff --git a/include/sqlite.hpp b/include/sqlite.hpp index 6d00338e..3586e3cd 100644 --- a/include/sqlite.hpp +++ b/include/sqlite.hpp @@ -58,7 +58,7 @@ class sqlite { // } std::string sql = generate_createtb_sql(std::forward(args)...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif if (sqlite3_exec(handle_, sql.data(), nullptr, nullptr, nullptr) != @@ -108,7 +108,7 @@ class sqlite { template bool delete_records(Args &&...where_conditon) { auto sql = generate_delete_sql(std::forward(where_conditon)...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif if (sqlite3_exec(handle_, sql.data(), nullptr, nullptr, nullptr) != @@ -126,7 +126,7 @@ class sqlite { std::enable_if_t, std::vector> query( Args &&...args) { std::string sql = generate_query_sql(args...); -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif int result = sqlite3_prepare_v2(handle_, sql.data(), (int)sql.size(), @@ -165,7 +165,7 @@ class sqlite { constexpr auto SIZE = std::tuple_size_v; std::string sql = s; -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif constexpr auto Args_Size = sizeof...(Args); @@ -440,7 +440,7 @@ class sqlite { template int insert_impl(bool is_update, const std::string &sql, const T &t, bool get_insert_id = false, Args &&...args) { -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif int result = sqlite3_prepare_v2(handle_, sql.data(), (int)sql.size(), @@ -489,7 +489,7 @@ class sqlite { int insert_impl(bool is_update, const std::string &sql, const std::vector &v, bool get_insert_id = false, Args &&...args) { -#if ORMPP_ENABLE_LOG +#ifdef ORMPP_ENABLE_LOG std::cout << sql << std::endl; #endif int result = sqlite3_prepare_v2(handle_, sql.data(), (int)sql.size(), diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2ac72a8d..c9ec1583 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,6 +14,10 @@ if (ENABLE_MYSQL) endif() endif() +if (ENABLE_MARIADB) + target_link_libraries(${PROJECT_NAME} ${MARIADB_LIBRARY}) +endif() + if (ENABLE_SQLITE3) target_link_libraries(${PROJECT_NAME} sqlite3 doctest) endif()