1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
| mkdir sqlpp11_demo && cd sqlpp11_demo
git init
git submodule add https://github.com/mariadb-corporation/mariadb-connector-c.git contrib/mariadb-connector-c git submodule add https://github.com/rbock/sqlpp11.git contrib/sqlpp11 git submodule update --init --recursive
cat > CMakeLists.txt << 'EOF' cmake_minimum_required(VERSION 3.20)
project(sqlpp11_demo)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True)
add_executable(${PROJECT_NAME} main.cpp)
target_compile_options(${PROJECT_NAME} PRIVATE -static-libstdc++) target_link_options(${PROJECT_NAME} PRIVATE -static-libstdc++)
add_subdirectory(contrib/sqlpp11) add_subdirectory(contrib/mariadb-connector-c)
target_include_directories (${PROJECT_NAME} PUBLIC "${CMAKE_SOURCE_DIR}/contrib/mariadb-connector-c/include") target_include_directories (${PROJECT_NAME} PUBLIC "${CMAKE_BINARY_DIR}/contrib/mariadb-connector-c/include")
target_link_libraries(${PROJECT_NAME} sqlpp11 mariadbclient) EOF
cat > users.ddl << 'EOF' CREATE TABLE users ( id BIGINT NOT NULL, first_name VARCHAR(16) NOT NULL, last_name VARCHAR(16) NOT NULL, age SMALLINT NOT NULL, PRIMARY KEY(id) ); EOF
contrib/sqlpp11/scripts/ddl2cpp users.ddl users Test
cat > main.cpp << 'EOF'
struct on_duplicate_key_update { std::string _serialized;
template <typename Db, typename Assignment> on_duplicate_key_update(Db& db, Assignment assignment) { typename Db::_serializer_context_t context{db}; _serialized = " ON DUPLICATE KEY UPDATE " + serialize(assignment, context).str(); }
template <typename Db, typename Assignment> auto operator()(Db& db, Assignment assignment) -> on_duplicate_key_update& { typename Db::_serializer_context_t context{db}; _serialized += ", " + serialize(assignment, context).str(); return *this; }
auto get() const -> sqlpp::verbatim_t<::sqlpp::no_value_t> { return ::sqlpp::verbatim(_serialized); } };
template <typename Db, typename Assignment> void print(Db& db, Assignment assignment) { typename Db::_serializer_context_t context{db}; std::cout << sqlpp::serialize(assignment, context).str() << std::endl; }
int main() { auto config = std::make_shared<sqlpp::mysql::connection_config>(); config->user = "root"; config->port = 13306; config->password = "Abcd1234"; config->database = "test"; config->host = "127.0.0.1";
auto conn_pool = std::make_shared<sqlpp::mysql::connection_pool>(config, 5);
auto db = conn_pool->get();
Test::Users users;
{ auto query = sqlpp::custom_query( sqlpp::insert_into(users).set(users.id = 10000001, users.firstName = "Emma", users.lastName = "Watson", users.age = 15), on_duplicate_key_update(db, users.firstName = "Emma")(db, users.lastName = "Watson")(db, users.age = 15) .get()); print(db, query); db(query); }
{ auto query = sqlpp::custom_query( sqlpp::insert_into(users).set(users.id = 10000002, users.firstName = "Leo", users.lastName = "Grant", users.age = 18), on_duplicate_key_update(db, users.firstName = "Leo")(db, users.lastName = "Grant")(db, users.age = 18) .get()); print(db, query); db(query); }
{ auto query = select(sqlpp::all_of(users)).from(users).unconditionally(); print(db, query); for (const auto& row : db(query)) { std::cout << " -> id=" << row.id << ", firstName=" << row.firstName << ", lastName=" << row.lastName << ", age=" << row.age << std::endl; } }
{ auto query = select(sqlpp::all_of(users)).from(users).where(users.age <= 20); print(db, query); for (const auto& row : db(query)) { std::cout << " -> id=" << row.id << ", firstName=" << row.firstName << ", lastName=" << row.lastName << ", age=" << row.age << std::endl; } }
{ auto query = sqlpp::remove_from(users).where(users.id == 10000001); print(db, query); db(query); }
return 0; } EOF
# compile and run cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON && cmake --build build -j 64
|