1 module rocksdb.options;
2 
3 import std.conv : to;
4 import std.string : fromStringz;
5 import core.stdc.stdlib : cfree = free;
6 
7 import rocksdb.comparator;
8 import rocksdb.env : Env, rocksdb_env_t;
9 import rocksdb.snapshot : Snapshot, rocksdb_snapshot_t;
10 
11 extern (C) {
12   struct rocksdb_options_t {};
13   struct rocksdb_writeoptions_t {};
14   struct rocksdb_readoptions_t {};
15 
16   rocksdb_options_t* rocksdb_options_create();
17   void rocksdb_options_destroy(rocksdb_options_t*);
18   void rocksdb_options_increase_parallelism(rocksdb_options_t*, int total_threads);
19   void rocksdb_options_set_create_if_missing(rocksdb_options_t*, ubyte);
20   void rocksdb_options_set_create_missing_column_families(rocksdb_options_t*, ubyte);
21   void rocksdb_options_set_error_if_exists(rocksdb_options_t*, ubyte);
22   void rocksdb_options_set_paranoid_checks(rocksdb_options_t*, ubyte);
23   void rocksdb_options_set_env(rocksdb_options_t*, rocksdb_env_t*);
24   void rocksdb_options_set_compression(rocksdb_options_t*, int);
25   void rocksdb_options_set_compaction_style(rocksdb_options_t*, int);
26   void rocksdb_options_set_comparator(rocksdb_options_t*, rocksdb_comparator_t*);
27   void rocksdb_options_enable_statistics(rocksdb_options_t*);
28   char* rocksdb_options_statistics_get_string(rocksdb_options_t*);
29 
30   rocksdb_writeoptions_t* rocksdb_writeoptions_create();
31   void rocksdb_writeoptions_destroy(rocksdb_writeoptions_t*);
32   void rocksdb_writeoptions_set_sync(rocksdb_writeoptions_t*, ubyte);
33   void rocksdb_writeoptions_disable_WAL(rocksdb_writeoptions_t*, int);
34 
35   rocksdb_readoptions_t* rocksdb_readoptions_create();
36   void rocksdb_readoptions_destroy(rocksdb_readoptions_t*);
37   void rocksdb_readoptions_set_verify_checksums(rocksdb_readoptions_t*, ubyte);
38   void rocksdb_readoptions_set_fill_cache(rocksdb_readoptions_t*, ubyte);
39   void rocksdb_readoptions_set_snapshot(rocksdb_readoptions_t*, const rocksdb_snapshot_t*);
40   // void rocksdb_readoptions_set_iterate_upper_bound(rocksdb_readoptions_t*, const char*, size_t);
41   void rocksdb_readoptions_set_read_tier(rocksdb_readoptions_t*, int);
42   void rocksdb_readoptions_set_tailing(rocksdb_readoptions_t*, ubyte);
43   void rocksdb_readoptions_set_readahead_size(rocksdb_readoptions_t*, size_t);
44 }
45 
46 enum CompressionType : int {
47   NONE = 0x0,
48   SNAPPY = 0x1,
49   ZLIB = 0x2,
50   BZIP2 = 0x3,
51   LZ4 = 0x4,
52   LZ4HC = 0x5,
53   XPRESS = 0x6,
54   ZSTD = 0x7,
55 }
56 
57 enum CompactionStyle : int {
58   LEVEL = 0,
59   UNIVERSAL = 1,
60   FIFO = 2,
61 }
62 
63 enum ReadTier : int {
64   READ_ALL = 0x0,
65   BLOCK_CACHE = 0x1,
66   PERSISTED = 0x2,
67 }
68 
69 class WriteOptions {
70   rocksdb_writeoptions_t* opts;
71 
72   this() {
73     this.opts = rocksdb_writeoptions_create();
74   }
75 
76   ~this() {
77     rocksdb_writeoptions_destroy(this.opts);
78   }
79 
80   @property void sync(bool v) {
81     rocksdb_writeoptions_set_sync(this.opts, cast(ubyte)v);
82   }
83 
84   @property void disableWAL(bool v) {
85     rocksdb_writeoptions_disable_WAL(this.opts, cast(int)v);
86   }
87 }
88 
89 class ReadOptions {
90   rocksdb_readoptions_t* opts;
91 
92   this() {
93     this.opts = rocksdb_readoptions_create();
94   }
95 
96   ~this() {
97     rocksdb_readoptions_destroy(this.opts);
98   }
99 
100   @property void verifyChecksums(bool v) {
101     rocksdb_readoptions_set_verify_checksums(this.opts, cast(ubyte)v);
102   }
103 
104   @property void fillCache(bool v) {
105     rocksdb_readoptions_set_fill_cache(this.opts, cast(ubyte)v);
106   }
107 
108   @property void readTier(ReadTier tier) {
109     rocksdb_readoptions_set_read_tier(this.opts, tier);
110   }
111 
112   @property void tailing(bool v) {
113     rocksdb_readoptions_set_tailing(this.opts, cast(ubyte)v);
114   }
115 
116   @property void readAheadSize(size_t size) {
117     rocksdb_readoptions_set_readahead_size(this.opts, size);
118   }
119 
120   @property void snapshot(Snapshot snap) {
121     rocksdb_readoptions_set_snapshot(this.opts, snap.snap);
122   }
123 }
124 
125 class DBOptions {
126    rocksdb_options_t* opts;
127 
128   this() {
129     this.opts = rocksdb_options_create();
130   }
131 
132   ~this() {
133     rocksdb_options_destroy(this.opts);
134   }
135 
136   @property void parallelism(int totalThreads) {
137     rocksdb_options_increase_parallelism(this.opts, totalThreads);
138   }
139 
140   @property void createIfMissing(bool value) {
141     rocksdb_options_set_create_if_missing(this.opts, cast(ubyte)value);
142   }
143 
144   @property void createMissingColumnFamilies(bool value) {
145     rocksdb_options_set_create_missing_column_families(this.opts, cast(ubyte)value);
146   }
147 
148   @property void errorIfExists(bool value) {
149     rocksdb_options_set_error_if_exists(this.opts, cast(ubyte)value);
150   }
151 
152   @property void paranoidChecks(bool value) {
153     rocksdb_options_set_paranoid_checks(this.opts, cast(ubyte)value);
154   }
155 
156   @property void env(Env env) {
157     rocksdb_options_set_env(this.opts, env.env);
158   }
159 
160   @property void compression(CompressionType type) {
161     rocksdb_options_set_compression(this.opts, type);
162   }
163 
164   @property void compactionStyle(CompactionStyle style) {
165     rocksdb_options_set_compaction_style(this.opts, style);
166   }
167 
168   @property void comparator(Comparator cmp) {
169     rocksdb_options_set_comparator(this.opts, cmp.cmp);
170   }
171 
172   void enableStatistics() {
173     rocksdb_options_enable_statistics(this.opts);
174   }
175 
176   string getStatisticsString() {
177     char* cresult = rocksdb_options_statistics_get_string(this.opts);
178     string result = fromStringz(cresult).to!string;
179     cfree(cresult);
180     return result;
181   }
182 }