feat: add slotted page skeleton with TDD cycle for page_create

format: storage.h
This commit is contained in:
paulhorn
2026-06-20 20:46:49 +02:00
parent 57b503028d
commit 081bd9041b
4 changed files with 199 additions and 15 deletions
+7 -1
View File
@@ -71,7 +71,13 @@ target_include_directories(pauldb
# Tests (CTest) # Tests (CTest)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
enable_testing() enable_testing()
# add_subdirectory(test) # einkommentieren sobald erste Tests da sind
add_executable(test_page
test/storage/test_page.c
src/storage/page.c
)
target_include_directories(test_page PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
add_test(NAME test_page COMMAND test_page)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Installationsregeln (fur package() in conanfile.py) # Installationsregeln (fur package() in conanfile.py)
+81 -13
View File
@@ -6,42 +6,110 @@
#include <stddef.h> #include <stddef.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C"
{
#endif #endif
/* --- Page Management --- */ /* --- Page Management --- */
typedef struct Page Page; typedef struct Page Page;
Page *page_create(uint32_t page_id); Page *
page_create
(
uint32_t page_id
);
int page_insert(Page *p, const void *data, size_t len); int
page_insert
(
Page *p,
const void *data,
size_t len
);
void *page_get(Page *p, uint16_t slot_id, size_t *out_len); void *
page_get
(
Page *p,
uint16_t slot_id,
size_t *out_len
);
void page_free(Page *p); void
page_free
(
Page *p
);
/* --- Heap (Multi-Page Row Store / Delta) --- */ /* --- Heap (Multi-Page Row Store / Delta) --- */
typedef struct Heap Heap; typedef struct Heap Heap;
Heap *heap_create(void); Heap *
heap_create
(
void
);
int heap_insert(Heap *h, const void *data, size_t len); int
heap_insert
(
Heap *h,
const void *data,
size_t len
);
void heap_full_scan(Heap *h, void (*callback)(const void *, size_t)); void
heap_full_scan
(
Heap *h,
void (*callback)
(
const void *,
size_t
)
);
void heap_free(Heap *h); void
heap_free
(
Heap *h
);
/* --- B+Tree Index --- */ /* --- B+Tree Index --- */
typedef struct BTree BTree; typedef struct BTree BTree;
BTree *btree_create(void); BTree *
btree_create
(
void
);
int btree_insert(BTree *bt, int64_t key, uint32_t page_id, uint16_t slot_id); int
btree_insert
(
BTree *bt,
int64_t key,
uint32_t page_id,
uint16_t slot_id
);
int btree_lookup(BTree *bt, int64_t key, uint32_t *out_page, uint16_t *out_slot); int
btree_lookup
(
BTree *bt,
int64_t key,
uint32_t *out_page,
uint16_t *out_slot
);
void btree_free(BTree *bt); void
btree_free
(
BTree *bt
);
#ifdef __cplusplus #ifdef __cplusplus
} }
+77 -1
View File
@@ -1,2 +1,78 @@
/* page.c - Storage Engine (C) */ /* src/storage/page.c
* Slotted Page - Storage Engine (C)
*
* Layout (4 KiB):
*
* Byte 0 Byte 4095
* +----------+--------+--------+--- ---+------+------+
* | Header | Slot 0 | Slot 1 | free |Tuple1|Tuple0|
* +----------+--------+--------+--- ---+------+------+
* slots --> <-- tuples
*
* Header : page_id, num_slots, free_space_offset
* Slot : (offset, length) - wo im raw-Array liegt das Tuple?
* free_space_offset: naechste Schreibposition fuer Tuple-Daten
* startet bei PAGE_SIZE, nimmt ab
*/
#include "pauldb/storage.h" #include "pauldb/storage.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#define PAGE_SIZE 4096
/* ---- interne Typen (nur in dieser Datei sichtbar) ---- */
typedef struct {
uint32_t page_id;
uint16_t num_slots;
uint16_t free_space_offset;
} PageHeader;
typedef struct {
uint16_t offset;
uint16_t length;
} Slot;
/* oeffentliche Page-Struktur (opak nach aussen) */
struct Page {
uint8_t raw[PAGE_SIZE];
};
/* ---- Hilfsfunktionen ---- */
static PageHeader *header(Page *p) {
return (PageHeader *)p->raw;
}
/* ---- API ---- */
Page *page_create(uint32_t page_id) {
Page *p = malloc(sizeof(Page));
if (!p) return NULL;
memset(p->raw, 0, PAGE_SIZE);
PageHeader *h = header(p);
h->page_id = page_id;
h->num_slots = 0;
h->free_space_offset = PAGE_SIZE;
return p;
}
void page_free(Page *p) {
free(p);
}
/* page_insert und page_get folgen im naechsten TDD-Zyklus */
int page_insert(Page *p, const void *data, size_t len) {
(void)p; (void)data; (void)len;
return -1; /* noch nicht implementiert */
}
void *page_get(Page *p, uint16_t slot_id, size_t *out_len) {
(void)p; (void)slot_id; (void)out_len;
return NULL; /* noch nicht implementiert */
}
+34
View File
@@ -0,0 +1,34 @@
/* test/storage/test_page.c
*
* TDD-Zyklus: test_page_create
* RED -> diese Datei schreiben, noch kein page.c -> Linker-Fehler
* GREEN -> page_create() + page_free() in page.c implementieren
*/
#include <assert.h>
#include <stdio.h>
#include "pauldb/storage.h"
static void
test_create_returns_non_null
(
void
)
{
Page *p = page_create(42);
assert(p != NULL);
page_free(p);
printf(" OK: page_create(42) returns non-NULL\n");
}
int
main
(
void
)
{
printf("=== test_page ===\n");
test_create_returns_non_null();
printf("All tests passed.\n");
return 0;
}