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
@@ -20,20 +20,17 @@ FrtTerm *frt_term_new(ID field, const char *text) {
20
20
  return t;
21
21
  }
22
22
 
23
- void frt_term_destroy(FrtTerm *self)
24
- {
23
+ void frt_term_destroy(FrtTerm *self) {
25
24
  free(self->text);
26
25
  free(self);
27
26
  }
28
27
 
29
- int frt_term_eq(const void *t1, const void *t2)
30
- {
28
+ int frt_term_eq(const void *t1, const void *t2) {
31
29
  return ((strcmp(((FrtTerm *)t1)->text, ((FrtTerm *)t2)->text) == 0) &&
32
30
  (((FrtTerm *)t1)->field == ((FrtTerm *)t2)->field));
33
31
  }
34
32
 
35
- unsigned long long frt_term_hash(const void *t)
36
- {
33
+ unsigned long long frt_term_hash(const void *t) {
37
34
  return frt_str_hash(((FrtTerm *)t)->text) * frt_str_hash(rb_id2name(((FrtTerm *)t)->field));
38
35
  }
39
36
 
@@ -49,20 +46,17 @@ static float simdef_length_norm(FrtSimilarity *s, ID field, int num_terms) {
49
46
  return (float)(1.0 / sqrt(num_terms));
50
47
  }
51
48
 
52
- static float simdef_query_norm(struct FrtSimilarity *s, float sum_of_squared_weights)
53
- {
49
+ static float simdef_query_norm(struct FrtSimilarity *s, float sum_of_squared_weights) {
54
50
  (void)s;
55
51
  return (float)(1.0 / sqrt(sum_of_squared_weights));
56
52
  }
57
53
 
58
- static float simdef_tf(struct FrtSimilarity *s, float freq)
59
- {
54
+ static float simdef_tf(struct FrtSimilarity *s, float freq) {
60
55
  (void)s;
61
56
  return (float)sqrt(freq);
62
57
  }
63
58
 
64
- static float simdef_sloppy_freq(struct FrtSimilarity *s, int distance)
65
- {
59
+ static float simdef_sloppy_freq(struct FrtSimilarity *s, int distance) {
66
60
  (void)s;
67
61
  return (float)(1.0 / (double)(distance + 1));
68
62
  }
@@ -84,31 +78,26 @@ static float simdef_idf_phrase(struct FrtSimilarity *s, ID field, FrtPhrasePosit
84
78
  return idf;
85
79
  }
86
80
 
87
- static float simdef_idf(struct FrtSimilarity *s, int doc_freq, int num_docs)
88
- {
81
+ static float simdef_idf(struct FrtSimilarity *s, int doc_freq, int num_docs) {
89
82
  (void)s;
90
83
  return (float)(log((float)num_docs/(float)(doc_freq+1)) + 1.0);
91
84
  }
92
85
 
93
- static float simdef_coord(struct FrtSimilarity *s, int overlap, int max_overlap)
94
- {
86
+ static float simdef_coord(struct FrtSimilarity *s, int overlap, int max_overlap) {
95
87
  (void)s;
96
88
  return (float)((double)overlap / (double)max_overlap);
97
89
  }
98
90
 
99
- static float simdef_decode_norm(struct FrtSimilarity *s, frt_uchar b)
100
- {
91
+ static float simdef_decode_norm(struct FrtSimilarity *s, frt_uchar b) {
101
92
  return s->norm_table[b];
102
93
  }
103
94
 
104
- static frt_uchar simdef_encode_norm(struct FrtSimilarity *s, float f)
105
- {
95
+ static frt_uchar simdef_encode_norm(struct FrtSimilarity *s, float f) {
106
96
  (void)s;
107
97
  return frt_float2byte(f);
108
98
  }
109
99
 
110
- static void simdef_destroy(FrtSimilarity *s)
111
- {
100
+ static void simdef_destroy(FrtSimilarity *s) {
112
101
  (void)s;
113
102
  /* nothing to do here */
114
103
  }
@@ -25,8 +25,7 @@ extern unsigned long long frt_term_hash(const void *t);
25
25
  *
26
26
  ***************************************************************************/
27
27
 
28
- typedef struct FrtPhrasePosition
29
- {
28
+ typedef struct FrtPhrasePosition {
30
29
  int pos;
31
30
  char **terms;
32
31
  } FrtPhrasePosition;
@@ -1,9 +1,6 @@
1
1
  #include "frt_store.h"
2
2
  #include <string.h>
3
3
 
4
-
5
-
6
-
7
4
  /*
8
5
  * TODO: add try finally
9
6
  */
@@ -18,8 +15,8 @@ void frt_with_lock(FrtLock *lock, void (*func)(void *arg), void *arg) {
18
15
  /*
19
16
  * TODO: add try finally
20
17
  */
21
- void frt_with_lock_name(FrtStore *store, const char *lock_name, void (*func)(void *arg), void *arg) {
22
- FrtLock *lock = store->open_lock_i(store, lock_name);
18
+ void frt_with_lock_name(FrtStore *store, const char *folder_name, const char *lock_name, void (*func)(void *arg), void *arg) {
19
+ FrtLock *lock = store->open_lock_i(store, folder_name, lock_name);
23
20
  if (!lock->obtain(lock)) {
24
21
  FRT_RAISE(FRT_LOCK_ERROR, "couldn't obtain lock \"%s\"", lock->name);
25
22
  }
@@ -28,20 +25,17 @@ void frt_with_lock_name(FrtStore *store, const char *lock_name, void (*func)(voi
28
25
  store->close_lock_i(lock);
29
26
  }
30
27
 
31
- FrtLock *frt_open_lock(FrtStore *store, const char *lockname)
32
- {
33
- FrtLock *lock = store->open_lock_i(store, lockname);
28
+ FrtLock *frt_open_lock(FrtStore *store, const char *folder_name, const char *lockname) {
29
+ FrtLock *lock = store->open_lock_i(store, folder_name, lockname);
34
30
  frt_hs_add(store->locks, lock);
35
31
  return lock;
36
32
  }
37
33
 
38
- void frt_close_lock(FrtLock *lock)
39
- {
34
+ void frt_close_lock(FrtLock *lock) {
40
35
  frt_hs_del(lock->store->locks, lock);
41
36
  }
42
37
 
43
- static void frt_close_lock_i(FrtLock *lock)
44
- {
38
+ static void frt_close_lock_i(FrtLock *lock) {
45
39
  lock->store->close_lock_i(lock);
46
40
  }
47
41
 
@@ -94,14 +88,12 @@ void frt_store_close(FrtStore *store) {
94
88
  * @param filename the name of the file to check
95
89
  * @return 1 (true) if the file is a lock file, 0 (false) otherwise
96
90
  */
97
- int frt_file_is_lock(const char *filename)
98
- {
91
+ int frt_file_is_lock(const char *filename) {
99
92
  int start = (int) strlen(filename) - 4;
100
93
  return ((start > 0) && (strcmp(FRT_LOCK_EXT, &filename[start]) == 0));
101
94
  }
102
95
 
103
- void frt_is2os_copy_bytes(FrtInStream *is, FrtOutStream *os, int cnt)
104
- {
96
+ void frt_is2os_copy_bytes(FrtInStream *is, FrtOutStream *os, int cnt) {
105
97
  int len;
106
98
  frt_uchar buf[FRT_BUFFER_SIZE];
107
99
 
@@ -112,8 +104,7 @@ void frt_is2os_copy_bytes(FrtInStream *is, FrtOutStream *os, int cnt)
112
104
  }
113
105
  }
114
106
 
115
- void frt_is2os_copy_vints(FrtInStream *is, FrtOutStream *os, int cnt)
116
- {
107
+ void frt_is2os_copy_vints(FrtInStream *is, FrtOutStream *os, int cnt) {
117
108
  frt_uchar b;
118
109
  for (; cnt > 0; cnt--) {
119
110
  while (((b = frt_is_read_byte(is)) & 0x80) != 0) {
@@ -126,8 +117,7 @@ void frt_is2os_copy_vints(FrtInStream *is, FrtOutStream *os, int cnt)
126
117
  /**
127
118
  * Test argument used to test the store->each function
128
119
  */
129
- struct FileNameListArg
130
- {
120
+ struct FileNameListArg {
131
121
  int count;
132
122
  int size;
133
123
  int total_len;
@@ -137,8 +127,7 @@ struct FileNameListArg
137
127
  /**
138
128
  * Test function used to test store->each function
139
129
  */
140
- static void add_file_name(const char *fname, void *arg)
141
- {
130
+ static void add_file_name(const char *fname, void *arg) {
142
131
  struct FileNameListArg *fnl = (struct FileNameListArg *)arg;
143
132
  if (fnl->count >= fnl->size) {
144
133
  fnl->size *= 2;
@@ -148,8 +137,7 @@ static void add_file_name(const char *fname, void *arg)
148
137
  fnl->total_len += strlen(fname) + 2;
149
138
  }
150
139
 
151
- char *frt_store_to_s(FrtStore *store)
152
- {
140
+ char *frt_store_folder_to_s(FrtStore *store, const char *folder_name) {
153
141
  struct FileNameListArg fnl;
154
142
  char *buf, *b;
155
143
  int i;
@@ -158,7 +146,7 @@ char *frt_store_to_s(FrtStore *store)
158
146
  fnl.total_len = 10;
159
147
  fnl.files = FRT_ALLOC_N(char *, 16);
160
148
 
161
- store->each(store, &add_file_name, &fnl);
149
+ store->each(store, folder_name, &add_file_name, &fnl);
162
150
  qsort(fnl.files, fnl.count, sizeof(char *), &frt_scmp);
163
151
  b = buf = FRT_ALLOC_N(char, fnl.total_len);
164
152
 
@@ -21,7 +21,8 @@ typedef struct FrtStore FrtStore;
21
21
  typedef struct FrtLock FrtLock;
22
22
 
23
23
  struct FrtLock {
24
- char *name;
24
+ const char *folder_name;
25
+ const char *name;
25
26
  FrtStore *store;
26
27
  int (*obtain)(FrtLock *lock);
27
28
  int (*is_locked)(FrtLock *lock);
@@ -30,8 +31,9 @@ struct FrtLock {
30
31
  };
31
32
 
32
33
  typedef struct MDBXInfo {
33
- MDBX_env *env;
34
- char *path;
34
+ MDBX_env *env;
35
+ const char *path;
36
+ FrtStore *temp_store;
35
37
  } MDBXInfo;
36
38
 
37
39
  struct FrtStore {
@@ -39,7 +41,6 @@ struct FrtStore {
39
41
  pthread_mutex_t mutex_i; /* for internal use only */
40
42
  pthread_mutex_t mutex; /* external mutex for use outside */
41
43
  union {
42
- char *path; /* for fs_store only */
43
44
  FrtHash *ht; /* for ram_store only */
44
45
  MDBXInfo *mdbx; /* for mdbx store only */
45
46
  } dir;
@@ -51,52 +52,76 @@ struct FrtStore {
51
52
  FrtHashSet *locks;
52
53
 
53
54
  /**
54
- * Create the file +filename+ in the +store+.
55
+ * Create the folder +folder_name+ in the store if it
56
+ * doesn't exist.
55
57
  *
56
- * @param store self
58
+ * @param self store
59
+ * @param folder_name the name of the folder to create
60
+ * @raise FRT_IO_ERROR if the folder cannot be created
61
+ */
62
+ void (*create_folder)(FrtStore *self, const char *folder_name);
63
+
64
+ /**
65
+ * Remove the folder +folder_name+ from the store.
66
+ *
67
+ * @param self store
68
+ * @param folder_name the name of the folder to remove
69
+ * @raise FRT_IO_ERROR if the folder cannot be created
70
+ */
71
+ void (*remove_folder)(FrtStore *self, const char *folder_name);
72
+
73
+ /**
74
+ * Create the file +filename+ in the store.
75
+ *
76
+ * @param self store
77
+ * @param folder_name the name of the folder
57
78
  * @param filename the name of the file to create
58
79
  * @raise FRT_IO_ERROR if the file cannot be created
59
80
  */
60
- void (*touch)(FrtStore *store, const char *filename);
81
+ void (*touch)(FrtStore *self, const char *folder_name, const char *filename);
61
82
 
62
83
  /**
63
- * Return true if a file of name +filename+ exists in +store+.
84
+ * Return true if a file of name +filename+ exists in store.
64
85
  *
65
- * @param store self
86
+ * @param self store
87
+ * @param folder_name the name of the folder
66
88
  * @param filename the name of the file to check for
67
89
  * @returns true if the file exists
68
- * @raise FRT_IO_ERROR if there is an error checking for the files existance
90
+ * @raise FRT_IO_ERROR if there is an error checking for the files existence
69
91
  */
70
- int (*exists)(FrtStore *store, const char *filename);
92
+ int (*exists)(FrtStore *self, const char *folder_name, const char *filename);
71
93
 
72
94
  /**
73
- * Remove the file +filename+ from the +store+
95
+ * Remove the file +filename+ from the store.
74
96
  *
75
- * @param store self
97
+ * @param self store
98
+ * @param folder_name the name of the folder
76
99
  * @param filename the name of the file to remove
77
100
  * @returns On success, zero is returned. On error, -1 is returned, and errno
78
101
  * is set appropriately.
79
102
  */
80
- int (*remove)(FrtStore *store, const char *filename);
103
+ int (*remove)(FrtStore *self, const char *folder_name, const char *filename);
81
104
 
82
105
  /**
83
- * Rename the file in the +store+ from the name +from+ to the name +to+.
106
+ * Rename the file in the store from the name +from+ to the name +to+.
84
107
  *
85
- * @param store self
108
+ * @param self store
109
+ * @param folder_name the name of the folder
86
110
  * @param from the name of the file to rename
87
111
  * @param to the new name of the file
88
112
  * @raise FRT_IO_ERROR if there is an error renaming the file
89
113
  */
90
- void (*rename)(FrtStore *store, const char *from, const char *to);
114
+ void (*rename)(FrtStore *self, const char *folder_name, const char *from, const char *to);
91
115
 
92
116
  /**
93
117
  * Returns the number of files in the store.
94
118
  *
95
- * @param store self
119
+ * @param self store
120
+ * @param folder_name the name of the folder
96
121
  * @return the number of files in the store
97
122
  * @raise FRT_IO_ERROR if there is an error opening the directory
98
123
  */
99
- int (*count)(FrtStore *store);
124
+ int (*count)(FrtStore *self, const char *folder_name);
100
125
 
101
126
  /**
102
127
  * Call the function +func+ with each filename in the store and the arg
@@ -104,80 +129,87 @@ struct FrtStore {
104
129
  * as the argument. If you need to pass more than one argument, you should
105
130
  * pass a struct.
106
131
  *
107
- * @param store self
132
+ * @param self store
133
+ * @param folder_name the name of the folder
108
134
  * @param func the function to call with each files name and the +arg+
109
135
  * passed
110
136
  * @param arg the argument to pass to the function
111
137
  * @raise FRT_IO_ERROR if there is an error opening the directory
112
138
  */
113
- void (*each)(FrtStore *store, void (*func)(const char *fname, void *arg),
114
- void *arg);
139
+ void (*each)(FrtStore *self, const char *folder_name, void (*func)(const char *fname, void *arg), void *arg);
115
140
 
116
141
  /**
117
142
  * Clear all the locks in the store.
118
143
  *
119
- * @param store self
144
+ * @param self store
145
+ * @param folder_name the name of the folder
120
146
  * @raise FRT_IO_ERROR if there is an error opening the directory
121
147
  */
122
- void (*clear_locks)(FrtStore *store);
148
+ void (*clear_locks)(FrtStore *self, const char *folder_name);
123
149
 
124
150
  /**
125
151
  * Clear all files from the store except the lock files.
126
152
  *
127
- * @param store self
153
+ * @param self store
154
+ * @param folder_name the name of the folder
128
155
  * @raise FRT_IO_ERROR if there is an error deleting the files
129
156
  */
130
- void (*clear)(FrtStore *store);
157
+ void (*clear)(FrtStore *self, const char *folder_name);
131
158
 
132
159
  /**
133
160
  * Clear all files from the store including the lock files.
134
161
  *
135
- * @param store self
162
+ * @param self store
163
+ * @param folder_name the name of the folder
136
164
  * @raise FRT_IO_ERROR if there is an error deleting the files
137
165
  */
138
- void (*clear_all)(FrtStore *store);
166
+ void (*clear_all)(FrtStore *self, const char *folder_name);
139
167
 
140
168
  /**
141
- * Return the length of the file +filename+ in +store+
169
+ * Return the length of the file +filename+ in +store+.
142
170
  *
143
- * @param store self
171
+ * @param self store
172
+ * @param folder_name the name of the folder
144
173
  * @param the name of the file to check the length of
145
174
  * @return the length of the file in bytes
146
175
  * @raise FRT_IO_ERROR if there is an error checking the file length
147
176
  */
148
- frt_off_t (*length)(FrtStore *store, const char *filename);
177
+ frt_off_t (*length)(FrtStore *self, const char *folder_name, const char *filename);
149
178
 
150
179
  /**
151
180
  * Allocate the resources needed for the output stream in the +store+ with
152
- * the name +filename+
181
+ * the name +filename+.
153
182
  *
154
- * @param store self
183
+ * @param self store
184
+ * @param folder_name the name of the folder
155
185
  * @param filename the name of the output stream
156
- * @return a newly allocated filestream
186
+ * @return a newly allocated file stream
157
187
  * @raise FRT_IO_ERROR if there is an error opening the output stream
158
188
  * resources
159
189
  */
160
- FrtOutStream *(*new_output)(FrtStore *store, const char *filename);
190
+ FrtOutStream *(*new_output)(FrtStore *self, const char *folder_name, const char *filename);
161
191
 
162
192
  /**
163
- * Open an input stream in the +store+ with the name +filename+
193
+ * Open an input stream in the +store+ with the name +filename+.
164
194
  *
165
- * @param store self
195
+ * @param self store
196
+ * @param folder_name the name of the folder
166
197
  * @param filename the name of the input stream
167
198
  * @raise FRT_FILE_NOT_FOUND_ERROR if the input stream cannot be opened
168
199
  */
169
- FrtInStream *(*open_input)(FrtStore *store, const char *filename);
200
+ FrtInStream *(*open_input)(FrtStore *self, const char *folder_name, const char *filename);
170
201
 
171
202
  /**
172
- * Obtain a lock on the lock +lock+
203
+ * Obtain a lock on the lock +lock+.
173
204
  *
174
- * @param store self
205
+ * @param self store
206
+ * @param folder_name the name of the folder
175
207
  * @param lock the lock to obtain
176
208
  */
177
- FrtLock *(*open_lock_i)(FrtStore *store, const char *lockname);
209
+ FrtLock *(*open_lock_i)(FrtStore *self, const char *folder_name, const char *lockname);
178
210
 
179
211
  /**
180
- * Returns true if +lock+ is locked. To test if the file is locked:wq
212
+ * Returns true if +lock+ is locked. To test if the file is locked:wq.
181
213
  *
182
214
  * @param lock the lock to test
183
215
  * @raise FRT_IO_ERROR if there is an error detecting the lock status
@@ -188,9 +220,9 @@ struct FrtStore {
188
220
  * Internal function to close the store freeing implementation specific
189
221
  * resources.
190
222
  *
191
- * @param store self
223
+ * @param self store
192
224
  */
193
- void (*close_i)(FrtStore *store);
225
+ void (*close_i)(FrtStore *self);
194
226
 
195
227
  /**
196
228
  * Reference to be used within ruby realm.
@@ -220,12 +252,13 @@ extern FrtStore *frt_open_ram_store(FrtStore *new_store);
220
252
  * method would be used for example to read an index into memory for faster
221
253
  * searching.
222
254
  *
223
- * @param store the whose contents will be copied into the newly allocated RAM
224
- * store
225
- * @param close_store close the store whose contents where copied
255
+ * @param to_store the target store
256
+ * @param from_store the store, whose contents will be copied into the newly allocated RAM store
257
+ * @param folder_name folder to be copied, will be create in the target store, if it doesn't exist
258
+ * @param close_store close the from_store whose contents where copied
226
259
  * @return a newly allocated RAM FrtStore.
227
260
  */
228
- extern FrtStore *frt_open_ram_store_and_copy(FrtStore *store, FrtStore *from_store, bool close_store);
261
+ extern FrtStore *frt_open_ram_store_and_copy(FrtStore *to_store, FrtStore *from_store, const char *folder_name, bool close_store);
229
262
 
230
263
  /*
231
264
  * == RamStore functions ==
@@ -294,7 +327,7 @@ extern void frt_with_lock(FrtLock *lock, void (*func)(void *arg), void *arg);
294
327
  * @raise FRT_IO_ERROR if the lock is already locked
295
328
  * @see frt_with_lock
296
329
  */
297
- extern void frt_with_lock_name(FrtStore *store, const char *lock_name, void (*func)(void *arg), void *arg);
330
+ extern void frt_with_lock_name(FrtStore *store, const char *folder_name, const char *lock_name, void (*func)(void *arg), void *arg);
298
331
 
299
332
  /**
300
333
  * Remove a reference to the store. If the reference count gets to zero free
@@ -325,13 +358,14 @@ extern void frt_is2os_copy_bytes(FrtInStream *is, FrtOutStream *os, int cnt);
325
358
  extern void frt_is2os_copy_vints(FrtInStream *is, FrtOutStream *os, int cnt);
326
359
 
327
360
  /**
328
- * Print the filenames in a store to a buffer.
361
+ * Print the filenames in a store folder to a buffer.
329
362
  *
330
363
  * @param store the store to get the filenames from
364
+ * @param folder_name the folder to get the filenames from
331
365
  */
332
- extern char *frt_store_to_s(FrtStore *store);
366
+ extern char *frt_store_folder_to_s(FrtStore *store, const char *folder_name);
333
367
 
334
- extern FrtLock *frt_open_lock(FrtStore *store, const char *lockname);
368
+ extern FrtLock *frt_open_lock(FrtStore *store, const char *folder_name, const char *lockname);
335
369
  extern void frt_close_lock(FrtLock *lock);
336
370
 
337
371
  /* required by submodules
@@ -10,8 +10,7 @@
10
10
  *
11
11
  ****************************************************************************/
12
12
 
13
- void frt_tv_destroy(FrtTermVector *tv)
14
- {
13
+ void frt_tv_destroy(FrtTermVector *tv) {
15
14
  int i = tv->term_cnt;
16
15
  while (i > 0) {
17
16
  i--;
@@ -23,8 +22,7 @@ void frt_tv_destroy(FrtTermVector *tv)
23
22
  free(tv);
24
23
  }
25
24
 
26
- int frt_tv_scan_to_term_index(FrtTermVector *tv, const char *term)
27
- {
25
+ int frt_tv_scan_to_term_index(FrtTermVector *tv, const char *term) {
28
26
  int lo = 0; /* search starts array */
29
27
  int hi = tv->term_cnt - 1; /* for 1st element < n, return its index */
30
28
  int mid;
@@ -37,36 +35,30 @@ int frt_tv_scan_to_term_index(FrtTermVector *tv, const char *term)
37
35
  cmp = strcmp(term, mid_term);
38
36
  if (cmp < 0) {
39
37
  hi = mid - 1;
40
- }
41
- else if (cmp > 0) {
38
+ } else if (cmp > 0) {
42
39
  lo = mid + 1;
43
- }
44
- else { /* found a match */
40
+ } else { /* found a match */
45
41
  return mid;
46
42
  }
47
43
  }
48
44
  return lo;
49
45
  }
50
46
 
51
- int frt_tv_get_term_index(FrtTermVector *tv, const char *term)
52
- {
47
+ int frt_tv_get_term_index(FrtTermVector *tv, const char *term) {
53
48
  int index = frt_tv_scan_to_term_index(tv, term);
54
49
  if (index < tv->term_cnt && (0 == strcmp(term, tv->terms[index].text))) {
55
50
  /* found term */
56
51
  return index;
57
- }
58
- else {
52
+ } else {
59
53
  return -1;
60
54
  }
61
55
  }
62
56
 
63
- FrtTVTerm *frt_tv_get_tv_term(FrtTermVector *tv, const char *term)
64
- {
57
+ FrtTVTerm *frt_tv_get_tv_term(FrtTermVector *tv, const char *term) {
65
58
  int index = frt_tv_get_term_index(tv, term);
66
59
  if (index >= 0) {
67
60
  return &(tv->terms[index]);
68
- }
69
- else {
61
+ } else {
70
62
  return NULL;
71
63
  }
72
64
  }
@@ -4,20 +4,17 @@
4
4
  #include "frt_global.h"
5
5
  #include <io.h>
6
6
 
7
- struct dirent
8
- {
7
+ struct dirent {
9
8
  char *d_name;
10
9
  };
11
10
 
12
- typedef struct DIR
13
- {
11
+ typedef struct DIR {
14
12
  struct _finddata_t find_data;
15
13
  struct dirent de;
16
14
  long handle;
17
15
  } DIR;
18
16
 
19
- DIR *opendir(const char *dirname)
20
- {
17
+ DIR *opendir(const char *dirname) {
21
18
  DIR *d = FRT_ALLOC_AND_ZERO(DIR);
22
19
  char dirname_buf[FRT_MAX_FILE_PATH];
23
20
  long ff_res;
@@ -33,8 +30,7 @@ DIR *opendir(const char *dirname)
33
30
  return d;
34
31
  }
35
32
 
36
- struct dirent *readdir(DIR *d)
37
- {
33
+ struct dirent *readdir(DIR *d) {
38
34
  /* _findfirst already returned so do _findnext */
39
35
  if (d->de.d_name != NULL) {
40
36
  if (_findnext(d->handle, &d->find_data) < 0) {
@@ -45,8 +41,7 @@ struct dirent *readdir(DIR *d)
45
41
  return &d->de;
46
42
  }
47
43
 
48
- void closedir(DIR *d)
49
- {
44
+ void closedir(DIR *d) {
50
45
  _findclose(d->handle);
51
46
  free(d);
52
47
  }
@@ -5,6 +5,8 @@
5
5
  #include "frt_hashset.h"
6
6
  #include "frt_threading.h"
7
7
 
8
+ const char *segm_idx_name = "segmented_index";
9
+
8
10
  /* IDs */
9
11
  ID id_new;
10
12
  ID id_call;
@@ -32,21 +34,21 @@ VALUE sym_each;
32
34
  /* Modules */
33
35
  VALUE mIsomorfeus;
34
36
  VALUE mFerret;
35
- VALUE mStore;
36
- VALUE mStringHelper;
37
- VALUE mSpans;
38
37
 
39
38
  /* Classes */
40
- VALUE cTerm;
39
+ static VALUE cTerm;
41
40
  VALUE cFileNotFoundError;
42
41
  VALUE cParseError;
43
42
  VALUE cStateError;
44
43
 
45
- void Init_Benchmark(void);
46
- void Init_Test(void);
44
+ extern void Init_Benchmark(void);
45
+ extern void Init_Test(void);
47
46
 
48
47
  unsigned long value_hash(const void *key) {
49
- return (unsigned long)key;
48
+ /* double cast to prevent compiler warning:
49
+ * - first cast: pointer to number of same size
50
+ * - second cast: number to smaller number */
51
+ return (unsigned long)(uintptr_t)key;
50
52
  }
51
53
 
52
54
  int value_eq(const void *key1, const void *key2) {
@@ -119,15 +121,14 @@ ID frb_field(VALUE rfield) {
119
121
  * Jeremie 'ahFeel' BORDIER
120
122
  * ahFeel@rift.Fr
121
123
  */
122
- char *json_concat_string(char *s, char *field) {
124
+ char *json_concat_string(char *s, const char *field) {
123
125
  *(s++) = '"';
124
126
  while (*field) {
125
127
  if (*field == '"') {
126
128
  *(s++) = '\'';
127
129
  *(s++) = *(field++);
128
130
  *(s++) = '\'';
129
- }
130
- else {
131
+ } else {
131
132
  *(s++) = *(field++);
132
133
  }
133
134
  }
@@ -308,6 +309,6 @@ void Init_isomorfeus_ferret_ext(void) {
308
309
  rb_define_const(mFerret, "FIX_INT_MAX", INT2FIX(INT_MAX >> 1));
309
310
  }
310
311
 
311
- extern void frb_raise(int excode, const char *msg) {
312
+ void frb_raise(int excode, const char *msg) {
312
313
  rb_raise(frb_get_error(ERROR_TYPES[excode]), "%s", msg);
313
314
  }