isomorfeus-ferret 0.17.2 → 0.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/ext/isomorfeus_ferret_ext/benchmark.c +9 -20
  3. data/ext/isomorfeus_ferret_ext/benchmarks_all.h +1 -2
  4. data/ext/isomorfeus_ferret_ext/bm_hash.c +1 -2
  5. data/ext/isomorfeus_ferret_ext/brotli_dec_decode.c +4 -2
  6. data/ext/isomorfeus_ferret_ext/brotli_enc_encode.c +3 -2
  7. data/ext/isomorfeus_ferret_ext/frb_analysis.c +4 -5
  8. data/ext/isomorfeus_ferret_ext/frb_field_info.c +3 -4
  9. data/ext/isomorfeus_ferret_ext/frb_index.c +118 -125
  10. data/ext/isomorfeus_ferret_ext/frb_lazy_doc.c +14 -16
  11. data/ext/isomorfeus_ferret_ext/frb_search.c +31 -23
  12. data/ext/isomorfeus_ferret_ext/frb_store.c +27 -13
  13. data/ext/isomorfeus_ferret_ext/frb_utils.c +3 -6
  14. data/ext/isomorfeus_ferret_ext/frt_analysis.c +39 -46
  15. data/ext/isomorfeus_ferret_ext/frt_analysis.h +9 -9
  16. data/ext/isomorfeus_ferret_ext/frt_array.c +11 -22
  17. data/ext/isomorfeus_ferret_ext/frt_bitvector.h +3 -6
  18. data/ext/isomorfeus_ferret_ext/frt_doc_field.c +87 -0
  19. data/ext/isomorfeus_ferret_ext/frt_doc_field.h +26 -0
  20. data/ext/isomorfeus_ferret_ext/frt_document.c +4 -97
  21. data/ext/isomorfeus_ferret_ext/frt_document.h +2 -27
  22. data/ext/isomorfeus_ferret_ext/frt_except.c +8 -6
  23. data/ext/isomorfeus_ferret_ext/frt_except.h +1 -2
  24. data/ext/isomorfeus_ferret_ext/frt_field_index.c +13 -32
  25. data/ext/isomorfeus_ferret_ext/frt_field_index.h +0 -6
  26. data/ext/isomorfeus_ferret_ext/frt_field_info.c +69 -0
  27. data/ext/isomorfeus_ferret_ext/frt_field_info.h +49 -0
  28. data/ext/isomorfeus_ferret_ext/frt_field_infos.c +196 -0
  29. data/ext/isomorfeus_ferret_ext/frt_field_infos.h +35 -0
  30. data/ext/isomorfeus_ferret_ext/frt_global.c +10 -4
  31. data/ext/isomorfeus_ferret_ext/frt_global.h +11 -15
  32. data/ext/isomorfeus_ferret_ext/frt_hash.c +8 -8
  33. data/ext/isomorfeus_ferret_ext/frt_hash.h +1 -2
  34. data/ext/isomorfeus_ferret_ext/frt_hashset.c +20 -40
  35. data/ext/isomorfeus_ferret_ext/frt_hashset.h +1 -2
  36. data/ext/isomorfeus_ferret_ext/frt_helper.c +7 -15
  37. data/ext/isomorfeus_ferret_ext/frt_in_stream.c +35 -45
  38. data/ext/isomorfeus_ferret_ext/frt_in_stream.h +3 -2
  39. data/ext/isomorfeus_ferret_ext/frt_ind.c +20 -38
  40. data/ext/isomorfeus_ferret_ext/frt_index.c +292 -790
  41. data/ext/isomorfeus_ferret_ext/frt_index.h +1 -102
  42. data/ext/isomorfeus_ferret_ext/frt_lang.c +5 -10
  43. data/ext/isomorfeus_ferret_ext/frt_lazy_doc.c +3 -3
  44. data/ext/isomorfeus_ferret_ext/frt_lazy_doc.h +1 -1
  45. data/ext/isomorfeus_ferret_ext/frt_lazy_doc_field.c +18 -25
  46. data/ext/isomorfeus_ferret_ext/frt_lazy_doc_field.h +5 -5
  47. data/ext/isomorfeus_ferret_ext/frt_mdbx_store.c +102 -70
  48. data/ext/isomorfeus_ferret_ext/frt_mempool.c +8 -16
  49. data/ext/isomorfeus_ferret_ext/frt_multimapper.c +23 -46
  50. data/ext/isomorfeus_ferret_ext/frt_multimapper.h +4 -8
  51. data/ext/isomorfeus_ferret_ext/frt_out_stream.c +31 -43
  52. data/ext/isomorfeus_ferret_ext/frt_out_stream.h +2 -2
  53. data/ext/isomorfeus_ferret_ext/frt_posh.c +6 -819
  54. data/ext/isomorfeus_ferret_ext/frt_posh.h +0 -57
  55. data/ext/isomorfeus_ferret_ext/frt_priorityqueue.c +11 -22
  56. data/ext/isomorfeus_ferret_ext/frt_priorityqueue.h +1 -2
  57. data/ext/isomorfeus_ferret_ext/frt_q_boolean.c +85 -171
  58. data/ext/isomorfeus_ferret_ext/frt_q_match_all.c +8 -16
  59. data/ext/isomorfeus_ferret_ext/frt_q_multi_term.c +1 -2
  60. data/ext/isomorfeus_ferret_ext/frt_q_parser.c +49 -98
  61. data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +52 -104
  62. data/ext/isomorfeus_ferret_ext/frt_q_range.c +6 -12
  63. data/ext/isomorfeus_ferret_ext/frt_q_span.c +113 -226
  64. data/ext/isomorfeus_ferret_ext/frt_q_wildcard.c +1 -2
  65. data/ext/isomorfeus_ferret_ext/frt_ram_store.c +134 -85
  66. data/ext/isomorfeus_ferret_ext/frt_search.c +82 -164
  67. data/ext/isomorfeus_ferret_ext/frt_similarity.c +11 -22
  68. data/ext/isomorfeus_ferret_ext/frt_similarity.h +1 -2
  69. data/ext/isomorfeus_ferret_ext/frt_store.c +13 -25
  70. data/ext/isomorfeus_ferret_ext/frt_store.h +86 -52
  71. data/ext/isomorfeus_ferret_ext/frt_term_vectors.c +8 -16
  72. data/ext/isomorfeus_ferret_ext/frt_win32.h +5 -10
  73. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.c +12 -11
  74. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.h +11 -13
  75. data/ext/isomorfeus_ferret_ext/lz4.c +422 -195
  76. data/ext/isomorfeus_ferret_ext/lz4.h +114 -46
  77. data/ext/isomorfeus_ferret_ext/lz4frame.c +421 -242
  78. data/ext/isomorfeus_ferret_ext/lz4frame.h +122 -53
  79. data/ext/isomorfeus_ferret_ext/lz4hc.c +127 -111
  80. data/ext/isomorfeus_ferret_ext/lz4hc.h +14 -14
  81. data/ext/isomorfeus_ferret_ext/lz4xxhash.h +1 -1
  82. data/ext/isomorfeus_ferret_ext/mdbx.c +3762 -2526
  83. data/ext/isomorfeus_ferret_ext/mdbx.h +115 -70
  84. data/ext/isomorfeus_ferret_ext/test.c +40 -87
  85. data/ext/isomorfeus_ferret_ext/test.h +3 -6
  86. data/ext/isomorfeus_ferret_ext/test_1710.c +11 -13
  87. data/ext/isomorfeus_ferret_ext/test_analysis.c +32 -64
  88. data/ext/isomorfeus_ferret_ext/test_array.c +6 -12
  89. data/ext/isomorfeus_ferret_ext/test_bitvector.c +12 -24
  90. data/ext/isomorfeus_ferret_ext/test_document.c +23 -33
  91. data/ext/isomorfeus_ferret_ext/test_except.c +10 -21
  92. data/ext/isomorfeus_ferret_ext/test_fields.c +62 -68
  93. data/ext/isomorfeus_ferret_ext/test_file_deleter.c +15 -23
  94. data/ext/isomorfeus_ferret_ext/test_filter.c +17 -27
  95. data/ext/isomorfeus_ferret_ext/test_global.c +14 -29
  96. data/ext/isomorfeus_ferret_ext/test_hash.c +19 -38
  97. data/ext/isomorfeus_ferret_ext/test_hashset.c +8 -16
  98. data/ext/isomorfeus_ferret_ext/test_helper.c +4 -8
  99. data/ext/isomorfeus_ferret_ext/test_highlighter.c +16 -28
  100. data/ext/isomorfeus_ferret_ext/test_index.c +277 -487
  101. data/ext/isomorfeus_ferret_ext/test_lang.c +7 -14
  102. data/ext/isomorfeus_ferret_ext/test_mdbx_store.c +2 -5
  103. data/ext/isomorfeus_ferret_ext/test_mempool.c +5 -10
  104. data/ext/isomorfeus_ferret_ext/test_multimapper.c +3 -6
  105. data/ext/isomorfeus_ferret_ext/test_priorityqueue.c +9 -18
  106. data/ext/isomorfeus_ferret_ext/test_q_const_score.c +4 -6
  107. data/ext/isomorfeus_ferret_ext/test_q_filtered.c +3 -4
  108. data/ext/isomorfeus_ferret_ext/test_q_fuzzy.c +9 -15
  109. data/ext/isomorfeus_ferret_ext/test_q_parser.c +8 -16
  110. data/ext/isomorfeus_ferret_ext/test_q_span.c +19 -35
  111. data/ext/isomorfeus_ferret_ext/test_ram_store.c +14 -13
  112. data/ext/isomorfeus_ferret_ext/test_search.c +60 -109
  113. data/ext/isomorfeus_ferret_ext/test_segments.c +8 -13
  114. data/ext/isomorfeus_ferret_ext/test_similarity.c +2 -4
  115. data/ext/isomorfeus_ferret_ext/test_sort.c +14 -24
  116. data/ext/isomorfeus_ferret_ext/test_store.c +96 -115
  117. data/ext/isomorfeus_ferret_ext/test_term.c +9 -15
  118. data/ext/isomorfeus_ferret_ext/test_term_vectors.c +9 -14
  119. data/ext/isomorfeus_ferret_ext/test_test.c +4 -8
  120. data/ext/isomorfeus_ferret_ext/test_threading.c +14 -20
  121. data/ext/isomorfeus_ferret_ext/testhelper.c +11 -21
  122. data/ext/isomorfeus_ferret_ext/testhelper.h +1 -1
  123. data/ext/isomorfeus_ferret_ext/tests_all.h +1 -2
  124. data/lib/isomorfeus/ferret/index/index.rb +1 -1
  125. data/lib/isomorfeus/ferret/version.rb +1 -1
  126. metadata +24 -4
@@ -10,8 +10,8 @@
10
10
 
11
11
  extern void frt_micro_sleep(const int micro_seconds);
12
12
 
13
- const char *dbi_name = "segmented_index";
14
13
  const char *lock_s = "lock";
14
+ int keysize_max = 0;
15
15
 
16
16
  // helper functions
17
17
 
@@ -76,12 +76,26 @@ static void mdbxs_abort_txn(FrtStore *store, MDBX_txn *txn, bool del_env_txn) {
76
76
  // dbi
77
77
 
78
78
  static void mdbxs_open_dbi(MDBX_txn *txn, const char *dbi_name, MDBX_dbi *dbi) {
79
- int res = mdbx_dbi_open(txn, dbi_name, MDBX_DB_DEFAULTS | MDBX_CREATE, dbi);
79
+ int res = mdbx_dbi_open(txn, dbi_name, MDBX_DB_DEFAULTS, dbi);
80
80
  if (res != MDBX_SUCCESS) {
81
81
  FRT_RAISE(FRT_IO_ERROR, "failed to open dbi '%s', error: %i\n", dbi_name, res);
82
82
  }
83
83
  }
84
84
 
85
+ static void mdbxs_create_dbi(MDBX_txn *txn, const char *dbi_name, MDBX_dbi *dbi) {
86
+ int res = mdbx_dbi_open(txn, dbi_name, MDBX_DB_DEFAULTS | MDBX_CREATE, dbi);
87
+ if (res != MDBX_SUCCESS) {
88
+ FRT_RAISE(FRT_IO_ERROR, "creating database '%s' failed, error: %i\n", dbi_name, res);
89
+ }
90
+ }
91
+
92
+ static void mdbxs_drop_dbi(MDBX_txn *txn, const char *dbi_name, MDBX_dbi dbi) {
93
+ int res = mdbx_drop(txn, dbi, true);
94
+ if (res != MDBX_SUCCESS) {
95
+ FRT_RAISE(FRT_IO_ERROR, "dropping database '%s' failed, error: %i\n", dbi_name, res);
96
+ }
97
+ }
98
+
85
99
  // cursor
86
100
 
87
101
  static void mdbxs_open_cursor(MDBX_txn *txn, MDBX_dbi dbi, MDBX_cursor **cursor) {
@@ -108,7 +122,26 @@ static void mdbxs_put(MDBX_txn *txn, MDBX_dbi dbi, MDBX_val *key, MDBX_val *val)
108
122
 
109
123
  // store API
110
124
 
111
- static void mdbxs_touch(FrtStore *store, const char *filename) {
125
+ static void mdbxs_create_folder(FrtStore *store, const char *folder_name) {
126
+ MDBX_txn *txn = NULL;
127
+ MDBX_dbi dbi;
128
+
129
+ bool del_env_txn = mdbxs_begin_txn(store, &txn);
130
+ mdbxs_create_dbi(txn, folder_name, &dbi);
131
+ mdbxs_commit_txn(store, txn, del_env_txn);
132
+ }
133
+
134
+ static void mdbxs_remove_folder(FrtStore *store, const char *folder_name) {
135
+ MDBX_txn *txn = NULL;
136
+ MDBX_dbi dbi;
137
+
138
+ bool del_env_txn = mdbxs_begin_txn(store, &txn);
139
+ mdbxs_open_dbi(txn, folder_name, &dbi);
140
+ mdbxs_drop_dbi(txn, folder_name, dbi);
141
+ mdbxs_commit_txn(store, txn, del_env_txn);
142
+ }
143
+
144
+ static void mdbxs_touch(FrtStore *store, const char *folder_name, const char *filename) {
112
145
  int res = 0;
113
146
  MDBX_txn *txn = NULL;
114
147
  MDBX_dbi dbi;
@@ -120,7 +153,7 @@ static void mdbxs_touch(FrtStore *store, const char *filename) {
120
153
  val.iov_len = 0;
121
154
 
122
155
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
123
- mdbxs_open_dbi(txn, dbi_name, &dbi);
156
+ mdbxs_open_dbi(txn, folder_name, &dbi);
124
157
  res = mdbx_get(txn, dbi, &key, &val);
125
158
 
126
159
  if (res == MDBX_NOTFOUND) {
@@ -136,7 +169,7 @@ static void mdbxs_touch(FrtStore *store, const char *filename) {
136
169
  }
137
170
  }
138
171
 
139
- static int mdbxs_exists(FrtStore *store, const char *filename) {
172
+ static int mdbxs_exists(FrtStore *store, const char *folder_name, const char *filename) {
140
173
  MDBX_txn *txn = NULL;
141
174
  MDBX_dbi dbi;
142
175
 
@@ -147,7 +180,7 @@ static int mdbxs_exists(FrtStore *store, const char *filename) {
147
180
  val.iov_len = 0;
148
181
 
149
182
  bool del_env_txn = mdbxs_begin_ro_txn(store, &txn);
150
- mdbxs_open_dbi(txn, dbi_name, &dbi);
183
+ mdbxs_open_dbi(txn, folder_name, &dbi);
151
184
  int res = mdbx_get(txn, dbi, &key, &val);
152
185
  mdbxs_abort_txn(store, txn, del_env_txn);
153
186
 
@@ -155,7 +188,7 @@ static int mdbxs_exists(FrtStore *store, const char *filename) {
155
188
  return false;
156
189
  }
157
190
 
158
- static int mdbxs_remove(FrtStore *store, const char *filename) {
191
+ static int mdbxs_remove(FrtStore *store, const char *folder_name, const char *filename) {
159
192
  MDBX_txn *txn = NULL;
160
193
  MDBX_dbi dbi;
161
194
 
@@ -164,14 +197,14 @@ static int mdbxs_remove(FrtStore *store, const char *filename) {
164
197
  key.iov_len = strlen(filename);
165
198
 
166
199
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
167
- mdbxs_open_dbi(txn, dbi_name, &dbi);
200
+ mdbxs_open_dbi(txn, folder_name, &dbi);
168
201
  mdbxs_del(txn, dbi, &key, NULL);
169
202
  mdbxs_commit_txn(store, txn, del_env_txn);
170
203
 
171
204
  return 0;
172
205
  }
173
206
 
174
- static void mdbxs_rename(FrtStore *store, const char *from, const char *to) {
207
+ static void mdbxs_rename(FrtStore *store, const char *folder_name, const char *from, const char *to) {
175
208
  int res;
176
209
  MDBX_txn *txn = NULL;
177
210
  MDBX_dbi dbi;
@@ -183,7 +216,7 @@ static void mdbxs_rename(FrtStore *store, const char *from, const char *to) {
183
216
  val.iov_len = 0;
184
217
 
185
218
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
186
- mdbxs_open_dbi(txn, dbi_name, &dbi);
219
+ mdbxs_open_dbi(txn, folder_name, &dbi);
187
220
  res = mdbx_get(txn, dbi, &from_key, &val);
188
221
 
189
222
  if (res == MDBX_SUCCESS) {
@@ -199,7 +232,7 @@ static void mdbxs_rename(FrtStore *store, const char *from, const char *to) {
199
232
  }
200
233
  }
201
234
 
202
- static int mdbxs_count(FrtStore *store) {
235
+ static int mdbxs_count(FrtStore *store, const char *folder_name) {
203
236
  MDBX_txn *txn = NULL;
204
237
  MDBX_dbi dbi;
205
238
  MDBX_stat stat;
@@ -207,7 +240,7 @@ static int mdbxs_count(FrtStore *store) {
207
240
  int cnt = 0;
208
241
 
209
242
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
210
- mdbxs_open_dbi(txn, dbi_name, &dbi);
243
+ mdbxs_open_dbi(txn, folder_name, &dbi);
211
244
  res = mdbx_dbi_stat(txn, dbi, &stat, sizeof(MDBX_stat));
212
245
  cnt = stat.ms_entries;
213
246
  mdbxs_abort_txn(store, txn, del_env_txn);
@@ -218,7 +251,7 @@ static int mdbxs_count(FrtStore *store) {
218
251
  return cnt;
219
252
  }
220
253
 
221
- static void mdbxs_each(FrtStore *store, void (*func)(const char *fname, void *arg), void *arg) {
254
+ static void mdbxs_each(FrtStore *store, const char *folder_name, void (*func)(const char *fname, void *arg), void *arg) {
222
255
  MDBX_txn *txn = NULL;
223
256
  MDBX_dbi dbi;
224
257
  MDBX_cursor *cursor = NULL;
@@ -230,7 +263,7 @@ static void mdbxs_each(FrtStore *store, void (*func)(const char *fname, void *ar
230
263
  val.iov_len = 0;
231
264
 
232
265
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
233
- mdbxs_open_dbi(txn, dbi_name, &dbi);
266
+ mdbxs_open_dbi(txn, folder_name, &dbi);
234
267
  mdbxs_open_cursor(txn, dbi, &cursor);
235
268
 
236
269
  int op = MDBX_FIRST;
@@ -252,7 +285,7 @@ static void mdbxs_each(FrtStore *store, void (*func)(const char *fname, void *ar
252
285
  mdbxs_commit_txn(store, txn, del_env_txn);
253
286
  }
254
287
 
255
- static void mdbxs_clear_locks(FrtStore *store) {
288
+ static void mdbxs_clear_locks(FrtStore *store, const char *folder_name) {
256
289
  MDBX_txn *txn = NULL;
257
290
  MDBX_dbi dbi;
258
291
  MDBX_cursor *cursor = NULL;
@@ -264,7 +297,7 @@ static void mdbxs_clear_locks(FrtStore *store) {
264
297
  val.iov_len = 0;
265
298
 
266
299
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
267
- mdbxs_open_dbi(txn, dbi_name, &dbi);
300
+ mdbxs_open_dbi(txn, folder_name, &dbi);
268
301
  mdbxs_open_cursor(txn, dbi, &cursor);
269
302
 
270
303
  int op = MDBX_FIRST;
@@ -303,7 +336,7 @@ static bool mdbxs_is_locked(FrtStore *store, MDBX_val *key, MDBX_txn *txn, MDBX_
303
336
  return false;
304
337
  }
305
338
 
306
- static void mdbxs_clear(FrtStore *store) {
339
+ static void mdbxs_clear(FrtStore *store, const char *folder_name) {
307
340
  MDBX_txn *txn = NULL;
308
341
  MDBX_dbi dbi;
309
342
  MDBX_cursor *cursor = NULL;
@@ -315,7 +348,7 @@ static void mdbxs_clear(FrtStore *store) {
315
348
  val.iov_len = 0;
316
349
 
317
350
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
318
- mdbxs_open_dbi(txn, dbi_name, &dbi);
351
+ mdbxs_open_dbi(txn, folder_name, &dbi);
319
352
  mdbxs_open_cursor(txn, dbi, &cursor);
320
353
 
321
354
  int op = MDBX_FIRST;
@@ -333,7 +366,7 @@ static void mdbxs_clear(FrtStore *store) {
333
366
  * Clear all files which belong to the index. Use mdbxs_clear to clear the
334
367
  * directory regardless of the files origin.
335
368
  */
336
- static void mdbxs_clear_all(FrtStore *store) {
369
+ static void mdbxs_clear_all(FrtStore *store, const char *folder_name) {
337
370
  MDBX_txn *txn = NULL;
338
371
  MDBX_dbi dbi;
339
372
  MDBX_cursor *cursor = NULL;
@@ -345,7 +378,7 @@ static void mdbxs_clear_all(FrtStore *store) {
345
378
  val.iov_len = 0;
346
379
 
347
380
  bool del_env_txn = mdbxs_begin_txn(store, &txn);
348
- mdbxs_open_dbi(txn, dbi_name, &dbi);
381
+ mdbxs_open_dbi(txn, folder_name, &dbi);
349
382
  mdbxs_open_cursor(txn, dbi, &cursor);
350
383
 
351
384
  int op = MDBX_FIRST;
@@ -357,7 +390,7 @@ static void mdbxs_clear_all(FrtStore *store) {
357
390
  mdbx_cursor_close(cursor);
358
391
  mdbxs_commit_txn(store, txn, del_env_txn);
359
392
 
360
- mdbxs_clear_locks(store);
393
+ mdbxs_clear_locks(store, folder_name);
361
394
  }
362
395
 
363
396
  /**
@@ -369,12 +402,12 @@ static void mdbxs_clear_all(FrtStore *store) {
369
402
  static void mdbxs_destroy(FrtStore *store) {
370
403
  FRT_TRY
371
404
  if (store->dir.mdbx) {
372
- mdbxs_clear_locks(store);
405
+ // mdbxs_clear_locks(store);
373
406
  int res = mdbx_env_close(store->dir.mdbx->env);
374
407
  if (res != MDBX_SUCCESS) {
375
408
  fprintf(stderr, "closing env '%s' failed, error: %i\n", store->dir.mdbx->path, res);
376
409
  }
377
- free(store->dir.mdbx->path);
410
+ free((void *)store->dir.mdbx->path);
378
411
  free(store->dir.mdbx);
379
412
  store->dir.mdbx = NULL;
380
413
  }
@@ -383,7 +416,7 @@ static void mdbxs_destroy(FrtStore *store) {
383
416
  FRT_XENDTRY
384
417
  }
385
418
 
386
- static frt_off_t mdbxs_length(FrtStore *store, const char *filename) {
419
+ static frt_off_t mdbxs_length(FrtStore *store, const char *folder_name, const char *filename) {
387
420
  frt_off_t len = 0;
388
421
  MDBX_txn *txn = NULL;
389
422
  MDBX_dbi dbi;
@@ -395,7 +428,7 @@ static frt_off_t mdbxs_length(FrtStore *store, const char *filename) {
395
428
  val.iov_len = 0;
396
429
 
397
430
  bool del_env_txn = mdbxs_begin_ro_txn(store, &txn);
398
- mdbxs_open_dbi(txn, dbi_name, &dbi);
431
+ mdbxs_open_dbi(txn, folder_name, &dbi);
399
432
  int res = mdbx_get(txn, dbi, &key, &val);
400
433
  if (res != MDBX_SUCCESS) {
401
434
  mdbxs_abort_txn(store, txn, del_env_txn);
@@ -411,7 +444,7 @@ static void mdbxso_close_i(FrtOutStream *os) {
411
444
  MDBX_dbi dbi;
412
445
 
413
446
  bool del_env_txn = mdbxs_begin_txn(os->store, &txn);
414
- mdbxs_open_dbi(txn, dbi_name, &dbi);
447
+ mdbxs_open_dbi(txn, os->folder_name, &dbi);
415
448
 
416
449
  FrtRAMFile *rf = os->file.rf;
417
450
 
@@ -457,22 +490,10 @@ static const struct FrtOutStreamMethods MDBXS_OUT_STREAM_METHODS = {
457
490
  mdbxso_close_i
458
491
  };
459
492
 
460
- static FrtOutStream *mdbxs_new_output(FrtStore *store, const char *filename) {
461
- MDBX_txn *txn = NULL;
462
- MDBX_dbi dbi;
463
- MDBX_val key, val;
464
- key.iov_base = (char *)filename;
465
- key.iov_len = strlen(filename);
466
- val.iov_base = NULL;
467
- val.iov_len = 0;
468
-
469
- bool del_env_txn = mdbxs_begin_txn(store, &txn);
470
- mdbxs_open_dbi(txn, dbi_name, &dbi);
471
- mdbxs_put(txn, dbi, &key, &val);
472
- mdbxs_commit_txn(store, txn, del_env_txn);
473
-
493
+ static FrtOutStream *mdbxs_new_output(FrtStore *store, const char *folder_name, const char *filename) {
474
494
  FrtRAMFile *rf = rf_new(filename);
475
495
  FrtOutStream *os = frt_os_new();
496
+ os->folder_name = frt_estrdup(folder_name);
476
497
  os->pointer = 0;
477
498
  os->file.rf = rf;
478
499
  os->m = &MDBXS_OUT_STREAM_METHODS;
@@ -487,7 +508,7 @@ static const struct FrtInStreamMethods RAM_IN_STREAM_METHODS = {
487
508
  rami_close_i
488
509
  };
489
510
 
490
- static FrtInStream *mdbxs_open_input(FrtStore *store, const char *filename) {
511
+ static FrtInStream *mdbxs_open_input(FrtStore *store, const char *folder_name, const char *filename) {
491
512
  MDBX_txn *txn = NULL;
492
513
  MDBX_dbi dbi;
493
514
  MDBX_val key, val;
@@ -500,7 +521,7 @@ static FrtInStream *mdbxs_open_input(FrtStore *store, const char *filename) {
500
521
  FrtInStream *is;
501
522
 
502
523
  bool del_env_txn = mdbxs_begin_ro_txn(store, &txn);
503
- mdbxs_open_dbi(txn, dbi_name, &dbi);
524
+ mdbxs_open_dbi(txn, folder_name, &dbi);
504
525
  if (mdbx_get(txn, dbi, &key, &val) != MDBX_SUCCESS) {
505
526
  mdbxs_abort_txn(store, txn, del_env_txn);
506
527
  FRT_RAISE(FRT_FILE_NOT_FOUND_ERROR, "tried to open '%s' but it doesn't exist", filename);
@@ -537,6 +558,7 @@ static FrtInStream *mdbxs_open_input(FrtStore *store, const char *filename) {
537
558
  mdbxs_abort_txn(store, txn, del_env_txn);
538
559
 
539
560
  is = frt_is_new();
561
+ is->folder_name = frt_estrdup(folder_name);
540
562
  is->f->file.rf = rf;
541
563
  is->f->ref_cnt = 1;
542
564
  is->d.pointer = 0;
@@ -551,10 +573,10 @@ static int mdbxs_lock_obtain(FrtLock *lock) {
551
573
  MDBX_txn *txn = NULL;
552
574
  MDBX_dbi dbi;
553
575
  bool del_env_txn = mdbxs_begin_txn(lock->store, &txn);
554
- mdbxs_open_dbi(txn, dbi_name, &dbi);
576
+ mdbxs_open_dbi(txn, lock->folder_name, &dbi);
555
577
 
556
578
  MDBX_val key, val;
557
- key.iov_base = lock->name;
579
+ key.iov_base = (void *)lock->name;
558
580
  key.iov_len = strlen(lock->name);
559
581
  int trys = LOCK_OBTAIN_TIMEOUT;
560
582
  bool is_locked = mdbxs_is_locked(lock->store, &key, txn, dbi);
@@ -566,7 +588,7 @@ static int mdbxs_lock_obtain(FrtLock *lock) {
566
588
  frt_micro_sleep(10000);
567
589
 
568
590
  del_env_txn = mdbxs_begin_txn(lock->store, &txn);
569
- mdbxs_open_dbi(txn, dbi_name, &dbi);
591
+ mdbxs_open_dbi(txn, lock->folder_name, &dbi);
570
592
 
571
593
  is_locked = mdbxs_is_locked(lock->store, &key, txn, dbi);
572
594
  }
@@ -588,11 +610,11 @@ static int mdbxs_lock_is_locked(FrtLock *lock) {
588
610
  MDBX_dbi dbi;
589
611
 
590
612
  MDBX_val key;
591
- key.iov_base = lock->name;
613
+ key.iov_base = (void *)lock->name;
592
614
  key.iov_len = strlen(lock->name);
593
615
 
594
616
  bool del_env_txn = mdbxs_begin_ro_txn(lock->store, &txn);
595
- mdbxs_open_dbi(txn, dbi_name, &dbi);
617
+ mdbxs_open_dbi(txn, lock->folder_name, &dbi);
596
618
  res = mdbxs_is_locked(lock->store, &key, txn, dbi);
597
619
  mdbxs_abort_txn(lock->store, txn, del_env_txn);
598
620
 
@@ -604,19 +626,20 @@ static void mdbxs_lock_release(FrtLock *lock) {
604
626
  MDBX_dbi dbi;
605
627
 
606
628
  MDBX_val key;
607
- key.iov_base = lock->name;
629
+ key.iov_base = (void *)lock->name;
608
630
  key.iov_len = strlen(lock->name);
609
631
 
610
632
  bool del_env_txn = mdbxs_begin_txn(lock->store, &txn);
611
- mdbxs_open_dbi(txn, dbi_name, &dbi);
633
+ mdbxs_open_dbi(txn, lock->folder_name, &dbi);
612
634
  mdbxs_del(txn, dbi, &key, NULL);
613
635
  mdbxs_commit_txn(lock->store, txn, del_env_txn);
614
636
  }
615
637
 
616
- static FrtLock *mdbxs_open_lock_i(FrtStore *store, const char *lockname) {
638
+ static FrtLock *mdbxs_open_lock_i(FrtStore *store, const char *folder_name, const char *lockname) {
617
639
  FrtLock *lock = FRT_ALLOC(FrtLock);
618
640
  char lname[100];
619
641
  snprintf(lname, 100, "%s%s.lck", FRT_LOCK_PREFIX, lockname);
642
+ lock->folder_name = frt_estrdup(folder_name);
620
643
  lock->name = frt_estrdup(lname);
621
644
  lock->store = store;
622
645
  FRT_REF(store);
@@ -630,7 +653,7 @@ static FrtLock *mdbxs_open_lock_i(FrtStore *store, const char *lockname) {
630
653
  static void mdbxs_close_lock_i(FrtLock *lock) {
631
654
  mdbxs_lock_release(lock);
632
655
  frt_store_close(lock->store);
633
- free(lock->name);
656
+ free((void *)lock->name);
634
657
  free(lock);
635
658
  }
636
659
 
@@ -677,11 +700,12 @@ static FrtStore *mdbx_store_new(const char *pathname) {
677
700
 
678
701
  MDBX_env *env = NULL;
679
702
  int res;
703
+
680
704
  res = mdbx_env_create(&env);
681
705
  if (res != MDBX_SUCCESS) {
682
706
  FRT_RAISE(FRT_IO_ERROR, "creating env '%s' failed, error: %i\n", pathname, res);
683
707
  }
684
- res = mdbx_env_set_maxdbs(env, 2);
708
+ res = mdbx_env_set_maxdbs(env, 8);
685
709
  if (res != MDBX_SUCCESS) {
686
710
  mdbx_env_close(env);
687
711
  FRT_RAISE(FRT_IO_ERROR, "setting maxdbs for '%s' failed, error: %i\n", pathname, res);
@@ -689,7 +713,7 @@ static FrtStore *mdbx_store_new(const char *pathname) {
689
713
  res = mdbx_env_set_geometry(env, -1, -1, 40000000000, 4*1024*1024, 4*1024*1024, MDBX_MAX_PAGESIZE);
690
714
  if (res != MDBX_SUCCESS) {
691
715
  mdbx_env_close(env);
692
- FRT_RAISE(FRT_IO_ERROR, "setting geometrye for '%s' failed, error: %i\n", pathname, res);
716
+ FRT_RAISE(FRT_IO_ERROR, "setting geometry for '%s' failed, error: %i\n", pathname, res);
693
717
  }
694
718
  res = mdbx_env_open(env, pathname, MDBX_ENV_DEFAULTS, new_store->file_mode);
695
719
  if (res != MDBX_SUCCESS) {
@@ -700,32 +724,40 @@ static FrtStore *mdbx_store_new(const char *pathname) {
700
724
  FRT_RAISE(FRT_IO_ERROR, "opening env '%s' failed, error: %i\n", pathname, res);
701
725
  }
702
726
  }
727
+
703
728
  MDBXInfo *mdbx = FRT_ALLOC(MDBXInfo);
704
729
  mdbx->env = env;
705
730
  mdbx->path = frt_estrdup(pathname);
706
-
707
- new_store->dir.mdbx = mdbx;
708
- new_store->touch = &mdbxs_touch;
709
- new_store->exists = &mdbxs_exists;
710
- new_store->remove = &mdbxs_remove;
711
- new_store->rename = &mdbxs_rename;
712
- new_store->count = &mdbxs_count;
713
- new_store->close_i = &mdbxs_close_i;
714
- new_store->clear = &mdbxs_clear;
715
- new_store->clear_all = &mdbxs_clear_all;
716
- new_store->clear_locks = &mdbxs_clear_locks;
717
- new_store->length = &mdbxs_length;
718
- new_store->each = &mdbxs_each;
719
- new_store->new_output = &mdbxs_new_output;
720
- new_store->open_input = &mdbxs_open_input;
721
- new_store->open_lock_i = &mdbxs_open_lock_i;
722
- new_store->close_lock_i = &mdbxs_close_lock_i;
731
+ // mdbx->temp_store = frt_open_ram_store(NULL);
732
+
733
+ new_store->dir.mdbx = mdbx;
734
+ new_store->create_folder = &mdbxs_create_folder;
735
+ new_store->remove_folder = &mdbxs_remove_folder;
736
+ new_store->touch = &mdbxs_touch;
737
+ new_store->exists = &mdbxs_exists;
738
+ new_store->remove = &mdbxs_remove;
739
+ new_store->rename = &mdbxs_rename;
740
+ new_store->count = &mdbxs_count;
741
+ new_store->close_i = &mdbxs_close_i;
742
+ new_store->clear = &mdbxs_clear;
743
+ new_store->clear_all = &mdbxs_clear_all;
744
+ new_store->clear_locks = &mdbxs_clear_locks;
745
+ new_store->length = &mdbxs_length;
746
+ new_store->each = &mdbxs_each;
747
+ new_store->new_output = &mdbxs_new_output;
748
+ new_store->open_input = &mdbxs_open_input;
749
+ new_store->open_lock_i = &mdbxs_open_lock_i;
750
+ new_store->close_lock_i = &mdbxs_close_lock_i;
723
751
  return new_store;
724
752
  }
725
753
 
726
754
  FrtStore *frt_open_mdbx_store(const char *pathname) {
727
755
  FrtStore *store = NULL;
728
756
 
757
+ if (!keysize_max) {
758
+ keysize_max = mdbx_limits_keysize_max(mdbx_limits_pgsize_min(), MDBX_DB_DEFAULTS);
759
+ }
760
+
729
761
  if (!mdbx_stores) {
730
762
  mdbx_stores = frt_h_new_str(free, (frt_free_ft)mdbxs_destroy);
731
763
  frt_register_for_cleanup(mdbx_stores, (frt_free_ft)frt_h_destroy);
@@ -2,8 +2,7 @@
2
2
  #include "frt_mempool.h"
3
3
  #include <string.h>
4
4
 
5
- FrtMemoryPool *frt_mp_new_capa(int chuck_size, int init_buf_capa)
6
- {
5
+ FrtMemoryPool *frt_mp_new_capa(int chuck_size, int init_buf_capa) {
7
6
  FrtMemoryPool *mp = FRT_ALLOC(FrtMemoryPool);
8
7
  mp->chunk_size = chuck_size;
9
8
  mp->buf_capa = init_buf_capa;
@@ -20,8 +19,7 @@ FrtMemoryPool *frt_mp_new(void) {
20
19
  return frt_mp_new_capa(FRT_MP_BUF_SIZE, FRT_MP_INIT_CAPA);
21
20
  }
22
21
 
23
- void *frt_mp_alloc(FrtMemoryPool *mp, int size)
24
- {
22
+ void *frt_mp_alloc(FrtMemoryPool *mp, int size) {
25
23
  char *p;
26
24
  p = mp->curr_buffer + mp->pointer;
27
25
  #if defined POSH_OS_SOLARIS || defined POSH_OS_SUNOS
@@ -45,38 +43,32 @@ void *frt_mp_alloc(FrtMemoryPool *mp, int size)
45
43
  return p;
46
44
  }
47
45
 
48
- char *frt_mp_strdup(FrtMemoryPool *mp, const char *str)
49
- {
46
+ char *frt_mp_strdup(FrtMemoryPool *mp, const char *str) {
50
47
  int len = strlen(str) + 1;
51
48
  return (char *)memcpy(frt_mp_alloc(mp, len), str, len);
52
49
  }
53
50
 
54
- char *frt_mp_strndup(FrtMemoryPool *mp, const char *str, int len)
55
- {
51
+ char *frt_mp_strndup(FrtMemoryPool *mp, const char *str, int len) {
56
52
  char *s = (char *)memcpy(frt_mp_alloc(mp, len + 1), str, len);
57
53
  s[len] = '\0';
58
54
  return s;
59
55
  }
60
56
 
61
- void *frt_mp_memdup(FrtMemoryPool *mp, const void *p, int len)
62
- {
57
+ void *frt_mp_memdup(FrtMemoryPool *mp, const void *p, int len) {
63
58
  return memcpy(frt_mp_alloc(mp, len), p, len);
64
59
  }
65
60
 
66
- int frt_mp_used(FrtMemoryPool *mp)
67
- {
61
+ int frt_mp_used(FrtMemoryPool *mp) {
68
62
  return mp->buf_pointer * mp->chunk_size + mp->pointer;
69
63
  }
70
64
 
71
- void frt_mp_reset(FrtMemoryPool *mp)
72
- {
65
+ void frt_mp_reset(FrtMemoryPool *mp) {
73
66
  mp->buf_pointer = 0;
74
67
  mp->pointer = 0;
75
68
  mp->curr_buffer = mp->buffers[0];
76
69
  }
77
70
 
78
- void frt_mp_destroy(FrtMemoryPool *mp)
79
- {
71
+ void frt_mp_destroy(FrtMemoryPool *mp) {
80
72
  int i;
81
73
  for (i = 0; i < mp->buf_alloc; i++) {
82
74
  free(mp->buffers[i]);