rroonga 1.3.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/Gemfile +1 -1
  2. data/Rakefile +2 -7
  3. data/bug.rb +36 -0
  4. data/crash.rb +17 -0
  5. data/ext/groonga/Makefile +260 -0
  6. data/ext/groonga/groonga.so +0 -0
  7. data/ext/groonga/rb-grn-accessor.o +0 -0
  8. data/ext/groonga/rb-grn-array-cursor.o +0 -0
  9. data/ext/groonga/rb-grn-array.o +0 -0
  10. data/ext/groonga/rb-grn-column.c +34 -37
  11. data/ext/groonga/rb-grn-column.o +0 -0
  12. data/ext/groonga/rb-grn-context.c +63 -2
  13. data/ext/groonga/rb-grn-context.o +0 -0
  14. data/ext/groonga/rb-grn-database.o +0 -0
  15. data/ext/groonga/rb-grn-double-array-trie-cursor.o +0 -0
  16. data/ext/groonga/rb-grn-double-array-trie.o +0 -0
  17. data/ext/groonga/rb-grn-encoding-support.o +0 -0
  18. data/ext/groonga/rb-grn-encoding.o +0 -0
  19. data/ext/groonga/rb-grn-exception.o +0 -0
  20. data/ext/groonga/rb-grn-expression-builder.o +0 -0
  21. data/ext/groonga/rb-grn-expression.c +21 -13
  22. data/ext/groonga/rb-grn-expression.o +0 -0
  23. data/ext/groonga/rb-grn-fix-size-column.o +0 -0
  24. data/ext/groonga/rb-grn-hash-cursor.o +0 -0
  25. data/ext/groonga/rb-grn-hash.o +0 -0
  26. data/ext/groonga/rb-grn-index-column.o +0 -0
  27. data/ext/groonga/rb-grn-index-cursor.o +0 -0
  28. data/ext/groonga/rb-grn-logger.o +0 -0
  29. data/ext/groonga/rb-grn-object.c +2 -0
  30. data/ext/groonga/rb-grn-object.o +0 -0
  31. data/ext/groonga/rb-grn-operator.o +0 -0
  32. data/ext/groonga/rb-grn-patricia-trie-cursor.o +0 -0
  33. data/ext/groonga/rb-grn-patricia-trie.o +0 -0
  34. data/ext/groonga/rb-grn-plugin.o +0 -0
  35. data/ext/groonga/rb-grn-posting.o +0 -0
  36. data/ext/groonga/rb-grn-procedure.o +0 -0
  37. data/ext/groonga/rb-grn-record.o +0 -0
  38. data/ext/groonga/rb-grn-snippet.o +0 -0
  39. data/ext/groonga/rb-grn-table-cursor-key-support.o +0 -0
  40. data/ext/groonga/rb-grn-table-cursor.o +0 -0
  41. data/ext/groonga/rb-grn-table-key-support.o +0 -0
  42. data/ext/groonga/rb-grn-table.c +57 -51
  43. data/ext/groonga/rb-grn-table.o +0 -0
  44. data/ext/groonga/rb-grn-type.o +0 -0
  45. data/ext/groonga/rb-grn-utils.o +0 -0
  46. data/ext/groonga/rb-grn-variable-size-column.o +0 -0
  47. data/ext/groonga/rb-grn-variable.o +0 -0
  48. data/ext/groonga/rb-grn-view-accessor.o +0 -0
  49. data/ext/groonga/rb-grn-view-cursor.o +0 -0
  50. data/ext/groonga/rb-grn-view-record.o +0 -0
  51. data/ext/groonga/rb-grn-view.o +0 -0
  52. data/ext/groonga/rb-grn.h +10 -4
  53. data/ext/groonga/rb-groonga.o +0 -0
  54. data/lib/groonga.rb +9 -6
  55. data/lib/groonga/schema.rb +75 -46
  56. data/rroonga-build.rb +2 -2
  57. data/test/run-test.rb +1 -2
  58. data/test/test-table-select.rb +0 -5
  59. data/test/test-type.rb +2 -2
  60. data/test/test-version.rb +40 -10
  61. metadata +198 -191
Binary file
@@ -1,6 +1,6 @@
1
1
  /* -*- coding: utf-8; c-file-style: "ruby" -*- */
2
2
  /*
3
- Copyright (C) 2010-2011 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2010-2012 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
@@ -59,6 +59,61 @@ rb_grn_context_from_ruby_object (VALUE object)
59
59
  return rb_grn_context->context;
60
60
  }
61
61
 
62
+ void
63
+ rb_grn_context_register_floating_object (RbGrnObject *rb_grn_object)
64
+ {
65
+ RbGrnContext *rb_grn_context;
66
+ grn_ctx *context;
67
+ grn_hash *floating_objects;
68
+
69
+ Data_Get_Struct(rb_grn_object->rb_context, RbGrnContext, rb_grn_context);
70
+ context = rb_grn_context->context;
71
+ floating_objects = rb_grn_context->floating_objects;
72
+ grn_hash_add(context, floating_objects,
73
+ (const void *)(&rb_grn_object), sizeof(RbGrnObject *),
74
+ NULL, NULL);
75
+ rb_grn_object->floating = GRN_TRUE;
76
+ }
77
+
78
+ void
79
+ rb_grn_context_unregister_floating_object (RbGrnObject *rb_grn_object)
80
+ {
81
+ RbGrnContext *rb_grn_context;
82
+ grn_ctx *context;
83
+ grn_hash *floating_objects;
84
+
85
+ if (!rb_grn_object->floating)
86
+ return;
87
+
88
+ Data_Get_Struct(rb_grn_object->rb_context, RbGrnContext, rb_grn_context);
89
+ context = rb_grn_context->context;
90
+ floating_objects = rb_grn_context->floating_objects;
91
+ grn_hash_delete(context, floating_objects,
92
+ (const void *)&rb_grn_object, sizeof(RbGrnObject *),
93
+ NULL);
94
+ rb_grn_object->floating = GRN_FALSE;
95
+ }
96
+
97
+ static void
98
+ rb_grn_context_close_floating_objects (RbGrnContext *rb_grn_context)
99
+ {
100
+ grn_ctx *context;
101
+ grn_hash *floating_objects;
102
+ RbGrnObject **floating_object = NULL;
103
+
104
+ context = rb_grn_context->context;
105
+ floating_objects = rb_grn_context->floating_objects;
106
+ if (!floating_objects)
107
+ return;
108
+
109
+ rb_grn_context->floating_objects = NULL;
110
+ GRN_HASH_EACH(context, floating_objects, id, &floating_object, NULL, NULL, {
111
+ (*floating_object)->floating = GRN_FALSE;
112
+ grn_obj_close(context, RB_GRN_OBJECT(*floating_object)->object);
113
+ });
114
+ grn_hash_close(context, floating_objects);
115
+ }
116
+
62
117
  static void
63
118
  rb_grn_context_unlink_database (grn_ctx *context)
64
119
  {
@@ -73,7 +128,7 @@ rb_grn_context_unlink_database (grn_ctx *context)
73
128
  debug("context:database: %p:%p: done\n", context, database);
74
129
  }
75
130
 
76
- void
131
+ static void
77
132
  rb_grn_context_fin (grn_ctx *context)
78
133
  {
79
134
  if (context->stat == GRN_CTX_FIN)
@@ -93,6 +148,7 @@ rb_grn_context_free (void *pointer)
93
148
 
94
149
  context = rb_grn_context->context;
95
150
  debug("context-free: %p\n", context);
151
+ rb_grn_context_close_floating_objects(rb_grn_context);
96
152
  if (context && !rb_grn_exited)
97
153
  rb_grn_context_fin(context);
98
154
  debug("context-free: %p: done\n", context);
@@ -116,6 +172,7 @@ rb_grn_context_finalizer (grn_ctx *context, int n_args, grn_obj **grn_objects,
116
172
 
117
173
  rb_grn_context = user_data->ptr;
118
174
 
175
+ rb_grn_context_close_floating_objects(rb_grn_context);
119
176
  if (!(context->flags & GRN_CTX_PER_DB)) {
120
177
  rb_grn_context_unlink_database(context);
121
178
  }
@@ -364,6 +421,10 @@ rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
364
421
  rb_grn_context_check(context, self);
365
422
 
366
423
  GRN_CTX_USER_DATA(context)->ptr = rb_grn_context;
424
+ rb_grn_context->floating_objects = grn_hash_create(context, NULL,
425
+ sizeof(RbGrnObject *),
426
+ 0,
427
+ GRN_OBJ_TABLE_HASH_KEY);
367
428
  grn_ctx_set_finalizer(context, rb_grn_context_finalizer);
368
429
 
369
430
  if (!NIL_P(rb_encoding)) {
Binary file
Binary file
Binary file
Binary file
@@ -1,6 +1,6 @@
1
1
  /* -*- coding: utf-8; c-file-style: "ruby" -*- */
2
2
  /*
3
- Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2012 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
@@ -36,6 +36,8 @@ rb_grn_expression_finalizer (grn_ctx *context, grn_obj *object,
36
36
  if (context && rb_grn_expression->value)
37
37
  grn_obj_unlink(context, rb_grn_expression->value);
38
38
 
39
+ rb_grn_context_unregister_floating_object(RB_GRN_OBJECT(rb_grn_expression));
40
+
39
41
  rb_grn_expression->value = NULL;
40
42
  }
41
43
 
@@ -95,8 +97,9 @@ rb_grn_expression_initialize (int argc, VALUE *argv, VALUE self)
95
97
  }
96
98
 
97
99
  expression = grn_expr_create(context, name, name_size);
98
- rb_grn_object_assign(Qnil, self, rb_context, context, expression);
99
100
  rb_grn_context_check(context, self);
101
+ rb_grn_object_assign(Qnil, self, rb_context, context, expression);
102
+ rb_grn_context_register_floating_object(DATA_PTR(self));
100
103
 
101
104
  rb_iv_set(self, "@objects", rb_ary_new());
102
105
 
@@ -581,23 +584,28 @@ rb_grn_expression_inspect (VALUE self)
581
584
  * _expression_ からGroonga::Snippetを生成する。 _tags_ には
582
585
  * キーワードの前後に挿入するタグの配列を以下のような形式で指定
583
586
  * する。
587
+ *
584
588
  * <pre>
585
- * ==[
586
- * ["キーワード前に挿入する文字列1", "キーワード後に挿入する文字列1"],
587
- * ["キーワード前に挿入する文字列2", "キーワード後に挿入する文字列2"],
588
- * ...,
589
- * ]==
589
+ * !!!ruby
590
+ * [
591
+ * ["キーワード前に挿入する文字列1", "キーワード後に挿入する文字列1"],
592
+ * ["キーワード前に挿入する文字列2", "キーワード後に挿入する文字列2"],
593
+ * # ...,
594
+ * ]
590
595
  * </pre>
596
+ *
591
597
  * もし、1つのスニペットの中に _tags_ で指定したタグより多くの
592
598
  * キーワードが含まれている場合は、以下のように、また、先頭
593
599
  * のタグから順番に使われる。
600
+ *
594
601
  * <pre>
595
- * ==expression.parse("Ruby groonga 検索")
596
- * tags = [["<tag1>", "</tag1>"], ["<tag2>", "</tag2>"]]
597
- * snippet = expression.snippet(tags)
598
- * p snippet.execute("Rubyでgroonga使って全文検索、高速検索。")
599
- * => ["<tag1>Ruby</tag1>で<tag2>groonga</tag2>"
600
- * => "使って全文<tag1>検索</tag1>、高速<tag2>検索</tag2>。"]==
602
+ * !!!ruby
603
+ * expression.parse("Ruby groonga 検索")
604
+ * tags = [["<tag1>", "</tag1>"], ["<tag2>", "</tag2>"]]
605
+ * snippet = expression.snippet(tags)
606
+ * p snippet.execute("Rubygroonga使って全文検索、高速検索。")
607
+ * # => ["<tag1>Ruby</tag1>で<tag2>groonga</tag2>"
608
+ * # => "使って全文<tag1>検索</tag1>、高速<tag2>検索</tag2>。"]
601
609
  * </pre>
602
610
  *
603
611
  * _options_ に指定可能な値は以下の通り。
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -320,11 +320,13 @@ rb_grn_object_bind_common (VALUE klass, VALUE self, VALUE rb_context,
320
320
  {
321
321
  grn_user_data *user_data;
322
322
 
323
+ rb_grn_object->rb_context = rb_context;
323
324
  rb_grn_object->context = context;
324
325
  rb_grn_object->object = object;
325
326
  rb_grn_object->self = self;
326
327
  rb_grn_object->need_close = GRN_TRUE;
327
328
  rb_grn_object->have_finalizer = GRN_FALSE;
329
+ rb_grn_object->floating = GRN_FALSE;
328
330
 
329
331
  user_data = grn_obj_user_data(context, object);
330
332
  if (user_data) {
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,6 +1,6 @@
1
1
  /* -*- coding: utf-8; c-file-style: "ruby" -*- */
2
2
  /*
3
- Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2012 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
@@ -991,11 +991,12 @@ rb_grn_table_delete (VALUE self, VALUE rb_id)
991
991
  * - ハッシュの配列で指定する方法 :=
992
992
  * オーソドックスな指定方法。
993
993
  *
994
- * <pre lang="ruby">
994
+ * <pre>
995
+ * !!!ruby
995
996
  * [
996
997
  * {:key => "第1ソートキー", :order => order},
997
998
  * {:key => "第2ソートキー", :order => order},
998
- * ...,
999
+ * # ...,
999
1000
  * ]
1000
1001
  * </pre>
1001
1002
  * =:
@@ -1003,11 +1004,12 @@ rb_grn_table_delete (VALUE self, VALUE rb_id)
1003
1004
  * - 配列の配列で指定する方法 :=
1004
1005
  * 少し簡単化した指定方法。
1005
1006
  *
1006
- * <pre lang="ruby">
1007
+ * <pre>
1008
+ * !!!ruby
1007
1009
  * [
1008
1010
  * ["第1ソートキー", order],
1009
1011
  * ["第2ソートキー", order],
1010
- * ...,
1012
+ * # ...,
1011
1013
  * ]
1012
1014
  * </pre>
1013
1015
  * =:
@@ -1016,8 +1018,9 @@ rb_grn_table_delete (VALUE self, VALUE rb_id)
1016
1018
  * _order_ は常に昇順( +:ascending+ )になるが、最も簡単
1017
1019
  * に指定できる。
1018
1020
  *
1019
- * <pre lang="ruby">
1020
- * ["第1ソートキー", "第2ソートキー", ...]
1021
+ * <pre>
1022
+ * !!!ruby
1023
+ * ["第1ソートキー", "第2ソートキー", "..."]
1021
1024
  * </pre>
1022
1025
  * =:
1023
1026
  *
@@ -1713,50 +1716,51 @@ rb_grn_table_is_locked (int argc, VALUE *argv, VALUE self)
1713
1716
  * Groonga::Expressionを取得できる。
1714
1717
  * Groonga::Expression#snippetを使うことにより、指定した条件
1715
1718
  * 用のスニペットを簡単に生成できる。
1719
+ *
1716
1720
  * <pre>
1717
- * ==results = table.select do |record|
1718
- * record["description"] =~ "groonga"
1721
+ * !!!ruby
1722
+ * results = table.select do |record|
1723
+ * record["description"] =~ "groonga"
1724
+ * end
1725
+ * snippet = results.expression.snippet([["<em>", "</em>"]])
1726
+ * results.each do |record|
1727
+ * puts "#{record['name']}の説明文の中で「groonga」が含まれる部分"
1728
+ * snippet.execute(record["description"]).each do |snippet|
1729
+ * puts "---"
1730
+ * puts "#{snippet}..."
1731
+ * puts "---"
1719
1732
  * end
1720
- * snippet = results.expression.snippet([["<em>", "</em>"]])
1721
- * results.each do |record|
1722
- * puts "#{record['name']}の説明文の中で「groonga」が含まれる部分"
1723
- * snippet.execute(record["description"].each do |snippet|
1724
- * puts "---"
1725
- * puts "#{snippet}..."
1726
- * puts "---"
1727
- * end
1728
- * end==
1733
+ * end
1729
1734
  * </pre>
1735
+ *
1730
1736
  * 出力例
1731
- * Ruby/groongaの説明文の中で「groonga」が含まれる部分
1732
- * ---
1733
- * Ruby/<em>groonga</em>は<em>groonga</em>のいわゆるDB-APIの層の...
1734
- * ---
1735
1737
  *
1736
- * _query_ には「[カラム名]:[演算子][値]」という書式で条件を
1737
- * 指定する。演算子は以下の通り。
1738
1738
  * <pre>
1739
- * [なし]
1740
- * \[カラム値] == [値]
1741
- * [<tt>!</tt>]
1742
- * \[カラム値] != [値]
1743
- * [<tt><</tt>]
1744
- * \[カラム値] < [値]
1745
- * [<tt>></tt>]
1746
- * \[カラム値] > [値]
1747
- * [<tt><=</tt>]
1748
- * \[カラム値] <= [値]
1749
- * [<tt>>=</tt>]
1750
- * \[カラム値] >= [値]
1751
- * [<tt>@</tt>]
1752
- * \[カラム値]が[値]を含んでいるかどうか
1739
+ * !!!text
1740
+ * rroongaの説明文の中で「groonga」が含まれる部分
1741
+ * ---
1742
+ * rroongaは<em>groonga</em>のいわゆるDB-APIの層の...
1743
+ * ---
1753
1744
  * </pre>
1754
1745
  *
1746
+ * _query_ には「[カラム名]:[演算子][値]」という書式で条件を
1747
+ * 指定する。演算子は以下の通り。
1748
+ *
1749
+ * - なし := [カラム値] == [値]
1750
+ * - @!@ := [カラム値] != [値]
1751
+ * - @<@ := [カラム値] < [値]
1752
+ * - @>@ := [カラム値] > [値]
1753
+ * - @<=@ := [カラム値] <= [値]
1754
+ * - @>=@ := [カラム値] >= [値]
1755
+ * - @@@ := [カラム値]が[値]を含んでいるかどうか
1756
+ *
1755
1757
  * 例:
1758
+ *
1756
1759
  * <pre>
1757
- * =="name:daijiro" # "name"カラムの値が"daijiro"のレコードにマッチ
1758
- * "description:@groonga" # "description"カラムが
1759
- * # "groonga"を含んでいるレコードにマッチ==
1760
+ * !!!ruby
1761
+ * "name:daijiro" # "name"カラムの値が"daijiro"のレコードにマッチ
1762
+ * "description:@groonga" # "description"カラムが
1763
+ * # "groonga"を含んでいるレコードにマッチ
1760
1764
  * </pre>
1761
1765
  *
1762
1766
  * _expression_ には既に作成済みのGroonga::Expressionを渡す
@@ -1768,17 +1772,19 @@ rb_grn_table_is_locked (int argc, VALUE *argv, VALUE self)
1768
1772
  * Groonga::ColumnExpressionBuilderの他に"!="も使用可能。
1769
1773
  *
1770
1774
  * 例:
1775
+ *
1771
1776
  * <pre>
1772
- * ==comments = Groonga::Array.create(:name => "Comments")
1773
- * comments.define_column("content", "Text")
1774
- * comments.add(:content => "Hello Good-bye!")
1775
- * comments.add(:content => "Hello World")
1776
- * comments.add(:content => "test")
1777
- * result = comments.select do |record|
1778
- * record.content != "test"
1779
- * end
1780
- * p result.collect {|record| record.content}
1781
- * # => ["Hello Good-bye!", "Hello World"]==
1777
+ * !!!ruby
1778
+ * comments = Groonga::Array.create(:name => "Comments")
1779
+ * comments.define_column("content", "Text")
1780
+ * comments.add(:content => "Hello Good-bye!")
1781
+ * comments.add(:content => "Hello World")
1782
+ * comments.add(:content => "test")
1783
+ * result = comments.select do |record|
1784
+ * record.content != "test"
1785
+ * end
1786
+ * p result.collect {|record| record.content}
1787
+ * # => ["Hello Good-bye!", "Hello World"]
1782
1788
  * </pre>
1783
1789
  *
1784
1790
  * _options_ に指定可能な値は以下の通り。
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/ext/groonga/rb-grn.h CHANGED
@@ -70,9 +70,9 @@ RB_GRN_BEGIN_DECLS
70
70
  # define debug(...)
71
71
  #endif
72
72
 
73
- #define RB_GRN_MAJOR_VERSION 1
74
- #define RB_GRN_MINOR_VERSION 3
75
- #define RB_GRN_MICRO_VERSION 1
73
+ #define RB_GRN_MAJOR_VERSION 2
74
+ #define RB_GRN_MINOR_VERSION 0
75
+ #define RB_GRN_MICRO_VERSION 0
76
76
 
77
77
  #define RB_GRN_QUERY_DEFAULT_MAX_EXPRESSIONS 32
78
78
 
@@ -97,6 +97,7 @@ struct _RbGrnContext
97
97
  {
98
98
  grn_ctx *context;
99
99
  grn_ctx context_entity;
100
+ grn_hash *floating_objects;
100
101
  VALUE self;
101
102
  };
102
103
 
@@ -104,6 +105,7 @@ typedef struct _RbGrnObject RbGrnObject;
104
105
  struct _RbGrnObject
105
106
  {
106
107
  VALUE self;
108
+ VALUE rb_context;
107
109
  grn_ctx *context;
108
110
  grn_obj *object;
109
111
  grn_obj *domain;
@@ -112,6 +114,7 @@ struct _RbGrnObject
112
114
  grn_id range_id;
113
115
  grn_bool need_close;
114
116
  grn_bool have_finalizer;
117
+ grn_bool floating;
115
118
  };
116
119
 
117
120
  typedef struct _RbGrnNamedObject RbGrnNamedObject;
@@ -282,7 +285,10 @@ const char *rb_grn_rc_to_message (grn_rc rc);
282
285
  void rb_grn_rc_check (grn_rc rc,
283
286
  VALUE related_object);
284
287
 
285
- void rb_grn_context_fin (grn_ctx *context);
288
+ void rb_grn_context_register_floating_object
289
+ (RbGrnObject *rb_grn_object);
290
+ void rb_grn_context_unregister_floating_object
291
+ (RbGrnObject *rb_grn_object);
286
292
  grn_ctx *rb_grn_context_ensure (VALUE *context);
287
293
  VALUE rb_grn_context_get_default (void);
288
294
  VALUE rb_grn_context_to_exception (grn_ctx *context,