Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
database_protocol.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
7#include <cstdint>
8#include <string>
9#include <vector>
10#include <map>
11#include <variant>
12#include <optional>
13#include "../database_types.h"
14#include "../core/result.h"
15
16namespace database::protocol {
17
25enum class message_type : uint16_t {
26 // Connection management
29 DISCONNECT = 3,
30 PING = 4,
31 PONG = 5,
32
33 // Query operations
34 QUERY_REQUEST = 10,
35 QUERY_RESPONSE = 11,
36
37 // Transaction management
42
43 // Prepared statements
46 CLOSE_PREPARED = 32,
47
48 // Error handling
49 ERROR_RESPONSE = 100
50};
51
56enum class query_operation : uint8_t {
57 SELECT = 1,
58 INSERT = 2,
59 UPDATE = 3,
60 DELETE = 4,
61 CREATE = 5,
62 ALTER = 6,
63 DROP = 7,
64 OTHER = 99
65};
66
79 static constexpr uint32_t MAGIC = 0xDB01DB01;
80 static constexpr uint16_t PROTOCOL_VERSION = 1;
81
82 uint32_t magic = MAGIC;
85 uint64_t request_id;
86 uint32_t payload_size;
87
92 [[nodiscard]] bool is_valid() const {
93 return magic == MAGIC && version == PROTOCOL_VERSION;
94 }
95};
96
102 std::string database_type; // "postgresql", "sqlite", etc.
103 std::string connection_string;
104 std::map<std::string, std::string> options;
105};
106
113 std::string session_id;
114 std::string error_message;
115};
116
123 std::string query_string;
124 std::vector<std::string> parameters; // For prepared statements
125};
126
133
134 // For SELECT queries
135 std::vector<std::map<std::string, std::string>> rows;
136 std::vector<std::string> column_names;
137
138 // For INSERT/UPDATE/DELETE
139 uint64_t affected_rows = 0;
140 uint64_t last_insert_id = 0;
141
142 // Error information
143 std::string error_message;
144 int32_t error_code = 0;
145};
146
152 message_type operation; // BEGIN, COMMIT, or ROLLBACK
153};
154
161 std::string error_message;
162};
163
169 int32_t error_code;
170 std::string error_message;
171 std::string error_context;
172};
173
182public:
188 static std::vector<uint8_t> serialize_header(const message_header& header);
189
195 static kcenon::common::Result<message_header> deserialize_header(const std::vector<uint8_t>& data);
196
202 static std::vector<uint8_t> serialize(const connect_request& request);
203
209 static kcenon::common::Result<connect_request> deserialize_connect_request(const std::vector<uint8_t>& data);
210
216 static std::vector<uint8_t> serialize(const connect_response& response);
217
223 static kcenon::common::Result<connect_response> deserialize_connect_response(const std::vector<uint8_t>& data);
224
230 static std::vector<uint8_t> serialize(const query_request& request);
231
237 static kcenon::common::Result<query_request> deserialize_query_request(const std::vector<uint8_t>& data);
238
244 static std::vector<uint8_t> serialize(const query_response& response);
245
251 static kcenon::common::Result<query_response> deserialize_query_response(const std::vector<uint8_t>& data);
252
258 static std::vector<uint8_t> serialize(const transaction_request& request);
259
265 static kcenon::common::Result<transaction_request> deserialize_transaction_request(const std::vector<uint8_t>& data);
266
272 static std::vector<uint8_t> serialize(const error_response& response);
273
279 static kcenon::common::Result<error_response> deserialize_error_response(const std::vector<uint8_t>& data);
280
286 static std::vector<uint8_t> serialize(const transaction_response& response);
287
293 static kcenon::common::Result<transaction_response> deserialize_transaction_response(const std::vector<uint8_t>& data);
294
295private:
296 // Helper methods for primitive types
297 static void write_uint8(std::vector<uint8_t>& buffer, uint8_t value);
298 static void write_uint16(std::vector<uint8_t>& buffer, uint16_t value);
299 static void write_uint32(std::vector<uint8_t>& buffer, uint32_t value);
300 static void write_uint64(std::vector<uint8_t>& buffer, uint64_t value);
301 static void write_string(std::vector<uint8_t>& buffer, const std::string& value);
302
303 static uint8_t read_uint8(const std::vector<uint8_t>& buffer, size_t& offset);
304 static uint16_t read_uint16(const std::vector<uint8_t>& buffer, size_t& offset);
305 static uint32_t read_uint32(const std::vector<uint8_t>& buffer, size_t& offset);
306 static uint64_t read_uint64(const std::vector<uint8_t>& buffer, size_t& offset);
307 static std::string read_string(const std::vector<uint8_t>& buffer, size_t& offset);
308};
309
310} // namespace database::protocol
Serialization/deserialization utilities for protocol messages.
static std::string read_string(const std::vector< uint8_t > &buffer, size_t &offset)
static kcenon::common::Result< connect_request > deserialize_connect_request(const std::vector< uint8_t > &data)
Deserialize connect request.
static kcenon::common::Result< message_header > deserialize_header(const std::vector< uint8_t > &data)
Deserialize message header from bytes.
static void write_string(std::vector< uint8_t > &buffer, const std::string &value)
static void write_uint8(std::vector< uint8_t > &buffer, uint8_t value)
static uint32_t read_uint32(const std::vector< uint8_t > &buffer, size_t &offset)
static std::vector< uint8_t > serialize(const connect_request &request)
Serialize connect request.
static kcenon::common::Result< query_request > deserialize_query_request(const std::vector< uint8_t > &data)
Deserialize query request.
static void write_uint16(std::vector< uint8_t > &buffer, uint16_t value)
static void write_uint64(std::vector< uint8_t > &buffer, uint64_t value)
static kcenon::common::Result< connect_response > deserialize_connect_response(const std::vector< uint8_t > &data)
Deserialize connect response.
static std::vector< uint8_t > serialize_header(const message_header &header)
Serialize message header to bytes.
static kcenon::common::Result< transaction_response > deserialize_transaction_response(const std::vector< uint8_t > &data)
Deserialize transaction response.
static void write_uint32(std::vector< uint8_t > &buffer, uint32_t value)
static kcenon::common::Result< query_response > deserialize_query_response(const std::vector< uint8_t > &data)
Deserialize query response.
static uint16_t read_uint16(const std::vector< uint8_t > &buffer, size_t &offset)
static uint64_t read_uint64(const std::vector< uint8_t > &buffer, size_t &offset)
static kcenon::common::Result< error_response > deserialize_error_response(const std::vector< uint8_t > &data)
Deserialize error response.
static kcenon::common::Result< transaction_request > deserialize_transaction_request(const std::vector< uint8_t > &data)
Deserialize transaction request.
static uint8_t read_uint8(const std::vector< uint8_t > &buffer, size_t &offset)
Defines the enumeration of supported database types.
message_type
Database protocol message types.
query_operation
Type of query operation.
error_code
Error codes for database operations.
Definition result.h:43
Result<T> type for database_system error handling.
std::map< std::string, std::string > options
Common header for all protocol messages.
static constexpr uint32_t MAGIC
bool is_valid() const
Validate message header.
static constexpr uint16_t PROTOCOL_VERSION
std::vector< std::string > parameters
std::vector< std::map< std::string, std::string > > rows
std::vector< std::string > column_names