isomorfeus-ferret 0.17.2 → 0.17.3

Sign up to get free protection for your applications and to get access to all the features.
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]);