summaryrefslogtreecommitdiff
path: root/src/storage/store.h
blob: 78c8cbeb16ea25804b82080d33ff77281d1bafbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#ifndef TINY_CONVMEM_STORAGE_STORE_H
#define TINY_CONVMEM_STORAGE_STORE_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#include "domain/message.h"

typedef enum tiny_store_status
{
  TINY_STORE_OK = 0,
  TINY_STORE_NOT_FOUND,
  TINY_STORE_BUSY,
  TINY_STORE_IO_ERROR,
  TINY_STORE_CORRUPT,
  TINY_STORE_NO_MEMORY,
  TINY_STORE_CONFLICT
} tiny_store_status_t;

typedef struct tiny_store_entry
{
  tiny_message_t message;
  bool deleted;
  uint64_t sequence;
} tiny_store_entry_t;

typedef struct tiny_store tiny_store_t;
typedef struct tiny_import_transaction tiny_import_transaction_t;

typedef struct tiny_rebuild_report
{
  uint64_t messages_indexed;
  uint64_t records_removed;
  uint64_t bytes_before;
  uint64_t bytes_after;
} tiny_rebuild_report_t;

typedef struct tiny_store_health
{
  uint32_t format_version;
  uint64_t log_size;
  uint64_t snapshot_size;
  uint64_t active_messages;
  uint64_t deleted_messages;
  uint64_t last_sequence;
  uint64_t update_records;
  uint64_t dead_bytes;
  uint64_t memory_entry_bytes;
  uint64_t memory_body_bytes;
  uint64_t memory_metadata_bytes;
  uint64_t write_bytes;
  uint64_t write_calls;
  uint64_t flush_calls;
  uint64_t truncate_calls;
  uint64_t replace_calls;
  bool recovered_tail;
  bool snapshot_valid;
  char last_error[160];
} tiny_store_health_t;

typedef struct tiny_message_patch
{
  const char *content;
  const tiny_metadata_t *metadata;
  tiny_metadata_mask_t metadata_mask;
  uint64_t expected_revision;
  bool has_expected_revision;
} tiny_message_patch_t;

tiny_store_status_t tiny_store_open(tiny_store_t **store, const char *directory);
void tiny_store_close(tiny_store_t *store);
const char *tiny_store_status_name(tiny_store_status_t status);

tiny_store_status_t
tiny_store_write(tiny_store_t *store, const tiny_message_t *input, tiny_message_t *written);
tiny_store_status_t
tiny_store_delete(tiny_store_t *store, const char *message_id, const char *session_id);
tiny_store_status_t tiny_store_update(tiny_store_t *store,
                                      const char *message_id,
                                      const tiny_message_patch_t *patch,
                                      tiny_message_t *updated,
                                      bool *changed);

typedef enum tiny_import_policy
{
  TINY_IMPORT_OVERWRITE = 0,
  TINY_IMPORT_REJECT
} tiny_import_policy_t;

typedef struct tiny_import_record
{
  bool deleted;
  tiny_message_t message;
} tiny_import_record_t;

tiny_store_status_t tiny_store_rebuild(tiny_store_t *store, tiny_rebuild_report_t *report);
tiny_store_status_t tiny_store_import_begin(tiny_import_transaction_t **transaction,
                                            const char *directory);
tiny_store_status_t tiny_store_import_append(tiny_import_transaction_t *transaction,
                                             const tiny_import_record_t *record);
tiny_store_status_t tiny_store_import_commit(tiny_import_transaction_t *transaction);
void tiny_store_import_abort(tiny_import_transaction_t *transaction);
void tiny_store_health(const tiny_store_t *store, tiny_store_health_t *health);

size_t tiny_store_entry_count(const tiny_store_t *store);
const tiny_store_entry_t *tiny_store_entry(const tiny_store_t *store, size_t index);

#endif