rroonga 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/NEWS.ja.rdoc +46 -0
  2. data/NEWS.rdoc +46 -0
  3. data/README.ja.rdoc +2 -2
  4. data/README.rdoc +2 -3
  5. data/Rakefile +148 -11
  6. data/example/bookmark.rb +94 -91
  7. data/ext/groonga/extconf.rb +25 -25
  8. data/ext/groonga/groonga.def +2 -0
  9. data/ext/groonga/mkmf.log +7 -7
  10. data/ext/groonga/rb-grn-column.c +66 -0
  11. data/ext/groonga/rb-grn-context.c +92 -5
  12. data/ext/groonga/rb-grn-database.c +24 -1
  13. data/ext/groonga/rb-grn-exception.c +15 -0
  14. data/ext/groonga/rb-grn-hash.c +2 -2
  15. data/ext/groonga/rb-grn-index-column.c +8 -4
  16. data/ext/groonga/rb-grn-object.c +4 -2
  17. data/ext/groonga/rb-grn-patricia-trie.c +2 -2
  18. data/ext/groonga/rb-grn-snippet.c +1 -0
  19. data/ext/groonga/rb-grn-table-key-support.c +22 -19
  20. data/ext/groonga/rb-grn-table.c +63 -5
  21. data/ext/groonga/rb-grn.h +1 -1
  22. data/ext/groonga/rb-groonga.c +1 -0
  23. data/extconf.rb +1 -1
  24. data/html/developer.html +8 -2
  25. data/html/favicon.ico +0 -0
  26. data/html/favicon.svg +591 -0
  27. data/html/index.html +71 -8
  28. data/html/logo.svg +612 -0
  29. data/html/ranguba.css +92 -7
  30. data/html/readme.svg +256 -0
  31. data/lib/groonga/expression-builder.rb +8 -4
  32. data/lib/groonga/record.rb +77 -7
  33. data/lib/groonga/schema.rb +429 -100
  34. data/rroonga-build.rb +1 -1
  35. data/test/run-test.rb +1 -1
  36. data/test/test-array.rb +4 -0
  37. data/test/test-context.rb +8 -0
  38. data/test/test-database.rb +8 -1
  39. data/test/test-expression-builder.rb +14 -0
  40. data/test/test-fix-size-column.rb +4 -0
  41. data/test/test-hash.rb +10 -4
  42. data/test/test-index-column.rb +11 -0
  43. data/test/test-patricia-trie.rb +7 -1
  44. data/test/test-record.rb +14 -0
  45. data/test/test-remote.rb +3 -2
  46. data/test/test-schema-create-table.rb +32 -2
  47. data/test/test-schema.rb +108 -11
  48. data/test/test-table-select-normalize.rb +7 -3
  49. data/test/test-table-select.rb +12 -0
  50. data/test/test-table.rb +7 -0
  51. data/test/test-variable-size-column.rb +4 -0
  52. data/test-unit/Rakefile +40 -0
  53. data/test-unit/TODO +5 -0
  54. data/test-unit/bin/testrb +5 -0
  55. data/test-unit/html/classic.html +15 -0
  56. data/test-unit/html/index.html +25 -0
  57. data/test-unit/html/index.html.ja +27 -0
  58. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  59. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  60. data/test-unit/lib/test/unit/attribute.rb +125 -0
  61. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  62. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  63. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  64. data/test-unit/lib/test/unit/collector/load.rb +144 -0
  65. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  66. data/test-unit/lib/test/unit/collector.rb +36 -0
  67. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  68. data/test-unit/lib/test/unit/color.rb +96 -0
  69. data/test-unit/lib/test/unit/diff.rb +724 -0
  70. data/test-unit/lib/test/unit/error.rb +130 -0
  71. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  72. data/test-unit/lib/test/unit/failure.rb +136 -0
  73. data/test-unit/lib/test/unit/fixture.rb +176 -0
  74. data/test-unit/lib/test/unit/notification.rb +129 -0
  75. data/test-unit/lib/test/unit/omission.rb +191 -0
  76. data/test-unit/lib/test/unit/pending.rb +150 -0
  77. data/test-unit/lib/test/unit/priority.rb +180 -0
  78. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  79. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  80. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  81. data/test-unit/lib/test/unit/testcase.rb +476 -0
  82. data/test-unit/lib/test/unit/testresult.rb +89 -0
  83. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  84. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  85. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  86. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  87. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  88. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  89. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  90. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  91. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  92. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  93. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  94. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  95. data/test-unit/lib/test/unit/version.rb +7 -0
  96. data/test-unit/lib/test/unit.rb +323 -0
  97. data/test-unit/sample/adder.rb +13 -0
  98. data/test-unit/sample/subtracter.rb +12 -0
  99. data/test-unit/sample/test_adder.rb +20 -0
  100. data/test-unit/sample/test_subtracter.rb +20 -0
  101. data/test-unit/sample/test_user.rb +23 -0
  102. data/test-unit/test/collector/test-descendant.rb +133 -0
  103. data/test-unit/test/collector/test-load.rb +442 -0
  104. data/test-unit/test/collector/test_dir.rb +406 -0
  105. data/test-unit/test/collector/test_objectspace.rb +100 -0
  106. data/test-unit/test/run-test.rb +15 -0
  107. data/test-unit/test/test-attribute.rb +86 -0
  108. data/test-unit/test/test-color-scheme.rb +67 -0
  109. data/test-unit/test/test-color.rb +47 -0
  110. data/test-unit/test/test-diff.rb +518 -0
  111. data/test-unit/test/test-emacs-runner.rb +60 -0
  112. data/test-unit/test/test-fixture.rb +287 -0
  113. data/test-unit/test/test-notification.rb +33 -0
  114. data/test-unit/test/test-omission.rb +81 -0
  115. data/test-unit/test/test-pending.rb +70 -0
  116. data/test-unit/test/test-priority.rb +119 -0
  117. data/test-unit/test/test-testcase.rb +544 -0
  118. data/test-unit/test/test_assertions.rb +1151 -0
  119. data/test-unit/test/test_error.rb +26 -0
  120. data/test-unit/test/test_failure.rb +33 -0
  121. data/test-unit/test/test_testresult.rb +113 -0
  122. data/test-unit/test/test_testsuite.rb +129 -0
  123. data/test-unit/test/testunit-test-util.rb +14 -0
  124. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  125. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  126. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  127. data/test-unit/test/util/test_observable.rb +102 -0
  128. data/test-unit/test/util/test_procwrapper.rb +36 -0
  129. data/text/{TUTORIAL.ja.rdoc → tutorial.ja.rdoc} +165 -126
  130. metadata +106 -16
  131. data/html/favicon.xcf +0 -0
  132. data/html/logo.xcf +0 -0
  133. data/license/GPL +0 -340
  134. data/license/RUBY +0 -59
  135. data/pkg-config.rb +0 -333
data/ext/groonga/mkmf.log CHANGED
@@ -1,6 +1,6 @@
1
1
  checking for GCC... -------------------- yes
2
2
 
3
- "gcc -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -I/tmp/local/include/groonga -c conftest.c"
3
+ "cc -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -c conftest.c"
4
4
  checked program was:
5
5
  /* begin */
6
6
  1: /*top*/
@@ -18,7 +18,7 @@ checking for Win32 OS... -------------------- no
18
18
 
19
19
  have_macro: checking for HAVE_RUBY_ST_H in ruby.h... -------------------- no
20
20
 
21
- "gcc -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -I/tmp/local/include/groonga -Wall -c conftest.c"
21
+ "cc -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -Wall -I/tmp/local/include/groonga -c conftest.c"
22
22
  conftest.c:4:3: error: #error
23
23
  conftest.c:5: error: expected identifier or ‘(’ before ‘>>’ token
24
24
  checked program was:
@@ -35,7 +35,7 @@ checked program was:
35
35
 
36
36
  have_header: checking for ruby/st.h... -------------------- no
37
37
 
38
- "gcc -E -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -I/tmp/local/include/groonga -Wall conftest.c -o conftest.i"
38
+ "cc -E -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -Wall -I/tmp/local/include/groonga conftest.c -o conftest.i"
39
39
  conftest.c:1:21: error: ruby/st.h: そのようなファイルやディレクトリはありません
40
40
  checked program was:
41
41
  /* begin */
@@ -46,7 +46,7 @@ checked program was:
46
46
 
47
47
  have_func: checking for rb_errinfo() in ruby.h... -------------------- no
48
48
 
49
- "gcc -o conftest -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -I/tmp/local/include/groonga -Wall conftest.c -L. -L/usr/lib -L. -rdynamic -Wl,-export-dynamic -L/tmp/local/lib -lgroonga -lruby1.8-static -lgroonga -lpthread -lrt -ldl -lcrypt -lm -lc"
49
+ "cc -o conftest -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -Wall -I/tmp/local/include/groonga conftest.c -L. -L/usr/lib -L. -rdynamic -Wl,-export-dynamic -L/tmp/local/lib -lgroonga -lruby1.8-static -lgroonga -lpthread -lrt -ldl -lcrypt -lm -lc"
50
50
  conftest.c: In function ‘t’:
51
51
  conftest.c:5: error: ‘rb_errinfo’ undeclared (first use in this function)
52
52
  conftest.c:5: error: (Each undeclared identifier is reported only once
@@ -60,10 +60,10 @@ checked program was:
60
60
  5: int t() { void ((*volatile p)()); p = (void ((*)()))rb_errinfo; return 0; }
61
61
  /* end */
62
62
 
63
- "gcc -o conftest -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -I/tmp/local/include/groonga -Wall conftest.c -L. -L/usr/lib -L. -rdynamic -Wl,-export-dynamic -L/tmp/local/lib -lgroonga -lruby1.8-static -lgroonga -lpthread -lrt -ldl -lcrypt -lm -lc"
63
+ "cc -o conftest -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -Wall -I/tmp/local/include/groonga conftest.c -L. -L/usr/lib -L. -rdynamic -Wl,-export-dynamic -L/tmp/local/lib -lgroonga -lruby1.8-static -lgroonga -lpthread -lrt -ldl -lcrypt -lm -lc"
64
64
  conftest.c: In function ‘t’:
65
65
  conftest.c:5: warning: implicit declaration of function ‘rb_errinfo’
66
- /tmp/cc9zPpDk.o: In function `t':
66
+ /tmp/ccRn7Jyd.o: In function `t':
67
67
  /home/kou/work/ruby/rroonga.18/ext/groonga/conftest.c:5: undefined reference to `rb_errinfo'
68
68
  collect2: ld returned 1 exit status
69
69
  checked program was:
@@ -79,7 +79,7 @@ checked program was:
79
79
 
80
80
  have_type: checking for enum ruby_value_type in ruby.h... -------------------- no
81
81
 
82
- "gcc -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -I/tmp/local/include/groonga -Wall -c conftest.c"
82
+ "cc -I. -I/usr/lib/ruby/1.8/x86_64-linux -I/home/kou/work/ruby/rroonga.18/ext/groonga -fno-strict-aliasing -g -g -O2 -fPIC -Wall -I/tmp/local/include/groonga -c conftest.c"
83
83
  conftest.c:5: error: invalid application of ‘sizeof’ to incomplete type ‘conftest_type’
84
84
  conftest.c:5: error: size of array ‘conftestval’ is negative
85
85
  checked program was:
@@ -552,6 +552,68 @@ rb_grn_column_is_locked (int argc, VALUE *argv, VALUE self)
552
552
  return CBOOL2RVAL(grn_obj_is_locked(context, column));
553
553
  }
554
554
 
555
+ /*
556
+ * Document-method: reference_column?
557
+ *
558
+ * call-seq:
559
+ * column.reference_column? -> true/false
560
+ *
561
+ * _column_の値がテーブルのレコードとなる場合は+true+を返し、
562
+ * そうでない場合は+false+を返す。
563
+ */
564
+ static VALUE
565
+ rb_grn_column_reference_column_p (VALUE self)
566
+ {
567
+ grn_ctx *context;
568
+ grn_obj *column;
569
+ grn_id range_id;
570
+ grn_obj *range;
571
+ unsigned short int type;
572
+
573
+ rb_grn_column_deconstruct(SELF(self), &column, &context,
574
+ NULL, NULL,
575
+ NULL, NULL, NULL);
576
+
577
+ range_id = grn_obj_get_range(context, column);
578
+ range = grn_ctx_at(context, range_id);
579
+ type = range->header.type;
580
+ grn_obj_unlink(context, range);
581
+ switch (type) {
582
+ case GRN_TABLE_HASH_KEY:
583
+ case GRN_TABLE_PAT_KEY:
584
+ case GRN_TABLE_NO_KEY:
585
+ return Qtrue;
586
+ default:
587
+ return Qfalse;
588
+ }
589
+ }
590
+
591
+ /*
592
+ * Document-method: index_column?
593
+ *
594
+ * call-seq:
595
+ * column.index_column? -> true/false
596
+ *
597
+ * _column_がGroonga::IndexColumnの場合は+true+を返し、
598
+ * そうでない場合は+false+を返す。
599
+ */
600
+ static VALUE
601
+ rb_grn_column_index_column_p (VALUE self)
602
+ {
603
+ grn_ctx *context;
604
+ grn_obj *column;
605
+
606
+ rb_grn_column_deconstruct(SELF(self), &column, &context,
607
+ NULL, NULL,
608
+ NULL, NULL, NULL);
609
+
610
+ if (column->header.type == GRN_COLUMN_INDEX) {
611
+ return Qtrue;
612
+ } else {
613
+ return Qfalse;
614
+ }
615
+ }
616
+
555
617
  void
556
618
  rb_grn_init_column (VALUE mGrn)
557
619
  {
@@ -566,6 +628,10 @@ rb_grn_init_column (VALUE mGrn)
566
628
  rb_define_method(rb_cGrnColumn, "unlock", rb_grn_column_unlock, -1);
567
629
  rb_define_method(rb_cGrnColumn, "clear_lock", rb_grn_column_clear_lock, -1);
568
630
  rb_define_method(rb_cGrnColumn, "locked?", rb_grn_column_is_locked, -1);
631
+ rb_define_method(rb_cGrnColumn, "reference_column?",
632
+ rb_grn_column_reference_column_p, 0);
633
+ rb_define_method(rb_cGrnColumn, "index_column?",
634
+ rb_grn_column_index_column_p, 0);
569
635
 
570
636
  rb_grn_init_fix_size_column(mGrn);
571
637
  rb_grn_init_variable_size_column(mGrn);
@@ -56,19 +56,27 @@ rb_grn_context_from_ruby_object (VALUE object)
56
56
  return rb_grn_context->context;
57
57
  }
58
58
 
59
- void
60
- rb_grn_context_fin (grn_ctx *context)
59
+ static void
60
+ rb_grn_context_unlink_database (grn_ctx *context)
61
61
  {
62
62
  grn_obj *database;
63
63
 
64
- if (context->stat == GRN_CTX_FIN)
65
- return;
66
-
67
64
  database = grn_ctx_db(context);
68
65
  debug("context:database: %p:%p\n", context, database);
69
66
  if (database && database->header.type == GRN_DB) {
67
+ debug("context:database: %p:%p: unlink\n", context, database);
70
68
  grn_obj_unlink(context, database);
71
69
  }
70
+ debug("context:database: %p:%p: done\n", context, database);
71
+ }
72
+
73
+ void
74
+ rb_grn_context_fin (grn_ctx *context)
75
+ {
76
+ if (context->stat == GRN_CTX_FIN)
77
+ return;
78
+
79
+ rb_grn_context_unlink_database(context);
72
80
  grn_ctx_fin(context);
73
81
  }
74
82
 
@@ -92,6 +100,33 @@ rb_grn_context_alloc (VALUE klass)
92
100
  return Data_Wrap_Struct(klass, NULL, rb_grn_context_free, NULL);
93
101
  }
94
102
 
103
+ static grn_obj *
104
+ rb_grn_context_finalizer (grn_ctx *context, int n_args, grn_obj **grn_objects,
105
+ grn_user_data *user_data)
106
+ {
107
+ RbGrnContext *rb_grn_context;
108
+
109
+ if (rb_grn_exited)
110
+ return NULL;
111
+
112
+ rb_grn_context = user_data->ptr;
113
+
114
+ GRN_CTX_USER_DATA(context)->ptr = NULL;
115
+ grn_ctx_set_finalizer(context, NULL);
116
+
117
+ debug("context-finalize: %p:%p:%p\n",
118
+ context, rb_grn_context, rb_grn_context->context);
119
+
120
+ rb_grn_context->context = NULL;
121
+
122
+ rb_grn_context_unlink_database(context);
123
+
124
+ debug("context-finalize: %p:%p:%p: done\n",
125
+ context, rb_grn_context, rb_grn_context->context);
126
+
127
+ return NULL;
128
+ }
129
+
95
130
  VALUE
96
131
  rb_grn_context_to_exception (grn_ctx *context, VALUE related_object)
97
132
  {
@@ -301,6 +336,7 @@ rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
301
336
  rb_grn_context_check(context, self);
302
337
 
303
338
  GRN_CTX_USER_DATA(context)->ptr = rb_grn_context;
339
+ grn_ctx_set_finalizer(context, rb_grn_context_finalizer);
304
340
 
305
341
  if (!NIL_P(rb_encoding)) {
306
342
  grn_encoding encoding;
@@ -380,6 +416,52 @@ rb_grn_context_set_encoding (VALUE self, VALUE rb_encoding)
380
416
  return rb_encoding;
381
417
  }
382
418
 
419
+ /*
420
+ * call-seq:
421
+ * context.support_zlib?
422
+ *
423
+ * groongaがZlibサポート付きでビルドされていれば+true+、そう
424
+ * でなければ+false+を返す。
425
+ */
426
+ static VALUE
427
+ rb_grn_context_support_zlib_p (VALUE self)
428
+ {
429
+ VALUE rb_support_p;
430
+ grn_ctx *context;
431
+ grn_obj support_p;
432
+
433
+ context = SELF(self);
434
+ GRN_BOOL_INIT(&support_p, 0);
435
+ grn_obj_get_info(context, NULL, GRN_INFO_SUPPORT_ZLIB, &support_p);
436
+ rb_support_p = CBOOL2RVAL(GRN_BOOL_VALUE(&support_p));
437
+ GRN_OBJ_FIN(context, &support_p);
438
+
439
+ return rb_support_p;
440
+ }
441
+
442
+ /*
443
+ * call-seq:
444
+ * context.support_lzo?
445
+ *
446
+ * groongaがLZOサポート付きでビルドされていれば+true+、そう
447
+ * でなければ+false+を返す。
448
+ */
449
+ static VALUE
450
+ rb_grn_context_support_lzo_p (VALUE self)
451
+ {
452
+ VALUE rb_support_p;
453
+ grn_ctx *context;
454
+ grn_obj support_p;
455
+
456
+ context = SELF(self);
457
+ GRN_BOOL_INIT(&support_p, 0);
458
+ grn_obj_get_info(context, NULL, GRN_INFO_SUPPORT_LZO, &support_p);
459
+ rb_support_p = CBOOL2RVAL(GRN_BOOL_VALUE(&support_p));
460
+ GRN_OBJ_FIN(context, &support_p);
461
+
462
+ return rb_support_p;
463
+ }
464
+
383
465
  /*
384
466
  * call-seq:
385
467
  * context.database -> Groonga::Database
@@ -639,6 +721,11 @@ rb_grn_init_context (VALUE mGrn)
639
721
  rb_define_method(cGrnContext, "encoding", rb_grn_context_get_encoding, 0);
640
722
  rb_define_method(cGrnContext, "encoding=", rb_grn_context_set_encoding, 1);
641
723
 
724
+ rb_define_method(cGrnContext, "support_zlib?",
725
+ rb_grn_context_support_zlib_p, 0);
726
+ rb_define_method(cGrnContext, "support_lzo?",
727
+ rb_grn_context_support_lzo_p, 0);
728
+
642
729
  rb_define_method(cGrnContext, "database", rb_grn_context_get_database, 0);
643
730
 
644
731
  rb_define_method(cGrnContext, "[]", rb_grn_context_array_reference, 1);
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby" -*- */
2
2
  /*
3
- Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
4
4
 
5
5
  This library is free software; you can redistribute it and/or
6
6
  modify it under the terms of the GNU Lesser General Public
@@ -441,6 +441,27 @@ rb_grn_database_is_locked (VALUE self)
441
441
  return CBOOL2RVAL(grn_obj_is_locked(context, database));
442
442
  }
443
443
 
444
+ /*
445
+ * Document-method: touch
446
+ *
447
+ * call-seq:
448
+ * database.touch
449
+ *
450
+ * _database_の最終更新時刻を現在時刻にする。
451
+ */
452
+ static VALUE
453
+ rb_grn_database_touch (VALUE self)
454
+ {
455
+ grn_ctx *context;
456
+ grn_obj *database;
457
+
458
+ rb_grn_database_deconstruct(SELF(self), &database, &context,
459
+ NULL, NULL, NULL, NULL);
460
+
461
+ grn_db_touch(context, database);
462
+ return Qnil;
463
+ }
464
+
444
465
  void
445
466
  rb_grn_init_database (VALUE mGrn)
446
467
  {
@@ -469,4 +490,6 @@ rb_grn_init_database (VALUE mGrn)
469
490
  rb_define_method(rb_cGrnDatabase, "clear_lock",
470
491
  rb_grn_database_clear_lock, 0);
471
492
  rb_define_method(rb_cGrnDatabase, "locked?", rb_grn_database_is_locked, 0);
493
+
494
+ rb_define_method(rb_cGrnDatabase, "touch", rb_grn_database_touch, 0);
472
495
  }
@@ -93,6 +93,7 @@ static VALUE eGrnTooSmallOffset;
93
93
  static VALUE eGrnTooLargeOffset;
94
94
  static VALUE eGrnTooSmallLimit;
95
95
  static VALUE eGrnCASError;
96
+ static VALUE eGrnUnsupportedCommandVersion;
96
97
 
97
98
  VALUE
98
99
  rb_grn_rc_to_exception (grn_rc rc)
@@ -316,6 +317,9 @@ rb_grn_rc_to_exception (grn_rc rc)
316
317
  case GRN_CAS_ERROR:
317
318
  exception = eGrnCASError;
318
319
  break;
320
+ case GRN_UNSUPPORTED_COMMAND_VERSION:
321
+ exception = eGrnUnsupportedCommandVersion;
322
+ break;
319
323
  }
320
324
 
321
325
  if (NIL_P(exception))
@@ -546,6 +550,9 @@ rb_grn_rc_to_message (grn_rc rc)
546
550
  case GRN_CAS_ERROR:
547
551
  message = "CAS error";
548
552
  break;
553
+ case GRN_UNSUPPORTED_COMMAND_VERSION:
554
+ message = "unsupported command version";
555
+ break;
549
556
  }
550
557
 
551
558
  if (!message)
@@ -1166,4 +1173,12 @@ rb_grn_init_exception (VALUE mGrn)
1166
1173
  * CAS(Compare and Swap)が失敗したときに発生する。
1167
1174
  */
1168
1175
  eGrnCASError = rb_define_class_under(mGrn, "CASError", rb_eGrnError);
1176
+
1177
+ /*
1178
+ * Document-class: Groonga::UnsupportedCommandVersion
1179
+ *
1180
+ * 未サポートのコマンドバージョンを指定したときに発生する。
1181
+ */
1182
+ eGrnUnsupportedCommandVersion =
1183
+ rb_define_class_under(mGrn, "UnsupportedCommandVersion", rb_eGrnError);
1169
1184
  }
@@ -81,7 +81,7 @@ VALUE rb_cGrnHash;
81
81
  * ともでき、その場合は自動的にGroonga::Recordからレコード
82
82
  * IDを取得する。
83
83
  *
84
- * 省略した場合は文字列をキーとして使用する。この場合、
84
+ * 省略した場合はShortText型をキーとして使用する。この場合、
85
85
  * 4096バイトまで使用可能である。
86
86
  *
87
87
  * [+:value_type+]
@@ -192,7 +192,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE klass)
192
192
  flags |= GRN_OBJ_KEY_NORMALIZE;
193
193
 
194
194
  if (NIL_P(rb_key_type)) {
195
- flags |= GRN_OBJ_KEY_VAR_SIZE;
195
+ key_type = grn_ctx_at(context, GRN_DB_SHORT_TEXT);
196
196
  } else {
197
197
  key_type = RVAL2GRNOBJECT(rb_key_type, &context);
198
198
  }
@@ -267,7 +267,8 @@ rb_grn_index_column_get_sources (VALUE self)
267
267
  }
268
268
 
269
269
  static grn_id
270
- resolve_source_id (grn_ctx *context, grn_obj *column, VALUE rb_source)
270
+ resolve_source_id (grn_ctx *context, grn_obj *column, grn_id range_id,
271
+ VALUE rb_source)
271
272
  {
272
273
  grn_id source_id;
273
274
 
@@ -316,7 +317,7 @@ resolve_source_id (grn_ctx *context, grn_obj *column, VALUE rb_source)
316
317
  rb_raise(rb_eArgError,
317
318
  "source accessor must be '_key': <%s>", name);
318
319
  }
319
- source_id = grn_obj_id(context, column);
320
+ source_id = range_id;
320
321
  } else {
321
322
  source_id = grn_obj_id(context, source);
322
323
  }
@@ -339,19 +340,22 @@ rb_grn_index_column_set_sources (VALUE self, VALUE rb_sources)
339
340
  grn_obj *column;
340
341
  int i, n;
341
342
  VALUE *rb_source_values;
343
+ grn_id range_id;
342
344
  grn_id *sources;
343
345
  grn_rc rc;
344
346
 
345
347
  rb_grn_index_column_deconstruct(SELF(self), &column, &context,
346
348
  NULL, NULL,
347
- NULL, NULL, NULL, NULL,
349
+ NULL, NULL,
350
+ &range_id, NULL,
348
351
  NULL, NULL);
349
352
 
350
353
  n = RARRAY_LEN(rb_sources);
351
354
  rb_source_values = RARRAY_PTR(rb_sources);
352
355
  sources = ALLOCA_N(grn_id, n);
353
356
  for (i = 0; i < n; i++) {
354
- sources[i] = resolve_source_id(context, column, rb_source_values[i]);
357
+ sources[i] = resolve_source_id(context, column, range_id,
358
+ rb_source_values[i]);
355
359
  }
356
360
 
357
361
  {
@@ -19,7 +19,7 @@
19
19
  /*
20
20
  * Document-class: Groonga::Object
21
21
  *
22
- * Ruby/groongaが提供するクラスのベースとなるクラス。
22
+ * rroongaが提供するクラスのベースとなるクラス。
23
23
  * Groonga::ContextとGroonga::Logger以外はGroonga::Objectを継
24
24
  * 承している。
25
25
  */
@@ -829,7 +829,9 @@ rb_grn_object_inspect_content (VALUE self, VALUE inspected)
829
829
  object = rb_grn_object->object;
830
830
 
831
831
  rb_str_cat2(inspected, " ");
832
- if (object) {
832
+ if (rb_grn_exited) {
833
+ rb_str_cat2(inspected, "(finished)");
834
+ } else if (object) {
833
835
  rb_grn_object_inspect_object_content(inspected, context, object);
834
836
  } else {
835
837
  rb_str_cat2(inspected, "(closed)");
@@ -90,7 +90,7 @@ VALUE rb_cGrnPatriciaTrie;
90
90
  * ともでき、その場合は自動的にGroonga::Recordからレコード
91
91
  * IDを取得する。
92
92
  *
93
- * 省略した場合は文字列をキーとして使用する。この場合、
93
+ * 省略した場合はShortText型をキーとして使用する。この場合、
94
94
  * 4096バイトまで使用可能である。
95
95
  *
96
96
  * [+:value_type+]
@@ -206,7 +206,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE klass)
206
206
  flags |= GRN_OBJ_KEY_WITH_SIS;
207
207
 
208
208
  if (NIL_P(rb_key_type)) {
209
- flags |= GRN_OBJ_KEY_VAR_SIZE;
209
+ key_type = grn_ctx_at(context, GRN_DB_SHORT_TEXT);
210
210
  } else {
211
211
  key_type = RVAL2GRNOBJECT(rb_key_type, &context);
212
212
  }
@@ -302,6 +302,7 @@ rb_grn_snippet_execute (VALUE self, VALUE rb_string)
302
302
 
303
303
  rc = grn_snip_exec(context, snippet, string, string_length,
304
304
  &n_results, &max_tagged_length);
305
+ rb_grn_context_check(context, self);
305
306
  rb_grn_rc_check(rc, self);
306
307
 
307
308
  rb_results = rb_ary_new2(n_results);
@@ -457,23 +457,6 @@ rb_grn_table_key_support_get_column_value (int argc, VALUE *argv, VALUE self)
457
457
  return rb_grn_table_get_column_value_raw(self, id, rb_name);
458
458
  }
459
459
 
460
- /*
461
- * call-seq:
462
- * table.find(key) -> Groonga::Record
463
- *
464
- * テーブルの_key_に対応するレコードを返す。
465
- *
466
- * 0.9.0から非推奨。代わりにtable[key]を使うこと。
467
- */
468
- static VALUE
469
- rb_grn_table_key_support_find (VALUE self, VALUE rb_key)
470
- {
471
- rb_warn("#find is deprecated. Use #[] instead: %s",
472
- rb_grn_inspect(self));
473
-
474
- return rb_grn_table_key_support_array_reference(self, rb_key);
475
- }
476
-
477
460
  static VALUE
478
461
  rb_grn_table_key_support_get_value_by_key (VALUE self, VALUE rb_key)
479
462
  {
@@ -691,6 +674,25 @@ rb_grn_table_key_support_normalize_key_p (VALUE self)
691
674
  return CBOOL2RVAL(table->header.flags & GRN_OBJ_KEY_NORMALIZE);
692
675
  }
693
676
 
677
+ /*
678
+ * call-seq:
679
+ * table.support_key? -> true/false
680
+ *
681
+ * テーブルでキーを使えるなら+true+、使えないなら+false+を返
682
+ * す。キーを使えないテーブルはGroonga::Arrayだけ。
683
+ */
684
+ static VALUE
685
+ rb_grn_table_key_support_support_key_p (VALUE self)
686
+ {
687
+ grn_obj *table;
688
+
689
+ rb_grn_table_key_support_deconstruct(SELF(self), &table, NULL,
690
+ NULL, NULL, NULL,
691
+ NULL, NULL, NULL,
692
+ NULL);
693
+ return table->header.domain == GRN_ID_NIL ? Qfalse : Qtrue;
694
+ }
695
+
694
696
  void
695
697
  rb_grn_init_table_key_support (VALUE mGrn)
696
698
  {
@@ -709,8 +711,6 @@ rb_grn_init_table_key_support (VALUE mGrn)
709
711
  rb_define_method(rb_mGrnTableKeySupport, "delete",
710
712
  rb_grn_table_key_support_delete, 1);
711
713
 
712
- rb_define_method(rb_mGrnTableKeySupport, "find",
713
- rb_grn_table_key_support_find, 1);
714
714
  rb_define_method(rb_mGrnTableKeySupport, "[]",
715
715
  rb_grn_table_key_support_array_reference, 1);
716
716
  rb_define_method(rb_mGrnTableKeySupport, "[]=",
@@ -733,4 +733,7 @@ rb_grn_init_table_key_support (VALUE mGrn)
733
733
 
734
734
  rb_define_method(rb_mGrnTableKeySupport, "normalize_key?",
735
735
  rb_grn_table_key_support_normalize_key_p, 0);
736
+
737
+ rb_define_method(rb_mGrnTableKeySupport, "support_key?",
738
+ rb_grn_table_key_support_support_key_p, 0);
736
739
  }
@@ -75,6 +75,7 @@ rb_grn_table_bind (RbGrnTable *rb_grn_table,
75
75
  rb_grn_object = RB_GRN_OBJECT(rb_grn_table);
76
76
  rb_grn_table->value = grn_obj_open(context, GRN_BULK, 0,
77
77
  rb_grn_object->range_id);
78
+ rb_grn_table->columns = Qnil;
78
79
  rb_grn_table->columns = rb_ary_new();
79
80
  }
80
81
 
@@ -202,7 +203,7 @@ rb_grn_table_inspect_content (VALUE self, VALUE inspected)
202
203
 
203
204
  /*
204
205
  * call-seq:
205
- * _table_.inspect -> String
206
+ * table.inspect -> String
206
207
  *
207
208
  * テーブルの中身を人に見やすい文字列で返す。
208
209
  */
@@ -428,8 +429,14 @@ rb_grn_table_define_index_column (int argc, VALUE *argv, VALUE self)
428
429
  flags |= GRN_OBJ_PERSISTENT;
429
430
  }
430
431
 
431
- if (RVAL2CBOOL(rb_with_section))
432
+ if (NIL_P(rb_with_section)) {
433
+ if (TYPE(rb_sources) == T_ARRAY && RARRAY_LEN(rb_sources) > 1) {
434
+ flags |= GRN_OBJ_WITH_SECTION;
435
+ }
436
+ } else if (RVAL2CBOOL(rb_with_section)) {
432
437
  flags |= GRN_OBJ_WITH_SECTION;
438
+ }
439
+
433
440
 
434
441
  if (RVAL2CBOOL(rb_with_weight))
435
442
  flags |= GRN_OBJ_WITH_WEIGHT;
@@ -734,6 +741,11 @@ rb_grn_table_open_grn_cursor (int argc, VALUE *argv, VALUE self,
734
741
  rb_grn_inspect(rb_order));
735
742
  }
736
743
  if (NIL_P(rb_order_by)) {
744
+ if (table->header.type == GRN_TABLE_PAT_KEY) {
745
+ flags |= GRN_CURSOR_BY_KEY;
746
+ } else {
747
+ flags |= GRN_CURSOR_BY_ID;
748
+ }
737
749
  } else if (rb_grn_equal_option(rb_order_by, "id")) {
738
750
  flags |= GRN_CURSOR_BY_ID;
739
751
  } else if (rb_grn_equal_option(rb_order_by, "key")) {
@@ -798,10 +810,12 @@ rb_grn_table_open_grn_cursor (int argc, VALUE *argv, VALUE self,
798
810
  * 取り出す。
799
811
  *
800
812
  * [+:order_by+]
801
- * +:id+を指定するとID順にレコードを取り出す。(デフォルト)
813
+ * +:id+を指定するとID順にレコードを取り出す。(Arrayと
814
+ * Hashのデフォルト)
802
815
  *
803
816
  * +:key+指定するとキー順にレコードを取り出す。ただし、
804
- * Groonga::PatriciaTrieにしか使えない。
817
+ * Groonga::PatriciaTrieにしか使えない。(PatriciaTrieのデ
818
+ * フォルト)
805
819
  *
806
820
  * [+:greater_than+]
807
821
  * +true+を指定すると+:min+で指定した値に一致した[+key+]を
@@ -1234,7 +1248,11 @@ rb_grn_table_group (int argc, VALUE *argv, VALUE self)
1234
1248
  VALUE
1235
1249
  rb_grn_table_array_reference (VALUE self, VALUE rb_id)
1236
1250
  {
1237
- return rb_grn_record_new_raw(self, rb_id, Qnil);
1251
+ if (FIXNUM_P(rb_id)) {
1252
+ return rb_grn_record_new_raw(self, rb_id, Qnil);
1253
+ } else {
1254
+ return Qnil;
1255
+ }
1238
1256
  }
1239
1257
 
1240
1258
  VALUE
@@ -1935,6 +1953,19 @@ rb_grn_table_merge_bang (VALUE self, VALUE rb_other)
1935
1953
  return rb_grn_table_set_operation_bang(self, rb_other, GRN_OP_ADJUST);
1936
1954
  }
1937
1955
 
1956
+ /*
1957
+ * call-seq:
1958
+ * table.support_key? -> true/false
1959
+ *
1960
+ * _table_に主キーが設定されていれば+true+、されていなければ
1961
+ * +false+を返す。
1962
+ */
1963
+ static VALUE
1964
+ rb_grn_table_support_key_p (VALUE self)
1965
+ {
1966
+ return Qfalse;
1967
+ }
1968
+
1938
1969
  /*
1939
1970
  * call-seq:
1940
1971
  * table.support_sub_records? -> true/false
@@ -1955,6 +1986,29 @@ rb_grn_table_support_sub_records_p (VALUE self)
1955
1986
  return CBOOL2RVAL(table->header.flags & GRN_OBJ_WITH_SUBREC);
1956
1987
  }
1957
1988
 
1989
+ /*
1990
+ * call-seq:
1991
+ * table.exist?(id) -> true/false
1992
+ *
1993
+ * _table_に_id_で指定したIDのレコードが存在する場合は+true+、
1994
+ * 存在しない場合は+false+を返す。
1995
+ *
1996
+ * 注意: 実行には相応のコストがかかるのであまり頻繁に呼ばな
1997
+ * いようにして下さい。
1998
+ */
1999
+ static VALUE
2000
+ rb_grn_table_exist_p (VALUE self, VALUE id)
2001
+ {
2002
+ grn_ctx *context;
2003
+ grn_obj *table;
2004
+
2005
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
2006
+ NULL, NULL,
2007
+ NULL, NULL, NULL,
2008
+ NULL);
2009
+ return CBOOL2RVAL(grn_table_at(context, table, NUM2UINT(id)));
2010
+ }
2011
+
1958
2012
  void
1959
2013
  rb_grn_init_table (VALUE mGrn)
1960
2014
  {
@@ -2022,9 +2076,13 @@ rb_grn_init_table (VALUE mGrn)
2022
2076
  rb_define_method(rb_cGrnTable, "merge!",
2023
2077
  rb_grn_table_merge_bang, 1);
2024
2078
 
2079
+ rb_define_method(rb_cGrnTable, "support_key?",
2080
+ rb_grn_table_support_key_p, 0);
2025
2081
  rb_define_method(rb_cGrnTable, "support_sub_records?",
2026
2082
  rb_grn_table_support_sub_records_p, 0);
2027
2083
 
2084
+ rb_define_method(rb_cGrnTable, "exist?", rb_grn_table_exist_p, 1);
2085
+
2028
2086
  rb_grn_init_table_key_support(mGrn);
2029
2087
  rb_grn_init_array(mGrn);
2030
2088
  rb_grn_init_hash(mGrn);
data/ext/groonga/rb-grn.h CHANGED
@@ -69,7 +69,7 @@ RB_GRN_BEGIN_DECLS
69
69
 
70
70
  #define RB_GRN_MAJOR_VERSION 1
71
71
  #define RB_GRN_MINOR_VERSION 0
72
- #define RB_GRN_MICRO_VERSION 1
72
+ #define RB_GRN_MICRO_VERSION 2
73
73
 
74
74
  typedef int rb_grn_boolean;
75
75
  #define RB_GRN_FALSE (0)
@@ -26,6 +26,7 @@ finish_groonga (VALUE data)
26
26
  debug("finish\n");
27
27
  grn_fin();
28
28
  rb_grn_exited = RB_GRN_TRUE;
29
+ debug("finish: done\n");
29
30
  }
30
31
 
31
32
  static void