groonga 0.0.1 → 0.0.2

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 (52) hide show
  1. data/NEWS.ja.rdoc +11 -0
  2. data/NEWS.rdoc +11 -0
  3. data/README.ja.rdoc +4 -3
  4. data/README.rdoc +4 -3
  5. data/Rakefile +1 -1
  6. data/TUTORIAL.ja.rdoc +168 -44
  7. data/benchmark/common.rb +49 -0
  8. data/benchmark/read-write-small-many-items.rb +156 -0
  9. data/benchmark/write-small-many-items.rb +145 -0
  10. data/example/bookmark.rb +68 -20
  11. data/ext/rb-grn-array-cursor.c +8 -0
  12. data/ext/rb-grn-array.c +40 -11
  13. data/ext/rb-grn-column.c +38 -209
  14. data/ext/rb-grn-context.c +203 -56
  15. data/ext/rb-grn-database.c +119 -5
  16. data/ext/rb-grn-encoding-support.c +64 -0
  17. data/ext/rb-grn-encoding.c +58 -1
  18. data/ext/rb-grn-fix-size-column.c +220 -0
  19. data/ext/rb-grn-hash-cursor.c +8 -0
  20. data/ext/rb-grn-hash.c +244 -2
  21. data/ext/rb-grn-index-column.c +474 -0
  22. data/ext/rb-grn-object.c +143 -265
  23. data/ext/rb-grn-patricia-trie.c +148 -2
  24. data/ext/rb-grn-query.c +5 -3
  25. data/ext/rb-grn-record.c +3 -2
  26. data/ext/rb-grn-snippet.c +5 -3
  27. data/ext/rb-grn-table-cursor-key-support.c +3 -3
  28. data/ext/rb-grn-table-cursor.c +106 -112
  29. data/ext/rb-grn-table-key-support.c +220 -118
  30. data/ext/rb-grn-table.c +336 -80
  31. data/ext/rb-grn-type.c +5 -4
  32. data/ext/rb-grn-utils.c +62 -63
  33. data/ext/rb-grn.h +215 -14
  34. data/ext/rb-groonga.c +7 -16
  35. data/extconf.rb +3 -1
  36. data/html/favicon.ico +0 -0
  37. data/html/favicon.xcf +0 -0
  38. data/html/index.html +1 -7
  39. data/lib/groonga/record.rb +6 -1
  40. data/test/groonga-test-utils.rb +1 -0
  41. data/test/test-array.rb +81 -0
  42. data/test/test-column.rb +22 -12
  43. data/test/test-context.rb +1 -29
  44. data/test/test-database.rb +30 -0
  45. data/test/test-hash.rb +194 -0
  46. data/test/test-index-column.rb +57 -0
  47. data/test/test-patricia-trie.rb +82 -0
  48. data/test/test-record.rb +10 -10
  49. data/test/test-table.rb +37 -130
  50. data/test/test-type.rb +4 -3
  51. metadata +15 -4
  52. data/benchmark/small-many-items.rb +0 -175
data/ext/rb-grn-utils.c CHANGED
@@ -96,10 +96,10 @@ rb_grn_bulk_to_ruby_object_by_range_id (grn_ctx *context, grn_obj *bulk,
96
96
  case GRN_DB_VOID:
97
97
  *rb_value = rb_str_new(GRN_BULK_HEAD(bulk), GRN_BULK_VSIZE(bulk));
98
98
  break;
99
- case GRN_DB_INT:
99
+ case GRN_DB_INT32:
100
100
  *rb_value = INT2NUM(*((int *)GRN_BULK_HEAD(bulk)));
101
101
  break;
102
- case GRN_DB_UINT:
102
+ case GRN_DB_UINT32:
103
103
  *rb_value = UINT2NUM(*((int *)GRN_BULK_HEAD(bulk)));
104
104
  break;
105
105
  case GRN_DB_INT64:
@@ -148,7 +148,7 @@ rb_grn_bulk_to_ruby_object_by_range_type (grn_ctx *context, grn_obj *bulk,
148
148
  if (id == GRN_ID_NIL)
149
149
  *rb_value = Qnil;
150
150
  else
151
- *rb_value = rb_grn_record_new(rb_range, id);
151
+ *rb_value = rb_grn_record_new(rb_range, id, Qnil);
152
152
  }
153
153
  break;
154
154
  default:
@@ -172,7 +172,7 @@ rb_grn_bulk_to_ruby_object (grn_ctx *context, grn_obj *bulk,
172
172
  return Qnil;
173
173
 
174
174
  range_id = bulk->header.domain;
175
- range = grn_ctx_get(context, range_id);
175
+ range = grn_ctx_at(context, range_id);
176
176
  rb_range = GRNOBJECT2RVAL(Qnil, context, range, RB_GRN_FALSE);
177
177
 
178
178
  if (rb_grn_bulk_to_ruby_object_by_range_id(context, bulk,
@@ -200,66 +200,74 @@ rb_grn_bulk_from_ruby_object (VALUE object, grn_ctx *context, grn_obj *bulk)
200
200
  grn_id id_value;
201
201
  grn_obj_flags flags = 0;
202
202
 
203
- if (NIL_P(object)) {
203
+ switch (TYPE(object)) {
204
+ case T_NIL:
204
205
  string = NULL;
205
206
  size = 0;
206
- } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cString))) {
207
+ break;
208
+ case T_STRING:
207
209
  string = RSTRING_PTR(object);
208
210
  size = RSTRING_LEN(object);
209
211
  flags |= GRN_OBJ_DO_SHALLOW_COPY;
210
- } else if (FIXNUM_P(object)) {
212
+ break;
213
+ case T_FIXNUM:
211
214
  int32_value = NUM2INT(object);
212
215
  string = (const char *)&int32_value;
213
216
  size = sizeof(int32_value);
214
- } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cBignum))) {
217
+ break;
218
+ case T_BIGNUM:
215
219
  int64_value = NUM2LL(object);
216
220
  string = (const char *)&int64_value;
217
221
  size = sizeof(int64_value);
218
- } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cFloat))) {
222
+ break;
223
+ case T_FLOAT:
219
224
  double_value = NUM2DBL(object);
220
225
  string = (const char *)&double_value;
221
226
  size = sizeof(double_value);
222
- } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cTime))) {
223
- time_value.tv_sec = NUM2INT(rb_funcall(object, rb_intern("to_i"), 0));
224
- time_value.tv_usec = NUM2INT(rb_funcall(object, rb_intern("usec"), 0));
225
- string = (const char *)&time_value;
226
- size = sizeof(time_value);
227
- } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnObject))) {
228
- grn_obj *grn_object;
229
-
230
- grn_object = RVAL2GRNOBJECT(object, &context);
231
- id_value = grn_obj_id(context, grn_object);
232
- string = (const char *)&id_value;
233
- size = sizeof(id_value);
234
- } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnRecord))) {
235
- id_value = NUM2UINT(rb_funcall(object, rb_intern("id"), 0));
236
- string = (const char *)&id_value;
237
- size = sizeof(id_value);
238
- } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnRecord))) {
239
- id_value = NUM2UINT(rb_funcall(object, rb_intern("id"), 0));
240
- string = (const char *)&id_value;
241
- size = sizeof(id_value);
242
- } else {
243
- rb_raise(rb_eTypeError,
244
- "bulked object should be one of "
245
- "[nil, String, Integer, Float, Time, Groonga::Object]: %s",
246
- rb_grn_inspect(object));
227
+ break;
228
+ default:
229
+ if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cTime))) {
230
+ VALUE sec, usec;
231
+
232
+ sec = rb_funcall(object, rb_intern("to_i"), 0);
233
+ usec = rb_funcall(object, rb_intern("usec"), 0);
234
+ time_value.tv_sec = NUM2INT(sec);
235
+ time_value.tv_usec = NUM2INT(usec);
236
+ string = (const char *)&time_value;
237
+ size = sizeof(time_value);
238
+ } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnObject))) {
239
+ grn_obj *grn_object;
240
+
241
+ grn_object = RVAL2GRNOBJECT(object, &context);
242
+ id_value = grn_obj_id(context, grn_object);
243
+ string = (const char *)&id_value;
244
+ size = sizeof(id_value);
245
+ } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnRecord))) {
246
+ id_value = NUM2UINT(rb_funcall(object, rb_intern("id"), 0));
247
+ string = (const char *)&id_value;
248
+ size = sizeof(id_value);
249
+ } else {
250
+ rb_raise(rb_eTypeError,
251
+ "bulked object should be one of "
252
+ "[nil, String, Integer, Float, Time, Groonga::Object]: %s",
253
+ rb_grn_inspect(object));
254
+ }
255
+ break;
247
256
  }
248
257
 
249
- if (bulk) {
250
- GRN_OBJ_INIT(bulk, GRN_BULK, flags);
251
- } else {
252
- bulk = grn_obj_open(context, GRN_BULK, 0, flags);
258
+ if (!bulk) {
259
+ bulk = grn_obj_open(context, GRN_BULK, flags, GRN_ID_NIL);
253
260
  rb_grn_context_check(context, object);
254
261
  }
255
- GRN_BULK_SET(context, bulk, string, size);
262
+ GRN_TEXT_SET(context, bulk, string, size);
256
263
 
257
264
  return bulk;
258
265
  }
259
266
 
260
267
  grn_obj *
261
268
  rb_grn_bulk_from_ruby_object_with_type (VALUE object, grn_ctx *context,
262
- grn_obj *bulk, grn_id type)
269
+ grn_obj *bulk,
270
+ grn_id type_id, grn_obj *type)
263
271
  {
264
272
  const char *string;
265
273
  unsigned int size;
@@ -271,15 +279,14 @@ rb_grn_bulk_from_ruby_object_with_type (VALUE object, grn_ctx *context,
271
279
  grn_id range;
272
280
  VALUE rb_type;
273
281
  grn_obj_flags flags = 0;
274
- grn_obj *type_object;
275
282
 
276
- switch (type) {
277
- case GRN_DB_INT:
283
+ switch (type_id) {
284
+ case GRN_DB_INT32:
278
285
  int32_value = NUM2INT(object);
279
286
  string = (const char *)&int32_value;
280
287
  size = sizeof(int32_value);
281
288
  break;
282
- case GRN_DB_UINT:
289
+ case GRN_DB_UINT32:
283
290
  uint32_value = NUM2UINT(object);
284
291
  string = (const char *)&uint32_value;
285
292
  size = sizeof(uint32_value);
@@ -305,7 +312,7 @@ rb_grn_bulk_from_ruby_object_with_type (VALUE object, grn_ctx *context,
305
312
  case GRN_DB_LONGTEXT:
306
313
  string = StringValuePtr(object);
307
314
  size = RSTRING_LEN(object);
308
- range = grn_obj_get_range(context, grn_ctx_get(context, type));
315
+ range = grn_obj_get_range(context, type);
309
316
  if (size > range)
310
317
  rb_raise(rb_eArgError,
311
318
  "string is too large: expected: %u <= %u",
@@ -318,8 +325,7 @@ rb_grn_bulk_from_ruby_object_with_type (VALUE object, grn_ctx *context,
318
325
  case GRN_DB_BIGRAM:
319
326
  case GRN_DB_TRIGRAM:
320
327
  case GRN_DB_MECAB:
321
- type_object = grn_ctx_get(context, type);
322
- rb_type = GRNOBJECT2RVAL(Qnil, context, type_object, RB_GRN_FALSE);
328
+ rb_type = GRNOBJECT2RVAL(Qnil, context, type, RB_GRN_FALSE);
323
329
  rb_raise(rb_eArgError,
324
330
  "unbulkable type: %s",
325
331
  rb_grn_inspect(rb_type));
@@ -329,13 +335,11 @@ rb_grn_bulk_from_ruby_object_with_type (VALUE object, grn_ctx *context,
329
335
  break;
330
336
  }
331
337
 
332
- if (bulk) {
333
- GRN_OBJ_INIT(bulk, GRN_BULK, flags);
334
- } else {
338
+ if (!bulk) {
335
339
  bulk = grn_obj_open(context, GRN_BULK, flags, GRN_ID_NIL);
336
340
  rb_grn_context_check(context, object);
337
341
  }
338
- GRN_BULK_SET(context, bulk, string, size);
342
+ GRN_TEXT_SET(context, bulk, string, size);
339
343
 
340
344
  return bulk;
341
345
  }
@@ -376,7 +380,7 @@ rb_grn_vector_from_ruby_object (VALUE object, grn_ctx *context, grn_obj *vector)
376
380
  int i, n;
377
381
 
378
382
  if (vector)
379
- GRN_OBJ_INIT(vector, GRN_VECTOR, 0);
383
+ GRN_OBJ_INIT(vector, GRN_VECTOR, 0, GRN_ID_NIL);
380
384
  else
381
385
  vector = grn_obj_open(context, GRN_VECTOR, 0, 0);
382
386
 
@@ -428,7 +432,7 @@ rb_grn_uvector_from_ruby_object (VALUE object, grn_ctx *context,
428
432
  int i, n;
429
433
 
430
434
  if (uvector)
431
- GRN_OBJ_INIT(uvector, GRN_UVECTOR, 0);
435
+ GRN_OBJ_INIT(uvector, GRN_UVECTOR, 0, GRN_ID_NIL);
432
436
  else
433
437
  uvector = grn_obj_open(context, GRN_UVECTOR, 0, 0);
434
438
 
@@ -526,8 +530,8 @@ rb_grn_key_to_ruby_object (grn_ctx *context, const void *key, int key_size,
526
530
  {
527
531
  grn_obj bulk;
528
532
 
529
- GRN_OBJ_INIT(&bulk, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY);
530
- GRN_BULK_SET(context, &bulk, key, key_size);
533
+ GRN_OBJ_INIT(&bulk, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY, GRN_ID_NIL);
534
+ GRN_TEXT_SET(context, &bulk, key, key_size);
531
535
  bulk.header.domain = table->header.domain;
532
536
 
533
537
  return GRNBULK2RVAL(context, &bulk, related_object);
@@ -535,21 +539,17 @@ rb_grn_key_to_ruby_object (grn_ctx *context, const void *key, int key_size,
535
539
 
536
540
  grn_obj *
537
541
  rb_grn_key_from_ruby_object (VALUE rb_key, grn_ctx *context,
538
- grn_obj *key, grn_id domain_id,
542
+ grn_obj *key, grn_id domain_id, grn_obj *domain,
539
543
  VALUE related_object)
540
544
  {
541
- grn_obj *domain = NULL;
542
545
  grn_id id;
543
546
 
544
- if (domain_id != GRN_ID_NIL)
545
- domain = grn_ctx_get(context, domain_id);
546
-
547
547
  if (!domain)
548
548
  return RVAL2GRNBULK(rb_key, context, key);
549
549
 
550
550
  switch (domain->header.type) {
551
551
  case GRN_TYPE:
552
- return RVAL2GRNBULK_WITH_TYPE(rb_key, context, key, domain_id);
552
+ return RVAL2GRNBULK_WITH_TYPE(rb_key, context, key, domain_id, domain);
553
553
  break;
554
554
  case GRN_TABLE_HASH_KEY:
555
555
  case GRN_TABLE_PAT_KEY:
@@ -567,8 +567,7 @@ rb_grn_key_from_ruby_object (VALUE rb_key, grn_ctx *context,
567
567
  break;
568
568
  }
569
569
 
570
- GRN_OBJ_INIT(key, GRN_BULK, 0);
571
- GRN_BULK_SET(context, key, &id, sizeof(id));
570
+ GRN_TEXT_SET(context, key, &id, sizeof(id));
572
571
  return key;
573
572
  }
574
573
 
data/ext/rb-grn.h CHANGED
@@ -59,7 +59,7 @@ RB_GRN_BEGIN_DECLS
59
59
 
60
60
  #define RB_GRN_MAJOR_VERSION 0
61
61
  #define RB_GRN_MINOR_VERSION 0
62
- #define RB_GRN_MICRO_VERSION 1
62
+ #define RB_GRN_MICRO_VERSION 2
63
63
 
64
64
  typedef int rb_grn_boolean;
65
65
  #define RB_GRN_FALSE (0)
@@ -74,9 +74,74 @@ typedef struct {
74
74
  int32_t tv_usec;
75
75
  } grn_timeval;
76
76
 
77
+ #define RB_GRN_OBJECT(object) ((RbGrnObject *)(object))
78
+ #define RB_GRN_TABLE(object) ((RbGrnTable *)(object))
79
+ #define RB_GRN_TABLE_CURSOR(object) ((RbGrnTableCursort *)(object))
80
+ #define RB_GRN_INDEX_COLUMN(object) ((RbGrnIndexColumn *)(object))
81
+ #define RB_GRN_UNBIND_FUNCTION(function) ((RbGrnUnbindFunction)(function))
82
+
83
+ typedef void (*RbGrnUnbindFunction) (void *object);
84
+
85
+ typedef struct _RbGrnObject RbGrnObject;
86
+ struct _RbGrnObject
87
+ {
88
+ grn_ctx *context;
89
+ grn_obj *object;
90
+ grn_obj *domain;
91
+ grn_id domain_id;
92
+ grn_obj *range;
93
+ grn_id range_id;
94
+ rb_grn_boolean owner;
95
+ RbGrnUnbindFunction unbind;
96
+ };
97
+
98
+ typedef struct _RbGrnTable RbGrnTable;
99
+ struct _RbGrnTable
100
+ {
101
+ RbGrnObject parent;
102
+ grn_obj *value;
103
+ };
104
+
105
+ typedef struct _RbGrnTableKeySupport RbGrnTableKeySupport;
106
+ struct _RbGrnTableKeySupport
107
+ {
108
+ RbGrnTable parent;
109
+ grn_obj *key;
110
+ };
111
+
112
+ typedef struct _RbGrnColumn RbGrnColumn;
113
+ struct _RbGrnColumn
114
+ {
115
+ RbGrnObject parent;
116
+ grn_obj *value;
117
+ };
118
+
119
+ typedef struct _RbGrnFixSizeColumn RbGrnFixSizeColumn;
120
+ struct _RbGrnFixSizeColumn
121
+ {
122
+ RbGrnObject parent;
123
+ grn_obj *value;
124
+ };
125
+
126
+ typedef struct _RbGrnIndexColumn RbGrnIndexColumn;
127
+ struct _RbGrnIndexColumn
128
+ {
129
+ RbGrnObject parent;
130
+ grn_obj *value;
131
+ grn_obj *old_value;
132
+ grn_obj *id_query;
133
+ grn_obj *string_query;
134
+ };
135
+
136
+ typedef struct _RbGrnTableCursor RbGrnTableCursor;
137
+ struct _RbGrnTableCursor
138
+ {
139
+ RbGrnObject parent;
140
+ };
77
141
 
78
142
  RB_GRN_VAR VALUE rb_eGrnError;
79
143
  RB_GRN_VAR VALUE rb_cGrnObject;
144
+ RB_GRN_VAR VALUE rb_mGrnEncodingSupport;
80
145
  RB_GRN_VAR VALUE rb_cGrnDatabase;
81
146
  RB_GRN_VAR VALUE rb_cGrnTable;
82
147
  RB_GRN_VAR VALUE rb_mGrnTableKeySupport;
@@ -103,6 +168,7 @@ RB_GRN_VAR VALUE rb_cGrnSnippet;
103
168
  void rb_grn_init_utils (VALUE mGrn);
104
169
  void rb_grn_init_exception (VALUE mGrn);
105
170
  void rb_grn_init_encoding (VALUE mGrn);
171
+ void rb_grn_init_encoding_support (VALUE mGrn);
106
172
  void rb_grn_init_context (VALUE mGrn);
107
173
  void rb_grn_init_object (VALUE mGrn);
108
174
  void rb_grn_init_database (VALUE mGrn);
@@ -119,6 +185,8 @@ void rb_grn_init_patricia_trie_cursor (VALUE mGrn);
119
185
  void rb_grn_init_type (VALUE mGrn);
120
186
  void rb_grn_init_procedure (VALUE mGrn);
121
187
  void rb_grn_init_column (VALUE mGrn);
188
+ void rb_grn_init_fix_size_column (VALUE mGrn);
189
+ void rb_grn_init_index_column (VALUE mGrn);
122
190
  void rb_grn_init_accessor (VALUE mGrn);
123
191
  void rb_grn_init_record (VALUE mGrn);
124
192
  void rb_grn_init_query (VALUE mGrn);
@@ -130,7 +198,13 @@ const char *rb_grn_rc_to_message (grn_rc rc);
130
198
  void rb_grn_rc_check (grn_rc rc,
131
199
  VALUE related_object);
132
200
 
133
- grn_ctx *rb_grn_context_ensure (VALUE context);
201
+ void rb_grn_context_register (grn_ctx *context,
202
+ RbGrnObject *object);
203
+ void rb_grn_context_unregister (grn_ctx *context,
204
+ RbGrnObject *object);
205
+ void rb_grn_context_unbind (grn_ctx *context);
206
+
207
+ grn_ctx *rb_grn_context_ensure (VALUE *context);
134
208
  VALUE rb_grn_context_get_default (void);
135
209
  VALUE rb_grn_context_to_exception (grn_ctx *context,
136
210
  VALUE related_object);
@@ -144,9 +218,24 @@ rb_grn_boolean rb_grn_equal_option (VALUE option,
144
218
  const char *key);
145
219
 
146
220
  VALUE rb_grn_object_alloc (VALUE klass);
147
- void rb_grn_object_initialize (VALUE self,
221
+ void rb_grn_object_bind (RbGrnObject *rb_grn_object,
148
222
  grn_ctx *context,
149
- grn_obj *object);
223
+ grn_obj *object,
224
+ rb_grn_boolean owner);
225
+ void rb_grn_object_unbind (RbGrnObject *rb_grn_object);
226
+ void rb_grn_object_assign (VALUE self,
227
+ VALUE rb_context,
228
+ grn_ctx *context,
229
+ grn_obj *object,
230
+ rb_grn_boolean owner);
231
+ void rb_grn_object_deconstruct (RbGrnObject *rb_grn_object,
232
+ grn_obj **object,
233
+ grn_ctx **context,
234
+ grn_id *domain_id,
235
+ grn_obj **domain,
236
+ grn_id *range_id,
237
+ grn_obj **range);
238
+
150
239
  VALUE rb_grn_object_array_reference (VALUE object,
151
240
  VALUE rb_id);
152
241
  VALUE rb_grn_object_close (VALUE object);
@@ -163,16 +252,116 @@ VALUE rb_grn_object_inspect_content (VALUE object,
163
252
  VALUE rb_grn_object_inspect_footer (VALUE object,
164
253
  VALUE inspected);
165
254
 
255
+ VALUE rb_grn_table_alloc (VALUE klass);
256
+ void rb_grn_table_bind (RbGrnTable *rb_grn_table,
257
+ grn_ctx *context,
258
+ grn_obj *table_key_support,
259
+ rb_grn_boolean owner);
260
+ void rb_grn_table_unbind (RbGrnTable *rb_grn_table);
261
+ void rb_grn_table_assign (VALUE self,
262
+ VALUE rb_context,
263
+ grn_ctx *context,
264
+ grn_obj *table,
265
+ rb_grn_boolean owner);
266
+ void rb_grn_table_deconstruct (RbGrnTable *rb_grn_table,
267
+ grn_obj **table,
268
+ grn_ctx **context,
269
+ grn_id *domain_id,
270
+ grn_obj **domain,
271
+ grn_obj **value,
272
+ grn_id *range_id,
273
+ grn_obj **range);
274
+
275
+ grn_obj *rb_grn_table_open_raw (int argc,
276
+ VALUE *argv,
277
+ grn_ctx **context,
278
+ VALUE *rb_context);
166
279
  VALUE rb_grn_table_s_create (int argc,
167
280
  VALUE *argv,
168
281
  VALUE klass,
169
282
  grn_obj_flags key_store);
283
+
284
+ VALUE rb_grn_table_delete (VALUE self,
285
+ VALUE rb_id);
286
+ VALUE rb_grn_table_array_reference (VALUE self,
287
+ VALUE rb_id);
288
+ VALUE rb_grn_table_array_set (VALUE self,
289
+ VALUE rb_id,
290
+ VALUE rb_value);
291
+
170
292
  grn_ctx *rb_grn_table_cursor_ensure_context (VALUE cursor,
171
- VALUE rb_context);
293
+ VALUE *rb_context);
172
294
  VALUE rb_grn_table_cursor_close (VALUE object);
173
295
 
296
+ VALUE rb_grn_table_key_support_alloc (VALUE klass);
297
+ void rb_grn_table_key_support_bind (RbGrnTableKeySupport *rb_grn_table_key_support,
298
+ grn_ctx *context,
299
+ grn_obj *table_key_support,
300
+ rb_grn_boolean owner);
301
+ void rb_grn_table_key_support_unbind (RbGrnTableKeySupport *rb_grn_table_key_support);
302
+ void rb_grn_table_key_support_assign (VALUE self,
303
+ VALUE rb_context,
304
+ grn_ctx *context,
305
+ grn_obj *table_key_support,
306
+ rb_grn_boolean owner);
307
+ void rb_grn_table_key_support_deconstruct (RbGrnTableKeySupport *rb_grn_table_key_support,
308
+ grn_obj **table_key_support,
309
+ grn_ctx **context,
310
+ grn_obj **key,
311
+ grn_id *domain_id,
312
+ grn_obj **domain,
313
+ grn_obj **value,
314
+ grn_id *range_id,
315
+ grn_obj **range);
316
+ grn_id rb_grn_table_key_support_get (VALUE self,
317
+ VALUE rb_key);
318
+
319
+ VALUE rb_grn_fix_size_column_alloc (VALUE klass);
320
+ void rb_grn_fix_size_column_bind (RbGrnFixSizeColumn *rb_grn_fix_size_column,
321
+ grn_ctx *context,
322
+ grn_obj *column_key_support,
323
+ rb_grn_boolean owner);
324
+ void rb_grn_fix_size_column_unbind (RbGrnFixSizeColumn *rb_grn_fix_size_column);
325
+ void rb_grn_fix_size_column_assign (VALUE self,
326
+ VALUE rb_context,
327
+ grn_ctx *context,
328
+ grn_obj *column,
329
+ rb_grn_boolean owner);
330
+ void rb_grn_fix_size_column_deconstruct (RbGrnFixSizeColumn *rb_grn_fix_size_column,
331
+ grn_obj **column,
332
+ grn_ctx **context,
333
+ grn_id *domain_id,
334
+ grn_obj **domain,
335
+ grn_obj **value,
336
+ grn_id *range_id,
337
+ grn_obj **range);
338
+
339
+ VALUE rb_grn_index_column_alloc (VALUE klass);
340
+ void rb_grn_index_column_bind (RbGrnIndexColumn *rb_grn_index_column,
341
+ grn_ctx *context,
342
+ grn_obj *column_key_support,
343
+ rb_grn_boolean owner);
344
+ void rb_grn_index_column_unbind (RbGrnIndexColumn *rb_grn_index_column);
345
+ void rb_grn_index_column_assign (VALUE self,
346
+ VALUE rb_context,
347
+ grn_ctx *context,
348
+ grn_obj *column,
349
+ rb_grn_boolean owner);
350
+ void rb_grn_index_column_deconstruct (RbGrnIndexColumn *rb_grn_index_column,
351
+ grn_obj **column,
352
+ grn_ctx **context,
353
+ grn_id *domain_id,
354
+ grn_obj **domain,
355
+ grn_obj **value,
356
+ grn_obj **old_value,
357
+ grn_id *range_id,
358
+ grn_obj **range,
359
+ grn_obj **id_query,
360
+ grn_obj **string_query);
361
+
174
362
  VALUE rb_grn_record_new (VALUE table,
175
- grn_id id);
363
+ grn_id id,
364
+ VALUE values);
176
365
 
177
366
 
178
367
  #define RB_GRN_INTERN(string) (ID2SYM(rb_intern(string)))
@@ -203,7 +392,7 @@ VALUE rb_grn_record_new (VALUE table,
203
392
 
204
393
  #define RVAL2GRNTABLECURSOR(object) (rb_grn_table_cursor_from_ruby_object(object))
205
394
  #define GRNTABLECURSOR2RVAL(klass, context, cursor) \
206
- (rb_grn_table_cursor_to_ruby_object(klass, context, cursor))
395
+ (rb_grn_table_cursor_to_ruby_object(klass, context, cursor, RB_GRN_TRUE))
207
396
  #define GRNTABLECURSOR2RCLASS(object) (rb_grn_table_cursor_to_ruby_class(object))
208
397
 
209
398
  #define RVAL2GRNCOLUMN(object, context) \
@@ -220,8 +409,8 @@ VALUE rb_grn_record_new (VALUE table,
220
409
 
221
410
  #define RVAL2GRNBULK(object, context, bulk) \
222
411
  (rb_grn_bulk_from_ruby_object(object, context, bulk))
223
- #define RVAL2GRNBULK_WITH_TYPE(object, context, bulk, type) \
224
- (rb_grn_bulk_from_ruby_object_with_type(object, context, bulk, type))
412
+ #define RVAL2GRNBULK_WITH_TYPE(object, context, bulk, type_id, type) \
413
+ (rb_grn_bulk_from_ruby_object_with_type(object, context, bulk, type_id, type))
225
414
  #define GRNBULK2RVAL(context, bulk, related_object) \
226
415
  (rb_grn_bulk_to_ruby_object(context, bulk, related_object))
227
416
 
@@ -243,8 +432,9 @@ VALUE rb_grn_record_new (VALUE table,
243
432
 
244
433
  #define GRNKEY2RVAL(context, key, key_size, table, related_object) \
245
434
  (rb_grn_key_to_ruby_object(context, key, key_size, table, related_object))
246
- #define RVAL2GRNKEY(object, context, key, domain, related_object) \
247
- (rb_grn_key_from_ruby_object(object, context, key, domain, related_object))
435
+ #define RVAL2GRNKEY(object, context, key, domain_id, domain, related_object) \
436
+ (rb_grn_key_from_ruby_object(object, context, key, domain_id, \
437
+ domain, related_object))
248
438
 
249
439
 
250
440
  grn_encoding rb_grn_encoding_from_ruby_object (VALUE object,
@@ -274,11 +464,20 @@ VALUE rb_grn_table_to_ruby_object (grn_ctx *context,
274
464
  rb_grn_boolean owner);
275
465
 
276
466
  grn_table_cursor *
277
- rb_grn_table_cursor_from_ruby_object (VALUE object);
467
+ rb_grn_table_cursor_from_ruby_object (VALUE object,
468
+ grn_ctx **context);
278
469
  VALUE rb_grn_table_cursor_to_ruby_object (VALUE klass,
279
470
  grn_ctx *context,
280
- grn_table_cursor *cursor);
471
+ grn_table_cursor *cursor,
472
+ rb_grn_boolean owner);
281
473
  VALUE rb_grn_table_cursor_to_ruby_class (grn_table_cursor *cursor);
474
+ void rb_grn_table_cursor_deconstruct (RbGrnTableCursor *rb_grn_table_cursor,
475
+ grn_table_cursor **cursor,
476
+ grn_ctx **context,
477
+ grn_id *domain_id,
478
+ grn_obj **domain,
479
+ grn_id *range_id,
480
+ grn_obj **range);
282
481
 
283
482
  grn_obj *rb_grn_column_from_ruby_object (VALUE object,
284
483
  grn_ctx **context);
@@ -305,7 +504,8 @@ grn_obj *rb_grn_bulk_from_ruby_object_with_type
305
504
  (VALUE object,
306
505
  grn_ctx *context,
307
506
  grn_obj *bulk,
308
- grn_id type);
507
+ grn_id type_id,
508
+ grn_obj *type);
309
509
  VALUE rb_grn_bulk_to_ruby_object (grn_ctx *context,
310
510
  grn_obj *bulk,
311
511
  VALUE related_object);
@@ -339,6 +539,7 @@ grn_obj *rb_grn_key_from_ruby_object (VALUE rb_key,
339
539
  grn_ctx *context,
340
540
  grn_obj *key,
341
541
  grn_id domain_id,
542
+ grn_obj *domain,
342
543
  VALUE related_object);
343
544
 
344
545
  RB_GRN_END_DECLS
data/ext/rb-groonga.c CHANGED
@@ -21,19 +21,8 @@
21
21
  extern grn_ctx grn_gctx;
22
22
 
23
23
  static void
24
- finish_groonga (VALUE data)
24
+ finish_groonga (void)
25
25
  {
26
- grn_ctx *context;
27
-
28
- context = grn_gctx.next;
29
- while (RB_GRN_TRUE) {
30
- grn_ctx *next_context = context->next;
31
-
32
- grn_ctx_fin(context);
33
- if (next_context == &grn_gctx)
34
- break;
35
- context = next_context;
36
- }
37
26
  grn_fin();
38
27
  }
39
28
 
@@ -76,9 +65,14 @@ Init_groonga (void)
76
65
  */
77
66
  rb_define_const(mGrn, "BINDINGS_VERSION", cGrnBindingsVersion);
78
67
 
79
- rb_grn_init_utils(mGrn);
80
68
  rb_grn_init_exception(mGrn);
69
+
70
+ rb_grn_rc_check(grn_init(), Qnil);
71
+ atexit(finish_groonga);
72
+
73
+ rb_grn_init_utils(mGrn);
81
74
  rb_grn_init_encoding(mGrn);
75
+ rb_grn_init_encoding_support(mGrn);
82
76
  rb_grn_init_context(mGrn);
83
77
  rb_grn_init_object(mGrn);
84
78
  rb_grn_init_database(mGrn);
@@ -92,7 +86,4 @@ Init_groonga (void)
92
86
  rb_grn_init_query(mGrn);
93
87
  rb_grn_init_logger(mGrn);
94
88
  rb_grn_init_snippet(mGrn);
95
-
96
- rb_grn_rc_check(grn_init(), Qnil);
97
- rb_set_end_proc(finish_groonga, Qnil);
98
89
  }
data/extconf.rb CHANGED
@@ -35,7 +35,7 @@ package_name = "groonga"
35
35
  module_name = "groonga"
36
36
  ext_dir_name = "ext"
37
37
  src_dir = File.join(File.expand_path(File.dirname(__FILE__)), ext_dir_name)
38
- major, minor, micro = 0, 0, 4
38
+ major, minor, micro = 0, 0, 8
39
39
 
40
40
  def install_groonga_locally(major, minor, micro)
41
41
  require 'open-uri'
@@ -116,6 +116,8 @@ have_header("ruby/st.h") unless have_macro("HAVE_RUBY_ST_H", "ruby.h")
116
116
  have_func("rb_errinfo", "ruby.h")
117
117
  have_type("enum ruby_value_type", "ruby.h")
118
118
 
119
+ $INSTALLFILES << ["../lib/**/*.rb", "$(RUBYLIBDIR)", "../lib"]
120
+
119
121
  create_makefile(module_name, src_dir)
120
122
 
121
123
  makefile = File.read("Makefile")
data/html/favicon.ico ADDED
Binary file
data/html/favicon.xcf ADDED
Binary file
data/html/index.html CHANGED
@@ -61,7 +61,7 @@
61
61
  <li><a href="groonga/TUTORIAL_ja_rdoc.html">Ruby/groongaのチュートリアル</a></li>
62
62
  </ul>
63
63
 
64
- <h2 id="about-active-groonga">ActiveGroongaとは</h2>
64
+ <h2 id="about-active-groonga">ActiveGroonga</h2>
65
65
  <p>
66
66
  ActiveGroongaはRuby/groongaの機能を使ってより利用しやすい全文検索機能・データストア機能を提供するライブラリです。
67
67
  ActiveRecordのようなAPIでgroongaで管理しているデータを通常のオブジェクトのように扱えます。
@@ -88,12 +88,6 @@
88
88
  </p>
89
89
  <pre class="command">% sudo gem install activegroonga</pre>
90
90
 
91
- <h3>ActiveGroongaのインストール</h3>
92
- <p>
93
- ActiveGroonagaもRubyGemsでインストールできます。
94
- </p>
95
- <pre class="command">% sudo gem install activegroonga</pre>
96
-
97
91
  <h3>ActiveGroongaのドキュメント</h3>
98
92
  <p>
99
93
  ActiveGroonagaのドキュメントはそれほどありません。