groonga 0.0.7 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/NEWS.ja.rdoc +56 -0
  2. data/NEWS.rdoc +58 -0
  3. data/Rakefile +2 -3
  4. data/benchmark/read-write-many-small-items.rb +16 -32
  5. data/benchmark/write-many-small-items.rb +14 -28
  6. data/example/bookmark.rb +19 -17
  7. data/example/index-html.rb +11 -1
  8. data/example/search/config.ru +14 -9
  9. data/ext/rb-grn-array.c +6 -6
  10. data/ext/rb-grn-column.c +348 -18
  11. data/ext/rb-grn-context.c +8 -4
  12. data/ext/rb-grn-database.c +6 -7
  13. data/ext/rb-grn-exception.c +101 -5
  14. data/ext/rb-grn-expression.c +206 -23
  15. data/ext/rb-grn-fix-size-column.c +6 -39
  16. data/ext/rb-grn-hash.c +24 -24
  17. data/ext/rb-grn-index-column.c +74 -19
  18. data/ext/rb-grn-logger.c +48 -0
  19. data/ext/rb-grn-object.c +281 -67
  20. data/ext/rb-grn-operation.c +1 -1
  21. data/ext/rb-grn-patricia-trie-cursor.c +10 -1
  22. data/ext/rb-grn-patricia-trie.c +268 -7
  23. data/ext/rb-grn-query.c +52 -1
  24. data/ext/rb-grn-record.c +8 -2
  25. data/ext/rb-grn-snippet.c +63 -1
  26. data/ext/rb-grn-table-cursor-key-support.c +15 -1
  27. data/ext/rb-grn-table-cursor.c +57 -0
  28. data/ext/rb-grn-table-key-support.c +382 -46
  29. data/ext/rb-grn-table.c +729 -192
  30. data/ext/rb-grn-type.c +63 -12
  31. data/ext/rb-grn-utils.c +156 -158
  32. data/ext/rb-grn-variable.c +18 -0
  33. data/ext/rb-grn.h +85 -21
  34. data/ext/rb-groonga.c +13 -3
  35. data/extconf.rb +19 -4
  36. data/html/developer.html +1 -1
  37. data/html/header.html.erb +1 -1
  38. data/html/index.html +4 -4
  39. data/lib/groonga.rb +10 -0
  40. data/lib/groonga/expression-builder.rb +81 -42
  41. data/lib/groonga/patricia-trie.rb +13 -0
  42. data/lib/groonga/record.rb +158 -13
  43. data/lib/groonga/schema.rb +339 -33
  44. data/pkg-config.rb +6 -1
  45. data/test-unit/lib/test/unit.rb +23 -42
  46. data/test-unit/lib/test/unit/assertionfailederror.rb +11 -0
  47. data/test-unit/lib/test/unit/assertions.rb +87 -9
  48. data/test-unit/lib/test/unit/autorunner.rb +20 -11
  49. data/test-unit/lib/test/unit/collector.rb +1 -8
  50. data/test-unit/lib/test/unit/collector/load.rb +2 -3
  51. data/test-unit/lib/test/unit/color-scheme.rb +13 -1
  52. data/test-unit/lib/test/unit/diff.rb +223 -37
  53. data/test-unit/lib/test/unit/error.rb +4 -0
  54. data/test-unit/lib/test/unit/failure.rb +31 -5
  55. data/test-unit/lib/test/unit/notification.rb +8 -4
  56. data/test-unit/lib/test/unit/omission.rb +51 -3
  57. data/test-unit/lib/test/unit/pending.rb +4 -0
  58. data/test-unit/lib/test/unit/testcase.rb +55 -4
  59. data/test-unit/lib/test/unit/ui/console/testrunner.rb +190 -4
  60. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +14 -0
  61. data/test-unit/lib/test/unit/ui/testrunner.rb +8 -0
  62. data/test-unit/lib/test/unit/version.rb +1 -1
  63. data/test-unit/sample/{tc_adder.rb → test_adder.rb} +3 -1
  64. data/test-unit/sample/{tc_subtracter.rb → test_subtracter.rb} +3 -1
  65. data/test-unit/sample/test_user.rb +1 -0
  66. data/test-unit/test/collector/test-descendant.rb +2 -4
  67. data/test-unit/test/collector/test_objectspace.rb +7 -5
  68. data/test-unit/test/run-test.rb +2 -0
  69. data/test-unit/test/test-color-scheme.rb +7 -0
  70. data/test-unit/test/test-diff.rb +48 -7
  71. data/test-unit/test/test-omission.rb +1 -1
  72. data/test-unit/test/test-testcase.rb +47 -0
  73. data/test-unit/test/test_assertions.rb +79 -10
  74. data/test/groonga-test-utils.rb +6 -1
  75. data/test/test-array.rb +29 -14
  76. data/test/test-column.rb +107 -55
  77. data/test/test-context.rb +5 -0
  78. data/test/test-database.rb +2 -37
  79. data/test/test-exception.rb +9 -1
  80. data/test/test-expression-builder.rb +23 -5
  81. data/test/test-expression.rb +44 -8
  82. data/test/test-fix-size-column.rb +16 -5
  83. data/test/test-gqtp.rb +70 -0
  84. data/test/test-hash.rb +142 -43
  85. data/test/test-index-column.rb +9 -9
  86. data/test/test-patricia-trie.rb +79 -20
  87. data/test/test-procedure.rb +4 -2
  88. data/test/test-record.rb +32 -20
  89. data/test/test-remote.rb +3 -2
  90. data/test/test-schema.rb +226 -92
  91. data/test/test-table-cursor.rb +103 -1
  92. data/test/test-table-offset-and-limit.rb +102 -0
  93. data/test/test-table-select-normalize.rb +4 -4
  94. data/test/test-table-select.rb +52 -8
  95. data/test/test-table.rb +235 -116
  96. data/test/test-type.rb +2 -2
  97. data/test/test-variable-size-column.rb +21 -5
  98. data/test/test-vector-column.rb +76 -0
  99. data/{TUTORIAL.ja.rdoc → text/TUTORIAL.ja.rdoc} +52 -52
  100. data/text/expression.rdoc +284 -0
  101. metadata +11 -7
  102. data/test-unit/sample/ts_examples.rb +0 -7
@@ -66,6 +66,16 @@ module Groonga
66
66
  def bindings_version
67
67
  BINDINGS_VERSION.join(".")
68
68
  end
69
+
70
+ ##
71
+ # call-seq:
72
+ # Groonga[name] -> Groonga::Object or nil
73
+ # Groonga[id] -> Groonga::Object or nil
74
+ #
75
+ # 便利メソッド。Groonga::Context.default[name]と同じ。
76
+ def [](name)
77
+ Context.default[name]
78
+ end
69
79
  end
70
80
  end
71
81
 
@@ -16,14 +16,23 @@
16
16
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
 
18
18
  module Groonga
19
- module ExpressionBuildable
19
+ module ExpressionBuildable # :nodoc:
20
20
  attr_reader :table
21
21
  attr_accessor :query
22
+ attr_accessor :syntax
23
+ attr_accessor :allow_pragma
24
+ attr_accessor :allow_column
25
+ attr_accessor :allow_update
26
+ attr_accessor :default_column
22
27
 
23
28
  def initialize(*args)
24
29
  @table = nil
25
30
  @name = nil
26
31
  @query = nil
32
+ @syntax = nil
33
+ @allow_pragma = nil
34
+ @allow_column = nil
35
+ @allow_update = nil
27
36
  @default_column = nil
28
37
  end
29
38
 
@@ -32,7 +41,7 @@ module Groonga
32
41
  variable = expression.define_variable(:domain => @table)
33
42
 
34
43
  builder = nil
35
- builder = match(@query) if @query
44
+ builder = match(@query, default_parse_options) if @query
36
45
  if block_given?
37
46
  if builder
38
47
  builder &= yield(self)
@@ -52,7 +61,26 @@ module Groonga
52
61
  expression
53
62
  end
54
63
 
55
- class ExpressionBuilder
64
+ def &(other)
65
+ other
66
+ end
67
+
68
+ def |(other)
69
+ other
70
+ end
71
+
72
+ private
73
+ def default_parse_options
74
+ {
75
+ :syntax => @syntax,
76
+ :allow_pragma => @allow_pragma,
77
+ :allow_column => @allow_column,
78
+ :allow_update => @allow_update,
79
+ :default_column => @default_column,
80
+ }
81
+ end
82
+
83
+ class ExpressionBuilder # :nodoc:
56
84
  def initialize
57
85
  super()
58
86
  end
@@ -66,7 +94,7 @@ module Groonga
66
94
  end
67
95
  end
68
96
 
69
- class SetExpressionBuilder < ExpressionBuilder
97
+ class SetExpressionBuilder < ExpressionBuilder # :nodoc:
70
98
  def initialize(operation, *expression_builders)
71
99
  super()
72
100
  @operation = operation
@@ -82,72 +110,76 @@ module Groonga
82
110
  end
83
111
  end
84
112
 
85
- class AndExpressionBuilder < SetExpressionBuilder
113
+ class AndExpressionBuilder < SetExpressionBuilder # :nodoc:
86
114
  def initialize(*expression_builders)
87
115
  super(Groonga::Operation::AND, *expression_builders)
88
116
  end
89
117
  end
90
118
 
91
- class OrExpressionBuilder < SetExpressionBuilder
119
+ class OrExpressionBuilder < SetExpressionBuilder # :nodoc:
92
120
  def initialize(*expression_builders)
93
121
  super(Groonga::Operation::OR, *expression_builders)
94
122
  end
95
123
  end
96
124
 
97
- class BinaryExpressionBuilder < ExpressionBuilder
98
- def initialize(operation, column_name, value)
125
+ class BinaryExpressionBuilder < ExpressionBuilder # :nodoc:
126
+ def initialize(operation, column, value)
99
127
  super()
100
128
  @operation = operation
101
- @column_name = column_name
129
+ @default_column = column
102
130
  @value = value
103
131
  end
104
132
 
105
133
  def build(expression, variable)
106
134
  expression.append_object(variable)
107
- expression.append_constant(@column_name)
135
+ if @default_column.is_a?(String)
136
+ expression.append_constant(@default_column)
137
+ else
138
+ expression.append_object(@default_column)
139
+ end
108
140
  expression.append_operation(Groonga::Operation::GET_VALUE, 2)
109
141
  expression.append_constant(@value)
110
142
  expression.append_operation(@operation, 2)
111
143
  end
112
144
  end
113
145
 
114
- class EqualExpressionBuilder < BinaryExpressionBuilder
115
- def initialize(column_name, value)
116
- super(Groonga::Operation::EQUAL, column_name, value)
146
+ class EqualExpressionBuilder < BinaryExpressionBuilder # :nodoc:
147
+ def initialize(column, value)
148
+ super(Groonga::Operation::EQUAL, column, value)
117
149
  end
118
150
  end
119
151
 
120
- class MatchExpressionBuilder < BinaryExpressionBuilder
121
- def initialize(column_name, value)
122
- super(Groonga::Operation::MATCH, column_name, value)
152
+ class MatchExpressionBuilder < BinaryExpressionBuilder # :nodoc:
153
+ def initialize(column, value)
154
+ super(Groonga::Operation::MATCH, column, value)
123
155
  end
124
156
  end
125
157
 
126
- class LessExpressionBuilder < BinaryExpressionBuilder
127
- def initialize(column_name, value)
128
- super(Groonga::Operation::LESS, column_name, value)
158
+ class LessExpressionBuilder < BinaryExpressionBuilder # :nodoc:
159
+ def initialize(column, value)
160
+ super(Groonga::Operation::LESS, column, value)
129
161
  end
130
162
  end
131
163
 
132
- class LessEqualExpressionBuilder < BinaryExpressionBuilder
133
- def initialize(column_name, value)
134
- super(Groonga::Operation::LESS_EQUAL, column_name, value)
164
+ class LessEqualExpressionBuilder < BinaryExpressionBuilder # :nodoc:
165
+ def initialize(column, value)
166
+ super(Groonga::Operation::LESS_EQUAL, column, value)
135
167
  end
136
168
  end
137
169
 
138
- class GreaterExpressionBuilder < BinaryExpressionBuilder
139
- def initialize(column_name, value)
140
- super(Groonga::Operation::GREATER, column_name, value)
170
+ class GreaterExpressionBuilder < BinaryExpressionBuilder # :nodoc:
171
+ def initialize(column, value)
172
+ super(Groonga::Operation::GREATER, column, value)
141
173
  end
142
174
  end
143
175
 
144
- class GreaterEqualExpressionBuilder < BinaryExpressionBuilder
145
- def initialize(column_name, value)
146
- super(Groonga::Operation::GREATER_EQUAL, column_name, value)
176
+ class GreaterEqualExpressionBuilder < BinaryExpressionBuilder # :nodoc:
177
+ def initialize(column, value)
178
+ super(Groonga::Operation::GREATER_EQUAL, column, value)
147
179
  end
148
180
  end
149
181
 
150
- class SubExpressionBuilder < ExpressionBuilder
182
+ class SubExpressionBuilder < ExpressionBuilder # :nodoc:
151
183
  def initialize(query, options)
152
184
  super()
153
185
  @query = query
@@ -160,7 +192,7 @@ module Groonga
160
192
  end
161
193
  end
162
194
 
163
- class RecordExpressionBuilder
195
+ class RecordExpressionBuilder # :nodoc:
164
196
  include ExpressionBuildable
165
197
 
166
198
  def initialize(table, name)
@@ -176,7 +208,9 @@ module Groonga
176
208
  "for table <#{@table.inspect}>"
177
209
  raise ArgumentError, message
178
210
  end
179
- ColumnExpressionBuilder.new(column, nil, nil)
211
+ ColumnExpressionBuilder.new(column, nil, nil,
212
+ :table => @table,
213
+ :column_name => name)
180
214
  end
181
215
 
182
216
  def match(query, options_or_default_column={})
@@ -185,20 +219,21 @@ module Groonga
185
219
  else
186
220
  options = options_or_default_column
187
221
  end
188
- default_options = {:parser => :table}
189
- SubExpressionBuilder.new(query, default_options.merge(options))
222
+ options = options.dup
223
+ options[:syntax] ||= :query
224
+ SubExpressionBuilder.new(query, options)
190
225
  end
191
226
  end
192
227
 
193
- class ColumnExpressionBuilder
228
+ class ColumnExpressionBuilder # :nodoc:
194
229
  include ExpressionBuildable
195
230
 
196
- def initialize(column, name, query)
231
+ def initialize(column, name, query, options={})
197
232
  super()
198
- @table = column.table
199
- @range = column.range
200
- @column = column
201
- @default_column = column.local_name
233
+ @table = options[:table] || column.table
234
+ @default_column = column
235
+ @column_name = options[:column_name] || @default_column.local_name
236
+ @range = @default_column.range
202
237
  @name = name
203
238
  @query = query
204
239
  end
@@ -208,6 +243,10 @@ module Groonga
208
243
  end
209
244
 
210
245
  def =~(other)
246
+ if other.nil?
247
+ full_column_name = "#{@table.name}.#{@column_name}"
248
+ raise ArgumentError, "match word should not be nil: #{full_column_name}"
249
+ end
211
250
  MatchExpressionBuilder.new(@default_column, normalize(other))
212
251
  end
213
252
 
@@ -228,9 +267,9 @@ module Groonga
228
267
  end
229
268
 
230
269
  def match(query, options={})
231
- default_options = {:parser => :table}
232
- ensure_options = {:default_column => @default_column}
233
- options = default_options.merge(options).merge(ensure_options)
270
+ options = options.dup
271
+ options[:syntax] ||= :query
272
+ options[:default_column] = @column_name
234
273
  SubExpressionBuilder.new(query, options)
235
274
  end
236
275
 
@@ -17,6 +17,14 @@
17
17
 
18
18
  module Groonga
19
19
  class PatriciaTrie
20
+ # call-seq:
21
+ # patricia_trie.tag_keys(text) {|record, word| ...} -> String
22
+ #
23
+ # _text_を走査し、レコードのキーとマッチする部分文字列ごとに
24
+ # そのレコードが_record_として、その部分文字列が_word_として、
25
+ # ブロックが呼び出される。ブロックから返された文字列が元の部
26
+ # 分文字列と置換される。全てのヒットに対してのその置換処理が
27
+ # 行われた文字列が返される。
20
28
  def tag_keys(text)
21
29
  position = 0
22
30
  result = ''
@@ -34,6 +42,11 @@ module Groonga
34
42
  result << yield(record, word)
35
43
  position = start + length
36
44
  end
45
+ last_text = bytes[position..-1]
46
+ unless last_text.empty?
47
+ last_text.force_encoding(encoding) if encoding
48
+ result << last_text
49
+ end
37
50
  result
38
51
  end
39
52
  end
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
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
@@ -17,7 +17,18 @@
17
17
 
18
18
  module Groonga
19
19
  class Record
20
- attr_reader :table, :id
20
+ # レコードが所属するテーブル
21
+ attr_reader :table
22
+ # レコードのID
23
+ attr_reader :id
24
+ # _table_の_id_に対応するレコードを作成する。_values_には各
25
+ # カラムに設定する値を以下のような形式で指定する。
26
+ #
27
+ # [
28
+ # ["カラム名", 値],
29
+ # ["カラム名", 値],
30
+ # ...,
31
+ # ]
21
32
  def initialize(table, id, values=nil)
22
33
  @table = table
23
34
  @id = id
@@ -28,103 +39,237 @@ module Groonga
28
39
  end
29
40
  end
30
41
 
42
+ # call-seq:
43
+ # record == other -> true/false
44
+ #
45
+ # _record_と_other_が同じgroongaのレコードなら+true+を返し、
46
+ # そうでなければ+false+を返す。
31
47
  def ==(other)
32
48
  self.class == other.class and
33
49
  [table, id] == [other.table, other.id]
34
50
  end
35
51
 
52
+ # call-seq:
53
+ # record[column_name] -> 値
54
+ #
55
+ # このレコードの_column_name_で指定されたカラムの値を返す。
36
56
  def [](column_name)
37
- column(column_name)[@id]
57
+ @table.column_value(@id, column_name, :id => true)
38
58
  end
39
59
 
60
+ # call-seq:
61
+ # record[column_name] = 値
62
+ #
63
+ # このレコードの_column_name_で指定されたカラムの値を設定す
64
+ # る。
40
65
  def []=(column_name, value)
41
- column(column_name)[@id] = value
66
+ @table.set_column_value(@id, column_name, value, :id => true)
42
67
  end
43
68
 
69
+ # call-seq:
70
+ # record.append(column_name, value)
71
+ #
72
+ # このレコードの_column_name_で指定されたカラムの値の最後に
73
+ # _value_を追加する。
44
74
  def append(column_name, value)
45
75
  column(column_name).append(@id, value)
46
76
  end
47
77
 
78
+ # call-seq:
79
+ # record.prepend(column_name, value)
80
+ #
81
+ # このレコードの_column_name_で指定されたカラムの値の最初に
82
+ # _value_を追加する。
48
83
  def prepend(column_name, value)
49
84
  column(column_name).prepend(@id, value)
50
85
  end
51
86
 
87
+ # call-seq:
88
+ # record.have_column?(name) -> true/false
89
+ #
90
+ # 名前が_name_のカラムがレコードの所属するテーブルで定義され
91
+ # ているなら+true+を返す。
52
92
  def have_column?(name)
53
93
  column(name).is_a?(Groonga::Column)
54
- rescue Groonga::InvalidArgument
94
+ rescue Groonga::NoSuchColumn
55
95
  false
56
96
  end
57
97
 
98
+ # call-seq:
99
+ # record.reference_column?(name) -> true/false
100
+ #
101
+ # 名前が_name_のカラムが参照カラムであるなら+true+を返す。
58
102
  def reference_column?(name)
59
103
  column(name).range.is_a?(Groonga::Table)
60
104
  end
61
105
 
106
+ # call-seq:
107
+ # record.search(name, query, options={}) -> Groonga::Hash
108
+ #
109
+ # 名前が_name_のGroonga::IndexColumnのsearchメソッドを呼ぶ。
110
+ # _query_と_options_はそのメソッドにそのまま渡される。詳しく
111
+ # はGroonga::IndexColumn#searchを参照。
62
112
  def search(name, query, options={})
63
113
  column(name).search(query, options)
64
114
  end
65
115
 
116
+ # call-seq:
117
+ # record.key -> 主キー
118
+ #
119
+ # レコードの主キーを返す。
120
+ #
121
+ # _record_が所属するテーブルがGroonga:::Arrayの場合は常
122
+ # に+nil+を返す。
66
123
  def key
67
- @table.key(@id)
124
+ if @table.is_a?(Groonga::Array)
125
+ nil
126
+ else
127
+ @key ||= @table.key(@id)
128
+ end
68
129
  end
69
130
 
131
+ # call-seq:
132
+ # record.score -> スコア値
133
+ #
134
+ # レコードのスコア値を返す。検索結果として生成されたテーブル
135
+ # のみに定義される。
70
136
  def score
71
- self[".:score"]
137
+ self["._score"]
138
+ end
139
+
140
+ # call-seq:
141
+ # record.n_sub_records -> 件数
142
+ #
143
+ # 主キーの値が同一であったレコードの件数を返す。検索結果とし
144
+ # て生成されたテーブルのみに定義される。
145
+ def n_sub_records
146
+ self["._nsubrecs"]
72
147
  end
73
148
 
149
+ # call-seq:
150
+ # record.value -> 値
151
+ #
152
+ # レコードの値を返す。
74
153
  def value
75
- @table[@id]
154
+ @table.value(@id, :id => true)
76
155
  end
77
156
 
157
+ # call-seq:
158
+ # record.value = 値
159
+ #
160
+ # レコードの値を設定する。既存の値は上書きされる。
78
161
  def value=(value)
79
- @table[@id] = value
162
+ @table.set_value(@id, value, :id => true)
80
163
  end
81
164
 
165
+ # call-seq:
166
+ # record.increment!(name, delta=nil)
167
+ #
168
+ # このレコードの_name_で指定されたカラムの値を_delta_だけ増
169
+ # 加する。_delta_が+nil+の場合は1増加する。
82
170
  def increment!(name, delta=nil)
83
171
  column(name).increment!(@id, delta)
84
172
  end
85
173
 
174
+ # call-seq:
175
+ # record.decrement!(name, delta=nil)
176
+ #
177
+ # このレコードの_name_で指定されたカラムの値を_delta_だけ減
178
+ # 少する。_delta_が+nil+の場合は1減少する。
86
179
  def decrement!(name, delta=nil)
87
180
  column(name).decrement!(@id, delta)
88
181
  end
89
182
 
183
+ # call-seq:
184
+ # record.columns -> Groonga::Columnの配列
185
+ #
186
+ # レコードが所属するテーブルの全てのカラムを返す。
90
187
  def columns
91
188
  @table.columns
92
189
  end
93
190
 
191
+ # call-seq:
192
+ # attributes -> Hash
193
+ #
194
+ # レコードが所属しているテーブルで定義されているインデックス
195
+ # 型のカラムでない全カラムを対象とし、カラムの名前をキーとし
196
+ # たこのレコードのカラムの値のハッシュを返す。
94
197
  def attributes
95
- attributes = {}
198
+ attributes = {"id" => id}
199
+ _key = key
200
+ attributes["key"] = _key if _key
96
201
  table_name = @table.name
97
202
  columns.each do |column|
98
203
  next if column.is_a?(Groonga::IndexColumn)
99
- attributes[column.local_name] = column[@id]
204
+ value = column[@id]
205
+ # TODO: support recursive reference.
206
+ value = value.attributes if value.is_a?(Groonga::Record)
207
+ attributes[column.local_name] = value
100
208
  end
101
209
  attributes
102
210
  end
103
211
 
212
+ # call-seq:
213
+ # record.delete
214
+ #
215
+ # レコードを削除する。
104
216
  def delete
105
217
  @table.delete(@id)
106
218
  end
107
219
 
220
+ # call-seq:
221
+ # record.lock(options={})
222
+ # record.lock(options={}) {...}
223
+ #
224
+ # レコードが所属するテーブルをロックする。ロックに失敗した場
225
+ # 合はGroonga::ResourceDeadlockAvoided例外が発生する。
226
+ #
227
+ # ブロックを指定した場合はブロックを抜けたときにunlockする。
228
+ #
229
+ # 利用可能なオプションは以下の通り。
230
+ #
231
+ # [_:timeout_]
232
+ # ロックを獲得できなかった場合は_:timeout_秒間ロックの獲
233
+ # 得を試みる。_:timeout_秒以内にロックを獲得できなかった
234
+ # 場合は例外が発生する。
108
235
  def lock(options={}, &block)
109
236
  @table.lock(options.merge(:id => @id), &block)
110
237
  end
111
238
 
239
+ # call-seq:
240
+ # record.unlock(options={})
241
+ #
242
+ # レコードが所属するテーブルのロックを解除する。
243
+ #
244
+ # 利用可能なオプションは現在は無い。
112
245
  def unlock(options={})
113
246
  @table.unlock(options.merge(:id => @id))
114
247
  end
115
248
 
249
+ # call-seq:
250
+ # record.clear_lock(options={})
251
+ #
252
+ # レコードが所属するテーブルのロックを強制的に解除する。
253
+ #
254
+ # 利用可能なオプションは現在は無い。
116
255
  def clear_lock(options={})
117
256
  @table.clear_lock(options.merge(:id => @id))
118
257
  end
119
258
 
259
+ # call-seq:
260
+ # record.locked?(options={}) -> true/false
261
+ #
262
+ # レコードが所属するテーブルがロックされていれば+true+を返す。
263
+ #
264
+ # 利用可能なオプションは現在は無い。
120
265
  def locked?(options={})
121
266
  @table.locked?(options.merge(:id => @id))
122
267
  end
123
268
 
124
269
  private
125
- def column(name)
270
+ def column(name) # :nodoc:
126
271
  _column = @table.column(name.to_s)
127
- raise InvalidArgument, "column(#{name.inspect}) is nil" if _column.nil?
272
+ raise NoSuchColumn, "column(#{name.inspect}) is nil" if _column.nil?
128
273
  _column
129
274
  end
130
275
  end