Draft of wal.c/.h
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
#include "wal.h"
|
||||
#include "file_tree.h"
|
||||
|
||||
#define WAL_MAGIC 0xcafebebe
|
||||
#define WAL_VERSION 1
|
||||
|
||||
typedef struct {
|
||||
uint32_t magic;
|
||||
uint32_t version;
|
||||
uint64_t reserved;
|
||||
} WALHeader
|
||||
|
||||
typedef struct {
|
||||
} WALEntry;
|
||||
|
||||
typedef struct {
|
||||
} WriteSnapshotContext;
|
||||
|
||||
static int
|
||||
serialize_callback(char *src, int num, void *data)
|
||||
{
|
||||
WriteSnapshotContext *wsc = data;
|
||||
if (write(src, num) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int write_snapshot(FileTree *file_tree)
|
||||
{
|
||||
WriteSnapshotContext wsc;
|
||||
if (file_tree_serialize(file_tree, serialize_callback, &wsc) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
} ReadSnapshotContext;
|
||||
|
||||
static int
|
||||
serialize_callback(char *src, int num, void *data)
|
||||
{
|
||||
ReadSnapshotContext *rsc = data;
|
||||
// TODO
|
||||
}
|
||||
|
||||
static int read_snapshot(FileTree *file_tree)
|
||||
{
|
||||
ReadSnapshotContext rsc;
|
||||
int num = file_tree_deserialize(file_tree, deserialize_callback, &rsc);
|
||||
if (num < 0)
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int swap_file(WAL *wal)
|
||||
{
|
||||
// TODO:
|
||||
// - Create a new temporary file
|
||||
// - Write the WAL file header
|
||||
// - Serialize the current file tree
|
||||
// - Rename the temporary file to a name such that it's the next log file that will be used
|
||||
// - Delete the old log file
|
||||
// NOTE:
|
||||
// - The lock will need to be acquired at some point
|
||||
|
||||
assert(0); // TODO
|
||||
}
|
||||
|
||||
int wal_open(WAL *wal, FileTree *file_tree, string file_path)
|
||||
{
|
||||
// TODO:
|
||||
// - Open the log file at path "file_path"
|
||||
// - Lock the file
|
||||
// - Check that the header is correct
|
||||
// - Load the snapshot at the head of the file in the "file_tree" object
|
||||
// - Loop over the following log entries and replay them
|
||||
// - Then, if there are too many log entries, create a new log file and start using it
|
||||
|
||||
assert(0); // TODO
|
||||
}
|
||||
|
||||
void wal_close(WAL *wal)
|
||||
{
|
||||
// TODO:
|
||||
// - Unlock the file
|
||||
// - Close the file handle
|
||||
|
||||
assert(0); // TODO
|
||||
}
|
||||
|
||||
int wal_append(WAL *wal, WALEntry entry)
|
||||
{
|
||||
// TODO:
|
||||
// - If too many entries were created, start a new log file
|
||||
// - Write the entry
|
||||
// - Sync to disk
|
||||
|
||||
assert(0); // TODO
|
||||
}
|
||||
Reference in New Issue
Block a user