isomorfeus-ferret 0.13.8 → 0.13.11

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/ext/isomorfeus_ferret_ext/bm_store.c +3 -3
  3. data/ext/isomorfeus_ferret_ext/bzlib.h +83 -82
  4. data/ext/isomorfeus_ferret_ext/frb_index.c +17 -23
  5. data/ext/isomorfeus_ferret_ext/frb_search.c +1 -4
  6. data/ext/isomorfeus_ferret_ext/frb_store.c +32 -34
  7. data/ext/isomorfeus_ferret_ext/frt_analysis.c +4 -4
  8. data/ext/isomorfeus_ferret_ext/frt_analysis.h +9 -9
  9. data/ext/isomorfeus_ferret_ext/frt_bitvector.c +1 -1
  10. data/ext/isomorfeus_ferret_ext/frt_bitvector.h +1 -1
  11. data/ext/isomorfeus_ferret_ext/frt_compound_io.c +41 -66
  12. data/ext/isomorfeus_ferret_ext/frt_config.h +8 -0
  13. data/ext/isomorfeus_ferret_ext/frt_except.c +1 -0
  14. data/ext/isomorfeus_ferret_ext/frt_filter.c +2 -4
  15. data/ext/isomorfeus_ferret_ext/frt_fs_store.c +24 -19
  16. data/ext/isomorfeus_ferret_ext/frt_global.c +6 -4
  17. data/ext/isomorfeus_ferret_ext/frt_global.h +1 -1
  18. data/ext/isomorfeus_ferret_ext/frt_hash.c +40 -48
  19. data/ext/isomorfeus_ferret_ext/frt_hash.h +14 -16
  20. data/ext/isomorfeus_ferret_ext/frt_hashset.c +5 -5
  21. data/ext/isomorfeus_ferret_ext/frt_ind.c +2 -3
  22. data/ext/isomorfeus_ferret_ext/frt_index.c +148 -219
  23. data/ext/isomorfeus_ferret_ext/frt_index.h +31 -31
  24. data/ext/isomorfeus_ferret_ext/frt_lang.c +1 -4
  25. data/ext/isomorfeus_ferret_ext/frt_multimapper.c +8 -9
  26. data/ext/isomorfeus_ferret_ext/frt_multimapper.h +1 -1
  27. data/ext/isomorfeus_ferret_ext/frt_q_boolean.c +6 -6
  28. data/ext/isomorfeus_ferret_ext/frt_q_match_all.c +8 -3
  29. data/ext/isomorfeus_ferret_ext/frt_q_parser.c +1743 -1742
  30. data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +1 -2
  31. data/ext/isomorfeus_ferret_ext/frt_q_span.c +11 -10
  32. data/ext/isomorfeus_ferret_ext/frt_ram_store.c +24 -40
  33. data/ext/isomorfeus_ferret_ext/frt_search.c +29 -28
  34. data/ext/isomorfeus_ferret_ext/frt_search.h +18 -19
  35. data/ext/isomorfeus_ferret_ext/frt_store.c +47 -40
  36. data/ext/isomorfeus_ferret_ext/frt_store.h +46 -48
  37. data/ext/isomorfeus_ferret_ext/frt_threading.h +12 -5
  38. data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.c +4 -3
  39. data/ext/isomorfeus_ferret_ext/test_1710.c +1 -2
  40. data/ext/isomorfeus_ferret_ext/test_compound_io.c +8 -8
  41. data/ext/isomorfeus_ferret_ext/test_fields.c +7 -7
  42. data/ext/isomorfeus_ferret_ext/test_file_deleter.c +1 -1
  43. data/ext/isomorfeus_ferret_ext/test_filter.c +4 -3
  44. data/ext/isomorfeus_ferret_ext/test_fs_store.c +1 -1
  45. data/ext/isomorfeus_ferret_ext/test_highlighter.c +3 -1
  46. data/ext/isomorfeus_ferret_ext/test_index.c +61 -61
  47. data/ext/isomorfeus_ferret_ext/test_q_const_score.c +2 -1
  48. data/ext/isomorfeus_ferret_ext/test_q_filtered.c +3 -2
  49. data/ext/isomorfeus_ferret_ext/test_q_fuzzy.c +3 -1
  50. data/ext/isomorfeus_ferret_ext/test_q_span.c +8 -1
  51. data/ext/isomorfeus_ferret_ext/test_ram_store.c +4 -4
  52. data/ext/isomorfeus_ferret_ext/test_search.c +9 -4
  53. data/ext/isomorfeus_ferret_ext/test_segments.c +4 -3
  54. data/ext/isomorfeus_ferret_ext/test_sort.c +17 -9
  55. data/ext/isomorfeus_ferret_ext/test_term.c +4 -2
  56. data/ext/isomorfeus_ferret_ext/test_term_vectors.c +2 -2
  57. data/ext/isomorfeus_ferret_ext/test_threading.c +5 -4
  58. data/lib/isomorfeus/ferret/index/index.rb +8 -3
  59. data/lib/isomorfeus/ferret/version.rb +1 -1
  60. metadata +16 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e6a7a9c17cc344699bee0c8116188f86da73e11fa2a4eed02eea1c4647b6a99
4
- data.tar.gz: c94c9a2735b010c02c8d5a793057b94abf8950117153415a731347c21fadf66e
3
+ metadata.gz: a5603738325c11384e3dcd2d60e8ce34effbbe7b64fdcc319315910fdca6cbae
4
+ data.tar.gz: f15cc75761f2b0152243bbdc3983d880636fa71d6a2f5fdc4a34443fad28250b
5
5
  SHA512:
6
- metadata.gz: 549a2d3b09dc535278f6c9735f55a47203166df046e5a75ff55589085336bcf2cb7c25cdf491c07eca68da25682316c4bb15e5079f09df95f8a494558fe22260
7
- data.tar.gz: e188f428fd881a0285ece69807f13c07dfd1eee131edcad3e38a713ffa820364992bb9068d5f94f567bd7769c7882441ce8eb67199b95b491528fecdd34503f4
6
+ metadata.gz: 6ee5491226887aa837b0f71f053881c18be5dd460427aebf5501b17a3c863f9f28d4202848c82825ee110b568fb95a083e1defa4d1a316a6e7d9c35f41a328bc
7
+ data.tar.gz: 4e74d456a810c14b204e948c49885ef00710b2d79544ba5fc1c81c02bb1509459ad927935f9ef13fa73929d35919b18d4c5c56a4eb00790954da67f874fa591f
@@ -6,7 +6,7 @@
6
6
  #define N 10
7
7
  #define write_byte(os, b) os->buf.buf[os->buf.pos++] = (frt_uchar)b
8
8
 
9
- void my_os_write_voff_t(FrtOutStream *os, register off_t num) {
9
+ void my_os_write_voff_t(FrtOutStream *os, register frt_off_t num) {
10
10
  if (!(num&0x7f)) {
11
11
  if (os->buf.pos >= FRT_BUFFER_SIZE) {
12
12
  frt_os_write_byte(os, (frt_uchar)num);
@@ -48,7 +48,7 @@ void my_os_write_voff_t(FrtOutStream *os, register off_t num) {
48
48
 
49
49
  static void vint_out(void) {
50
50
  int n;
51
- off_t i;
51
+ frt_off_t i;
52
52
  FrtOutStream *os;
53
53
 
54
54
  for (n = 0; n < N; n++) {
@@ -63,7 +63,7 @@ static void vint_out(void) {
63
63
 
64
64
  static void unrolled_vint_out(void) {
65
65
  int n;
66
- off_t i;
66
+ frt_off_t i;
67
67
  FrtOutStream *os;
68
68
 
69
69
  for (n = 0; n < N; n++) {
@@ -11,7 +11,7 @@
11
11
  bzip2/libbzip2 version 1.0.8 of 13 July 2019
12
12
  Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
13
13
 
14
- Please read the WARNING, DISCLAIMER and PATENTS sections in the
14
+ Please read the WARNING, DISCLAIMER and PATENTS sections in the
15
15
  README file.
16
16
 
17
17
  This program is released under the terms of the license contained
@@ -25,6 +25,7 @@
25
25
  #ifdef __cplusplus
26
26
  extern "C" {
27
27
  #endif
28
+ #define BZ_DEBUG 0
28
29
 
29
30
  #define BZ_RUN 0
30
31
  #define BZ_FLUSH 1
@@ -45,7 +46,7 @@ extern "C" {
45
46
  #define BZ_OUTBUFF_FULL (-8)
46
47
  #define BZ_CONFIG_ERROR (-9)
47
48
 
48
- typedef
49
+ typedef
49
50
  struct {
50
51
  char *next_in;
51
52
  unsigned int avail_in;
@@ -62,7 +63,7 @@ typedef
62
63
  void *(*bzalloc)(void *,int,int);
63
64
  void (*bzfree)(void *,void *);
64
65
  void *opaque;
65
- }
66
+ }
66
67
  bz_stream;
67
68
 
68
69
 
@@ -97,34 +98,34 @@ typedef
97
98
 
98
99
  /*-- Core (low-level) library functions --*/
99
100
 
100
- BZ_EXTERN int BZ_API(BZ2_bzCompressInit) (
101
- bz_stream* strm,
102
- int blockSize100k,
103
- int verbosity,
104
- int workFactor
101
+ BZ_EXTERN int BZ_API(BZ2_bzCompressInit) (
102
+ bz_stream* strm,
103
+ int blockSize100k,
104
+ int verbosity,
105
+ int workFactor
105
106
  );
106
107
 
107
- BZ_EXTERN int BZ_API(BZ2_bzCompress) (
108
- bz_stream* strm,
109
- int action
108
+ BZ_EXTERN int BZ_API(BZ2_bzCompress) (
109
+ bz_stream* strm,
110
+ int action
110
111
  );
111
112
 
112
- BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) (
113
- bz_stream* strm
113
+ BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) (
114
+ bz_stream* strm
114
115
  );
115
116
 
116
- BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) (
117
- bz_stream *strm,
118
- int verbosity,
117
+ BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) (
118
+ bz_stream *strm,
119
+ int verbosity,
119
120
  int small
120
121
  );
121
122
 
122
- BZ_EXTERN int BZ_API(BZ2_bzDecompress) (
123
- bz_stream* strm
123
+ BZ_EXTERN int BZ_API(BZ2_bzDecompress) (
124
+ bz_stream* strm
124
125
  );
125
126
 
126
- BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) (
127
- bz_stream *strm
127
+ BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) (
128
+ bz_stream *strm
128
129
  );
129
130
 
130
131
 
@@ -136,64 +137,64 @@ BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) (
136
137
 
137
138
  typedef void BZFILE;
138
139
 
139
- BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) (
140
- int* bzerror,
141
- FILE* f,
142
- int verbosity,
140
+ BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) (
141
+ int* bzerror,
142
+ FILE* f,
143
+ int verbosity,
143
144
  int small,
144
- void* unused,
145
- int nUnused
145
+ void* unused,
146
+ int nUnused
146
147
  );
147
148
 
148
- BZ_EXTERN void BZ_API(BZ2_bzReadClose) (
149
- int* bzerror,
150
- BZFILE* b
149
+ BZ_EXTERN void BZ_API(BZ2_bzReadClose) (
150
+ int* bzerror,
151
+ BZFILE* b
151
152
  );
152
153
 
153
- BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) (
154
- int* bzerror,
155
- BZFILE* b,
156
- void** unused,
157
- int* nUnused
154
+ BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) (
155
+ int* bzerror,
156
+ BZFILE* b,
157
+ void** unused,
158
+ int* nUnused
158
159
  );
159
160
 
160
- BZ_EXTERN int BZ_API(BZ2_bzRead) (
161
- int* bzerror,
162
- BZFILE* b,
163
- void* buf,
164
- int len
161
+ BZ_EXTERN int BZ_API(BZ2_bzRead) (
162
+ int* bzerror,
163
+ BZFILE* b,
164
+ void* buf,
165
+ int len
165
166
  );
166
167
 
167
- BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) (
168
- int* bzerror,
169
- FILE* f,
170
- int blockSize100k,
171
- int verbosity,
172
- int workFactor
168
+ BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) (
169
+ int* bzerror,
170
+ FILE* f,
171
+ int blockSize100k,
172
+ int verbosity,
173
+ int workFactor
173
174
  );
174
175
 
175
- BZ_EXTERN void BZ_API(BZ2_bzWrite) (
176
- int* bzerror,
177
- BZFILE* b,
178
- void* buf,
179
- int len
176
+ BZ_EXTERN void BZ_API(BZ2_bzWrite) (
177
+ int* bzerror,
178
+ BZFILE* b,
179
+ void* buf,
180
+ int len
180
181
  );
181
182
 
182
- BZ_EXTERN void BZ_API(BZ2_bzWriteClose) (
183
- int* bzerror,
184
- BZFILE* b,
185
- int abandon,
186
- unsigned int* nbytes_in,
187
- unsigned int* nbytes_out
183
+ BZ_EXTERN void BZ_API(BZ2_bzWriteClose) (
184
+ int* bzerror,
185
+ BZFILE* b,
186
+ int abandon,
187
+ unsigned int* nbytes_in,
188
+ unsigned int* nbytes_out
188
189
  );
189
190
 
190
- BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) (
191
- int* bzerror,
192
- BZFILE* b,
193
- int abandon,
194
- unsigned int* nbytes_in_lo32,
195
- unsigned int* nbytes_in_hi32,
196
- unsigned int* nbytes_out_lo32,
191
+ BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) (
192
+ int* bzerror,
193
+ BZFILE* b,
194
+ int abandon,
195
+ unsigned int* nbytes_in_lo32,
196
+ unsigned int* nbytes_in_hi32,
197
+ unsigned int* nbytes_out_lo32,
197
198
  unsigned int* nbytes_out_hi32
198
199
  );
199
200
  #endif
@@ -201,23 +202,23 @@ BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) (
201
202
 
202
203
  /*-- Utility functions --*/
203
204
 
204
- BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) (
205
- char* dest,
205
+ BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) (
206
+ char* dest,
206
207
  unsigned int* destLen,
207
- char* source,
208
+ char* source,
208
209
  unsigned int sourceLen,
209
- int blockSize100k,
210
- int verbosity,
211
- int workFactor
210
+ int blockSize100k,
211
+ int verbosity,
212
+ int workFactor
212
213
  );
213
214
 
214
- BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) (
215
- char* dest,
215
+ BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) (
216
+ char* dest,
216
217
  unsigned int* destLen,
217
- char* source,
218
+ char* source,
218
219
  unsigned int sourceLen,
219
- int small,
220
- int verbosity
220
+ int small,
221
+ int verbosity
221
222
  );
222
223
 
223
224
 
@@ -244,17 +245,17 @@ BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
244
245
  int fd,
245
246
  const char *mode
246
247
  );
247
-
248
+
248
249
  BZ_EXTERN int BZ_API(BZ2_bzread) (
249
- BZFILE* b,
250
- void* buf,
251
- int len
250
+ BZFILE* b,
251
+ void* buf,
252
+ int len
252
253
  );
253
254
 
254
255
  BZ_EXTERN int BZ_API(BZ2_bzwrite) (
255
- BZFILE* b,
256
- void* buf,
257
- int len
256
+ BZFILE* b,
257
+ void* buf,
258
+ int len
258
259
  );
259
260
 
260
261
  BZ_EXTERN int BZ_API(BZ2_bzflush) (
@@ -266,7 +267,7 @@ BZ_EXTERN void BZ_API(BZ2_bzclose) (
266
267
  );
267
268
 
268
269
  BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
269
- BZFILE *b,
270
+ BZFILE *b,
270
271
  int *errnum
271
272
  );
272
273
  #endif
@@ -229,7 +229,7 @@ static VALUE frb_fi_init(int argc, VALUE *argv, VALUE self) {
229
229
  */
230
230
  static VALUE frb_fi_name(VALUE self) {
231
231
  FrtFieldInfo *fi = (FrtFieldInfo *)DATA_PTR(self);
232
- return rb_str_new_cstr(rb_id2name(fi->name));
232
+ return ID2SYM(fi->name);
233
233
  }
234
234
 
235
235
  /*
@@ -536,7 +536,7 @@ frb_fis_add_field(int argc, VALUE *argv, VALUE self)
536
536
  {
537
537
  FrtFieldInfos *fis = (FrtFieldInfos *)DATA_PTR(self);
538
538
  FrtFieldInfo *fi;
539
- FrtStoreValue store = fis->store;
539
+ FrtStoreValue store_val = fis->store_val;
540
540
  FrtCompressionType compression = fis->compression;
541
541
  FrtIndexValue index = fis->index;
542
542
  FrtTermVectorValue term_vector = fis->term_vector;
@@ -545,9 +545,9 @@ frb_fis_add_field(int argc, VALUE *argv, VALUE self)
545
545
 
546
546
  rb_scan_args(argc, argv, "11", &rname, &roptions);
547
547
  if (argc > 1) {
548
- frb_fi_get_params(roptions, &store, &compression, &index, &term_vector, &boost);
548
+ frb_fi_get_params(roptions, &store_val, &compression, &index, &term_vector, &boost);
549
549
  }
550
- fi = frt_fi_new(frb_field(rname), store, compression, index, term_vector);
550
+ fi = frt_fi_new(frb_field(rname), store_val, compression, index, term_vector);
551
551
  fi->boost = boost;
552
552
  frt_fis_add_field(fis, fi);
553
553
  return self;
@@ -593,9 +593,7 @@ frb_fis_to_s(VALUE self)
593
593
  *
594
594
  * Return the number of fields in the FieldInfos object.
595
595
  */
596
- static VALUE
597
- frb_fis_size(VALUE self)
598
- {
596
+ static VALUE frb_fis_size(VALUE self) {
599
597
  FrtFieldInfos *fis = (FrtFieldInfos *)DATA_PTR(self);
600
598
  return INT2FIX(fis->size);
601
599
  }
@@ -610,21 +608,19 @@ frb_fis_size(VALUE self)
610
608
  * existing index (or other files for that matter) will be deleted from the
611
609
  * directory and overwritten by the new index.
612
610
  */
613
- static VALUE
614
- frb_fis_create_index(VALUE self, VALUE rdir)
615
- {
611
+ static VALUE frb_fis_create_index(VALUE self, VALUE rdir) {
616
612
  FrtFieldInfos *fis = (FrtFieldInfos *)DATA_PTR(self);
617
613
  FrtStore *store = NULL;
618
614
  if (TYPE(rdir) == T_DATA) {
619
615
  store = DATA_PTR(rdir);
620
- FRT_REF(store);
616
+ frt_index_create(store, fis);
621
617
  } else {
622
618
  StringValue(rdir);
623
619
  frb_create_dir(rdir);
624
620
  store = frt_open_fs_store(rs2s(rdir));
621
+ frt_index_create(store, fis);
622
+ frt_store_close(store);
625
623
  }
626
- frt_index_create(store, fis);
627
- frt_store_deref(store);
628
624
  return self;
629
625
  }
630
626
 
@@ -663,7 +659,7 @@ frb_fis_get_tk_fields(VALUE self)
663
659
  int i;
664
660
  for (i = 0; i < fis->size; i++) {
665
661
  if (!fi_is_tokenized(fis->fields[i])) continue;
666
- rb_ary_push(rfield_names, rb_str_new_cstr(rb_id2name(fis->fields[i]->name)));
662
+ rb_ary_push(rfield_names, ID2SYM(fis->fields[i]->name));
667
663
  }
668
664
  return rfield_names;
669
665
  }
@@ -1344,6 +1340,8 @@ static VALUE frb_iw_alloc(VALUE rclass) {
1344
1340
  return TypedData_Wrap_Struct(rclass, &frb_index_writer_t, iw);
1345
1341
  }
1346
1342
 
1343
+ extern rb_data_type_t frb_store_t;
1344
+
1347
1345
  static VALUE frb_iw_init(int argc, VALUE *argv, VALUE self) {
1348
1346
  VALUE roptions, rval;
1349
1347
  bool create = false;
@@ -1363,12 +1361,11 @@ static VALUE frb_iw_init(int argc, VALUE *argv, VALUE self) {
1363
1361
 
1364
1362
  if ((rval = rb_hash_aref(roptions, sym_dir)) != Qnil) {
1365
1363
  // Check_Type(rval, T_DATA);
1366
- store = DATA_PTR(rval);
1364
+ TypedData_Get_Struct(rval, FrtStore, &frb_store_t, store);
1367
1365
  } else if ((rval = rb_hash_aref(roptions, sym_path)) != Qnil) {
1368
1366
  StringValue(rval);
1369
1367
  frb_create_dir(rval);
1370
1368
  store = frt_open_fs_store(rs2s(rval));
1371
- FRT_DEREF(store);
1372
1369
  }
1373
1370
  /* use_compound_file defaults to true */
1374
1371
  config.use_compound_file =
@@ -1393,7 +1390,6 @@ static VALUE frb_iw_init(int argc, VALUE *argv, VALUE self) {
1393
1390
  }
1394
1391
  if (NULL == store) {
1395
1392
  store = frt_open_ram_store(NULL);
1396
- FRT_DEREF(store);
1397
1393
  }
1398
1394
  if (!create && create_if_missing && !store->exists(store, "segments")) {
1399
1395
  create = true;
@@ -1411,7 +1407,7 @@ static VALUE frb_iw_init(int argc, VALUE *argv, VALUE self) {
1411
1407
  }
1412
1408
 
1413
1409
  TypedData_Get_Struct(self, FrtIndexWriter, &frb_index_writer_t, iw);
1414
- iw = frt_iw_open(iw, store, analyzer, &config);
1410
+ frt_iw_open(iw, store, analyzer, &config);
1415
1411
  FRT_XCATCHALL
1416
1412
  ex_code = xcontext.excode;
1417
1413
  msg = xcontext.msg;
@@ -1598,9 +1594,9 @@ void frb_ir_free(void *p) {
1598
1594
 
1599
1595
  void frb_ir_mark(void *p) {
1600
1596
  FrtIndexReader *ir = (FrtIndexReader *)p;
1601
- FrtMultiReader *mr = (FrtMultiReader *)p;
1602
1597
 
1603
1598
  if (ir->type == FRT_MULTI_READER) {
1599
+ FrtMultiReader *mr = (FrtMultiReader *)p;
1604
1600
  int i;
1605
1601
  for (i = 0; i < mr->r_cnt; i++) {
1606
1602
  if (mr->sub_readers[i]->rir)
@@ -1652,6 +1648,7 @@ static VALUE frb_iw_add_readers(VALUE self, VALUE rreaders) {
1652
1648
  while (i-- > 0) {
1653
1649
  FrtIndexReader *ir;
1654
1650
  TypedData_Get_Struct(RARRAY_PTR(rreaders)[i], FrtIndexReader, &frb_index_reader_t, ir);
1651
+ FRT_REF(ir);
1655
1652
  irs[i] = ir;
1656
1653
  }
1657
1654
  frt_iw_add_readers(iw, irs, RARRAY_LEN(rreaders));
@@ -2157,7 +2154,6 @@ static VALUE frb_ir_init(VALUE self, VALUE rdir) {
2157
2154
  VALUE rfield_num_map = rb_hash_new();
2158
2155
  int ex_code = 0;
2159
2156
  const char *msg = NULL;
2160
-
2161
2157
  FRT_TRY
2162
2158
  if (TYPE(rdir) == T_ARRAY) {
2163
2159
  VALUE rdirs = rdir;
@@ -2170,7 +2166,6 @@ static VALUE frb_ir_init(VALUE self, VALUE rdir) {
2170
2166
  case T_DATA:
2171
2167
  if (CLASS_OF(rdir) == cIndexReader) {
2172
2168
  TypedData_Get_Struct(rdir, FrtIndexReader, &frb_index_reader_t, sub_readers[i]);
2173
- FRT_REF(sub_readers[i]);
2174
2169
  continue;
2175
2170
  } else if (RTEST(rb_obj_is_kind_of(rdir, cDirectory))) {
2176
2171
  store = DATA_PTR(rdir);
@@ -2185,7 +2180,6 @@ static VALUE frb_ir_init(VALUE self, VALUE rdir) {
2185
2180
  case T_STRING:
2186
2181
  frb_create_dir(rdir);
2187
2182
  store = frt_open_fs_store(rs2s(rdir));
2188
- FRT_DEREF(store);
2189
2183
  break;
2190
2184
  default:
2191
2185
  FRT_RAISE(FRT_ARG_ERROR, "%s isn't a valid directory "
@@ -2195,6 +2189,7 @@ static VALUE frb_ir_init(VALUE self, VALUE rdir) {
2195
2189
  break;
2196
2190
  }
2197
2191
  sub_readers[i] = frt_ir_open(NULL, store);
2192
+ FRT_DEREF(sub_readers[i]);
2198
2193
  }
2199
2194
  TypedData_Get_Struct(self, FrtIndexReader, &frb_index_reader_t, ir);
2200
2195
  ir = frt_mr_open(ir, sub_readers, reader_cnt);
@@ -2206,7 +2201,6 @@ static VALUE frb_ir_init(VALUE self, VALUE rdir) {
2206
2201
  case T_STRING:
2207
2202
  frb_create_dir(rdir);
2208
2203
  store = frt_open_fs_store(rs2s(rdir));
2209
- FRT_DEREF(store);
2210
2204
  break;
2211
2205
  default:
2212
2206
  FRT_RAISE(FRT_ARG_ERROR, "%s isn't a valid directory argument. "
@@ -3606,7 +3606,6 @@ static VALUE frb_sea_init(VALUE self, VALUE obj) {
3606
3606
  frb_create_dir(obj);
3607
3607
  store = frt_open_fs_store(rs2s(obj));
3608
3608
  ir = frt_ir_open(NULL, store);
3609
- FRT_DEREF(store);
3610
3609
  ir->rir = TypedData_Wrap_Struct(cIndexReader, &frb_index_reader_t, ir);
3611
3610
  } else {
3612
3611
  // Check_Type(obj, T_DATA);
@@ -3616,14 +3615,12 @@ static VALUE frb_sea_init(VALUE self, VALUE obj) {
3616
3615
  ir->rir = TypedData_Wrap_Struct(cIndexReader, &frb_index_reader_t, ir);
3617
3616
  } else if (rb_obj_is_kind_of(obj, cIndexReader) == Qtrue) {
3618
3617
  TypedData_Get_Struct(obj, FrtIndexReader, &frb_index_reader_t, ir);
3619
- ir->rir = obj;
3620
3618
  } else {
3621
3619
  rb_raise(rb_eArgError, "Unknown type for argument to IndexSearcher.new");
3622
3620
  }
3623
3621
  }
3624
3622
  TypedData_Get_Struct(self, FrtSearcher, &frb_index_searcher_t, sea);
3625
3623
  frt_isea_init(sea, ir);
3626
- ((FrtIndexSearcher *)sea)->close_ir = false;
3627
3624
  sea->rsea = self;
3628
3625
  return self;
3629
3626
  }
@@ -3710,7 +3707,7 @@ static VALUE frb_ms_init(int argc, VALUE *argv, VALUE self) {
3710
3707
  }
3711
3708
  }
3712
3709
  TypedData_Get_Struct(self, FrtSearcher, &frb_multi_searcher_t, sea);
3713
- frt_msea_init(sea, searchers, top, false);
3710
+ frt_msea_init(sea, searchers, top);
3714
3711
  sea->rsea = self;
3715
3712
  return self;
3716
3713
  }
@@ -185,10 +185,35 @@ static VALUE frb_lock_release(VALUE self) {
185
185
  *
186
186
  ****************************************************************************/
187
187
 
188
+ /*** FrbStore ****************************************************************/
189
+
190
+ static size_t frb_store_size(const void *p) {
191
+ return sizeof(FrtStore);
192
+ (void)p;
193
+ }
194
+
188
195
  void frb_dir_free(void *p) {
189
- FrtStore *store = (FrtStore *)p;
190
- frb_unwrap_locks(store);
191
- frt_store_deref(store);
196
+ frb_unwrap_locks((FrtStore *)p);
197
+ frt_store_close((FrtStore *)p);
198
+ }
199
+
200
+ const rb_data_type_t frb_store_t = {
201
+ .wrap_struct_name = "FrbStore",
202
+ .function = {
203
+ .dmark = NULL,
204
+ .dfree = frb_dir_free,
205
+ .dsize = frb_store_size,
206
+ .dcompact = NULL,
207
+ .reserved = {0},
208
+ },
209
+ .parent = NULL,
210
+ .data = NULL,
211
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
212
+ };
213
+
214
+ static VALUE frb_store_alloc(VALUE rclass) {
215
+ FrtStore *st = frt_store_alloc();
216
+ return TypedData_Wrap_Struct(rclass, &frb_store_t, st);
192
217
  }
193
218
 
194
219
  /*
@@ -208,7 +233,7 @@ static VALUE frb_dir_close(VALUE self) {
208
233
  ((struct RData *)(self))->dmark = NULL;
209
234
  ((struct RData *)(self))->dfree = NULL;
210
235
  frb_unwrap_locks(store);
211
- frt_store_deref(store);
236
+ frt_store_close(store);
212
237
  }
213
238
  return Qnil;
214
239
  }
@@ -308,32 +333,6 @@ static VALUE frb_dir_make_lock(VALUE self, VALUE rlock_name) {
308
333
  return rlock;
309
334
  }
310
335
 
311
- /*** FrbStore ****************************************************************/
312
-
313
- static size_t frb_store_size(const void *p) {
314
- return sizeof(FrtStore);
315
- (void)p;
316
- }
317
-
318
- const rb_data_type_t frb_store_t = {
319
- .wrap_struct_name = "FrbStore",
320
- .function = {
321
- .dmark = NULL,
322
- .dfree = frb_dir_free,
323
- .dsize = frb_store_size,
324
- .dcompact = NULL,
325
- .reserved = {0},
326
- },
327
- .parent = NULL,
328
- .data = NULL,
329
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
330
- };
331
-
332
- static VALUE frb_store_alloc(VALUE rclass) {
333
- FrtStore *st = frt_store_alloc();
334
- return TypedData_Wrap_Struct(rclass, &frb_store_t, st);
335
- }
336
-
337
336
  /****************************************************************************
338
337
  *
339
338
  * RAMDirectory Methods
@@ -403,19 +402,18 @@ static VALUE frb_fsdir_new(int argc, VALUE *argv, VALUE klass) {
403
402
  frb_create_dir(rpath);
404
403
  }
405
404
  if (!rb_funcall(rb_cFile, id_is_directory, 1, rpath)) {
406
- rb_raise(rb_eIOError, "No directory <%s> found. Use :create => true"
407
- " to create one.", rs2s(rpath));
405
+ rb_raise(rb_eIOError, "No directory <%s> found. Use :create => true to create one.", rs2s(rpath));
408
406
  }
409
407
  store = frt_open_fs_store(rs2s(rpath));
410
408
  if (create) store->clear_all(store);
411
- if ((self = store->rstore) == Qnil) {
409
+ self = store->rstore;
410
+ if (self == Qnil || DATA_PTR(self) == NULL) {
412
411
  self = TypedData_Wrap_Struct(klass, &frb_store_t, store);
413
412
  store->rstore = self;
414
413
  rb_ivar_set(self, id_ref_cnt, INT2FIX(0));
415
414
  } else {
416
415
  int ref_cnt = FIX2INT(rb_ivar_get(self, id_ref_cnt)) + 1;
417
416
  rb_ivar_set(self, id_ref_cnt, INT2FIX(ref_cnt));
418
- FRT_DEREF(store);
419
417
  }
420
418
  return self;
421
419
  }
@@ -64,7 +64,7 @@ static inline int get_cp(char *start, char *end, int *cp_len, rb_encoding *enc)
64
64
  /*** FrtToken ****************************************************************/
65
65
  /*****************************************************************************/
66
66
 
67
- FrtToken *frt_tk_set(FrtToken *tk, char *text, int tlen, off_t start, off_t end, int pos_inc, rb_encoding *encoding) {
67
+ FrtToken *frt_tk_set(FrtToken *tk, char *text, int tlen, frt_off_t start, frt_off_t end, int pos_inc, rb_encoding *encoding) {
68
68
  if (tlen >= FRT_MAX_WORD_SIZE) {
69
69
  tlen = FRT_MAX_WORD_SIZE - 1; // TODO: this may invalidate mbc's
70
70
  }
@@ -92,7 +92,7 @@ static FrtToken *frt_tk_set_ts(FrtToken *tk, char *start, char *end, char *text,
92
92
  return frt_tk_set(tk, start, (int)(end - start), (off_t)(start - text), (off_t)(end - text), pos_inc, encoding);
93
93
  }
94
94
 
95
- FrtToken *frt_tk_set_no_len(FrtToken *tk, char *text, off_t start, off_t end, int pos_inc, rb_encoding *encoding) {
95
+ FrtToken *frt_tk_set_no_len(FrtToken *tk, char *text, frt_off_t start, frt_off_t end, int pos_inc, rb_encoding *encoding) {
96
96
  return frt_tk_set(tk, text, (int)strlen(text), start, end, pos_inc, encoding);
97
97
  }
98
98
 
@@ -133,7 +133,7 @@ FrtToken *frt_tk_new(void) {
133
133
  /*****************************************************************************/
134
134
 
135
135
  void frt_ts_deref(FrtTokenStream *ts) {
136
- if (--ts->ref_cnt <= 0)
136
+ if (FRT_DEREF(ts) == 0)
137
137
  ts->destroy_i(ts);
138
138
  }
139
139
 
@@ -1089,7 +1089,7 @@ FrtTokenStream *frt_stem_filter_new(FrtTokenStream *sub_ts, const char *algorith
1089
1089
  /*****************************************************************************/
1090
1090
 
1091
1091
  void frt_a_deref(FrtAnalyzer *a) {
1092
- if (--a->ref_cnt <= 0)
1092
+ if (FRT_DEREF(a) == 0)
1093
1093
  a->destroy_i(a);
1094
1094
  }
1095
1095