feat: page_insert implemented in page.c
This commit is contained in:
+22
-4
@@ -79,10 +79,28 @@ page_free(Page * p)
|
||||
int
|
||||
page_insert(Page * p, const void * data, size_t len)
|
||||
{
|
||||
(void) p;
|
||||
(void) data;
|
||||
(void) len;
|
||||
return -1; /* noch nicht implementiert */
|
||||
PageHeader * h = header(p);
|
||||
|
||||
/* Wo endet der letzte Slot? */
|
||||
size_t slots_end = sizeof(PageHeader) + ((h->num_slots + 1) * sizeof(Slot));
|
||||
|
||||
/* Passt das neue Tuple noch rein? */
|
||||
if (h->free_space_offset - len < slots_end) return -1; /* Page voll */
|
||||
|
||||
/* Tuple-Daten von hinten schreiben */
|
||||
h->free_space_offset -= (uint16_t) len;
|
||||
memcpy(p->raw + h->free_space_offset, data, len);
|
||||
|
||||
/* Neuen Slot anlegen */
|
||||
Slot * s = (Slot *) (p->raw + sizeof(PageHeader)) + h->num_slots;
|
||||
s->offset = h->free_space_offset;
|
||||
s->length = (uint16_t) len;
|
||||
|
||||
/* Slot-ID zurueckgeben, dann Counter erhoehen */
|
||||
uint16_t slot_id = h->num_slots;
|
||||
h->num_slots++;
|
||||
|
||||
return (int) slot_id;
|
||||
}
|
||||
|
||||
void *
|
||||
|
||||
Reference in New Issue
Block a user