Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
basic_usage.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2024, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
20#include <iostream>
21#include <string>
22#include <memory>
23#include <variant>
27
28using namespace database;
29
30int main() {
31 std::cout << "=== Database System - Basic Usage Example ===" << std::endl;
32
33 // 1. Database manager creation and configuration
34 std::cout << "\n1. Database Manager Setup:" << std::endl;
35
36 auto context = std::make_shared<database_context>();
37 auto db_manager = std::make_shared<database_manager>(context);
38
39 // Set database type
40 db_manager->set_mode(database_types::postgres);
41 std::cout << "Database type set to: PostgreSQL" << std::endl;
42
43 // Connection string (modify these values for your database)
44 std::string connection_string = "host=localhost port=5432 dbname=testdb user=testuser password=testpass";
45 std::cout << "Connection string configured" << std::endl;
46
47 // Note: This example shows the API usage, but requires an actual PostgreSQL server
48 std::cout << "Note: This example demonstrates API usage. Actual database connection requires PostgreSQL server." << std::endl;
49
50 // 2. Connection management
51 std::cout << "\n2. Connection Management:" << std::endl;
52
53 std::cout << "Attempting to connect to database..." << std::endl;
54 auto connect_result = db_manager->connect_result(connection_string);
55
56 if (connect_result.is_ok()) {
57 std::cout << "✓ Successfully connected to database" << std::endl;
58 std::cout << "Connection status: Connected" << std::endl;
59 std::cout << "Database type: " << static_cast<int>(db_manager->database_type()) << std::endl;
60
61 // 3. Table operations
62 std::cout << "\n3. Table Operations:" << std::endl;
63
64 // Create table
65 std::string create_table_sql = R"(
66 CREATE TABLE IF NOT EXISTS users (
67 id SERIAL PRIMARY KEY,
68 username VARCHAR(50) UNIQUE NOT NULL,
69 email VARCHAR(100) UNIQUE NOT NULL,
70 age INTEGER CHECK (age >= 0),
71 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
72 is_active BOOLEAN DEFAULT TRUE
73 )
74 )";
75
76 std::cout << "Creating users table..." << std::endl;
77 auto table_result = db_manager->create_query_result(create_table_sql);
78 if (table_result.is_ok()) {
79 std::cout << "✓ Users table created successfully" << std::endl;
80 } else {
81 std::cout << "✗ Failed to create users table" << std::endl;
82 }
83
84 // 4. Data insertion
85 std::cout << "\n4. Data Insertion:" << std::endl;
86
87 std::vector<std::string> insert_queries = {
88 "INSERT INTO users (username, email, age) VALUES ('john_doe', 'john@example.com', 30)",
89 "INSERT INTO users (username, email, age) VALUES ('jane_smith', 'jane@example.com', 25)",
90 "INSERT INTO users (username, email, age) VALUES ('bob_wilson', 'bob@example.com', 35)",
91 "INSERT INTO users (username, email, age, is_active) VALUES ('alice_brown', 'alice@example.com', 28, FALSE)"
92 };
93
94 for (const auto& query : insert_queries) {
95 auto insert_result = db_manager->execute_query_result(query);
96 if (insert_result.is_ok()) {
97 std::cout << "✓ User inserted successfully" << std::endl;
98 } else {
99 std::cout << "✗ Failed to insert user (may already exist)" << std::endl;
100 }
101 }
102
103 // 5. Data selection
104 std::cout << "\n5. Data Selection:" << std::endl;
105
106 std::string select_all = "SELECT id, username, email, age, is_active FROM users ORDER BY id";
107 auto all_users_result = db_manager->select_query_result(select_all);
108
109 if (all_users_result.is_ok() && !all_users_result.value().empty()) {
110 const auto& all_users = all_users_result.value();
111 std::cout << "✓ All users retrieved (" << all_users.size() << " rows):" << std::endl;
112 for (const auto& row : all_users) {
113 std::cout << " User: ";
114 for (const auto& [key, value] : row) {
115 std::cout << key << "=";
116 std::visit([](const auto& v) { std::cout << v; }, value);
117 std::cout << " ";
118 }
119 std::cout << std::endl;
120 }
121 } else {
122 std::cout << "✗ Failed to retrieve users" << std::endl;
123 if (all_users_result.is_err()) {
124 std::cout << " Error: " << all_users_result.error().message << std::endl;
125 }
126 }
127
128 // Select specific user
129 std::string select_user = "SELECT username, email, age FROM users WHERE username = 'john_doe'";
130 auto john_result = db_manager->select_query_result(select_user);
131
132 if (john_result.is_ok() && !john_result.value().empty()) {
133 const auto& john_data = john_result.value();
134 std::cout << "✓ John's data retrieved:" << std::endl;
135 for (const auto& row : john_data) {
136 for (const auto& [key, value] : row) {
137 std::cout << " " << key << ": ";
138 std::visit([](const auto& v) { std::cout << v; }, value);
139 std::cout << std::endl;
140 }
141 }
142 } else {
143 std::cout << "✗ John's data not found" << std::endl;
144 }
145
146 // 6. Data updates
147 std::cout << "\n6. Data Updates:" << std::endl;
148
149 std::string update_query = "UPDATE users SET age = 31 WHERE username = 'john_doe'";
150 auto update_result = db_manager->execute_query_result(update_query);
151
152 if (update_result.is_ok()) {
153 std::cout << "✓ John's age updated successfully" << std::endl;
154
155 // Verify update
156 auto verify_result = db_manager->select_query_result("SELECT username, age FROM users WHERE username = 'john_doe'");
157 if (verify_result.is_ok() && !verify_result.value().empty()) {
158 std::cout << "Updated data: ";
159 for (const auto& row : verify_result.value()) {
160 for (const auto& [key, value] : row) {
161 std::cout << key << "=";
162 std::visit([](const auto& v) { std::cout << v; }, value);
163 std::cout << " ";
164 }
165 std::cout << std::endl;
166 }
167 }
168 } else {
169 std::cout << "✗ Failed to update John's age" << std::endl;
170 }
171
172 // 7. Data deletion
173 std::cout << "\n7. Data Deletion:" << std::endl;
174
175 std::string delete_query = "DELETE FROM users WHERE username LIKE 'temp_user%'";
176 auto delete_result = db_manager->execute_query_result(delete_query);
177
178 if (delete_result.is_ok()) {
179 std::cout << "✓ Temporary users deleted successfully" << std::endl;
180 } else {
181 std::cout << "✗ No temporary users to delete" << std::endl;
182 }
183
184 // 9. Connection testing
185 std::cout << "\n9. Connection Health Check:" << std::endl;
186
187 // Note: test_connection method not available in current API
188 std::cout << "Connection test: Assuming healthy if connected";
189 std::cout << " - OK" << std::endl;
190
191 // 10. Cleanup
192 std::cout << "\n10. Cleanup:" << std::endl;
193
194 // Optionally drop the test table (uncomment if needed)
195 // std::string drop_table = "DROP TABLE IF EXISTS users";
196 // bool table_dropped = db_manager->drop_query(drop_table);
197 // if (table_dropped) {
198 // std::cout << "✓ Test table dropped successfully" << std::endl;
199 // }
200
201 // Disconnect
202 db_manager->disconnect_result();
203 std::cout << "✓ Disconnected from database" << std::endl;
204 std::cout << "Connection status: Disconnected" << std::endl;
205
206 } else {
207 std::cout << "✗ Failed to connect to database" << std::endl;
208 std::cout << "Please ensure:" << std::endl;
209 std::cout << " - PostgreSQL server is running" << std::endl;
210 std::cout << " - Database 'testdb' exists" << std::endl;
211 std::cout << " - User 'testuser' has appropriate permissions" << std::endl;
212 std::cout << " - Connection parameters are correct" << std::endl;
213
214 std::cout << "\nTo test with a real database, update the connection string:" << std::endl;
215 std::cout << " host=your_host port=5432 dbname=your_db user=your_user password=your_pass" << std::endl;
216 }
217
218 std::cout << "\n=== Basic Usage Example completed ===" << std::endl;
219 return 0;
220}
int main()
Dependency injection container for database system components.