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        rocksdb.snapshot : Snapshot, rocksdb_snapshot_t;
9 
10 extern (C) {
11   struct rocksdb_options_t {};
12   struct rocksdb_writeoptions_t {};
13   struct rocksdb_readoptions_t {};
14 
15   rocksdb_options_t* rocksdb_options_create();
16   void rocksdb_options_destroy(rocksdb_options_t*);
17   void rocksdb_options_increase_parallelism(rocksdb_options_t*, int total_threads);
18   void rocksdb_options_set_create_if_missing(rocksdb_options_t*, ubyte);
19   void rocksdb_options_set_error_if_exists(rocksdb_options_t*, ubyte);
20   void rocksdb_options_set_compression(rocksdb_options_t*, int);
21   void rocksdb_options_set_comparator(rocksdb_options_t*, rocksdb_comparator_t*);
22   void rocksdb_options_enable_statistics(rocksdb_options_t*);
23   char* rocksdb_options_statistics_get_string(rocksdb_options_t*);
24 
25   rocksdb_writeoptions_t* rocksdb_writeoptions_create();
26   void rocksdb_writeoptions_destroy(rocksdb_writeoptions_t*);
27   void rocksdb_writeoptions_set_sync(rocksdb_writeoptions_t*, ubyte);
28   void rocksdb_writeoptions_disable_WAL(rocksdb_writeoptions_t*, int);
29 
30   rocksdb_readoptions_t* rocksdb_readoptions_create();
31   void rocksdb_readoptions_destroy(rocksdb_readoptions_t*);
32   void rocksdb_readoptions_set_verify_checksums(rocksdb_readoptions_t*, ubyte);
33   void rocksdb_readoptions_set_fill_cache(rocksdb_readoptions_t*, ubyte);
34   void rocksdb_readoptions_set_snapshot(rocksdb_readoptions_t*, const rocksdb_snapshot_t*);
35   // void rocksdb_readoptions_set_iterate_upper_bound(rocksdb_readoptions_t*, const char*, size_t);
36   void rocksdb_readoptions_set_read_tier(rocksdb_readoptions_t*, int);
37   void rocksdb_readoptions_set_tailing(rocksdb_readoptions_t*, ubyte);
38   void rocksdb_readoptions_set_readahead_size(rocksdb_readoptions_t*, size_t);
39 }
40 
41 enum CompressionType : ubyte {
42   NONE = 0x0,
43   SNAPPY = 0x1,
44   ZLIB = 0x2,
45   BZIP2 = 0x3,
46   LZ4 = 0x4,
47   LZ4HC = 0x5,
48   XPRESS = 0x6,
49   ZSTD = 0x7,
50 }
51 
52 enum ReadTier : int {
53   READ_ALL = 0x0,
54   BLOCK_CACHE = 0x1,
55   PERSISTED = 0x2,
56 }
57 
58 class WriteOptions {
59   rocksdb_writeoptions_t* opts;
60 
61   this() {
62     this.opts = rocksdb_writeoptions_create();
63   }
64 
65   ~this() {
66     rocksdb_writeoptions_destroy(this.opts);
67   }
68 
69   @property void sync(bool v) {
70     rocksdb_writeoptions_set_sync(this.opts, cast(ubyte)v);
71   }
72 
73   @property void disableWAL(bool v) {
74     rocksdb_writeoptions_disable_WAL(this.opts, cast(int)v);
75   }
76 }
77 
78 class ReadOptions {
79   rocksdb_readoptions_t* opts;
80 
81   this() {
82     this.opts = rocksdb_readoptions_create();
83   }
84 
85   ~this() {
86     rocksdb_readoptions_destroy(this.opts);
87   }
88 
89   @property void verifyChecksums(bool v) {
90     rocksdb_readoptions_set_verify_checksums(this.opts, cast(ubyte)v);
91   }
92 
93   @property void fillCache(bool v) {
94     rocksdb_readoptions_set_fill_cache(this.opts, cast(ubyte)v);
95   }
96 
97   @property void readTier(ReadTier tier) {
98     rocksdb_readoptions_set_read_tier(this.opts, tier);
99   }
100 
101   @property void tailing(bool v) {
102     rocksdb_readoptions_set_tailing(this.opts, cast(ubyte)v);
103   }
104 
105   @property void readAheadSize(size_t size) {
106     rocksdb_readoptions_set_readahead_size(this.opts, size);
107   }
108 
109   @property void snapshot(Snapshot snap) {
110     rocksdb_readoptions_set_snapshot(this.opts, snap.snap);
111   }
112 }
113 
114 class DBOptions {
115    rocksdb_options_t* opts;
116 
117   this() {
118     this.opts = rocksdb_options_create();
119   }
120 
121   ~this() {
122     rocksdb_options_destroy(this.opts);
123   }
124 
125   @property void paralleism(int totalThreads) {
126     rocksdb_options_increase_parallelism(this.opts, totalThreads);
127   }
128 
129   @property void createIfMissing(bool value) {
130     rocksdb_options_set_create_if_missing(this.opts, cast(ubyte)value);
131   }
132 
133   @property void errorIfExists(bool value) {
134     rocksdb_options_set_error_if_exists(this.opts, cast(ubyte)value);
135   }
136 
137   @property void compression(CompressionType type) {
138     rocksdb_options_set_compression(this.opts, cast(int)type);
139   }
140 
141   @property void comparator(Comparator cmp) {
142     rocksdb_options_set_comparator(this.opts, cmp.cmp);
143   }
144 
145   void enableStatistics() {
146     rocksdb_options_enable_statistics(this.opts);
147   }
148 
149   string getStatisticsString() {
150     char* cresult = rocksdb_options_statistics_get_string(this.opts);
151     string result = fromStringz(cresult).to!string;
152     cfree(cresult);
153     return result;
154   }
155 }