rroonga 2.1.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/bin/grndump +1 -1
  2. data/doc/text/news.textile +22 -4
  3. data/ext/groonga/rb-grn-accessor.c +1 -1
  4. data/ext/groonga/rb-grn-array-cursor.c +1 -1
  5. data/ext/groonga/rb-grn-array.c +218 -2
  6. data/ext/groonga/rb-grn-column.c +1 -1
  7. data/ext/groonga/rb-grn-context.c +1 -1
  8. data/ext/groonga/rb-grn-database.c +1 -1
  9. data/ext/groonga/rb-grn-double-array-trie-cursor.c +1 -1
  10. data/ext/groonga/rb-grn-double-array-trie.c +1 -1
  11. data/ext/groonga/rb-grn-encoding-support.c +1 -1
  12. data/ext/groonga/rb-grn-encoding.c +1 -1
  13. data/ext/groonga/rb-grn-exception.c +1 -1
  14. data/ext/groonga/rb-grn-expression-builder.c +1 -1
  15. data/ext/groonga/rb-grn-expression.c +1 -1
  16. data/ext/groonga/rb-grn-fix-size-column.c +1 -1
  17. data/ext/groonga/rb-grn-geo-point.c +1 -1
  18. data/ext/groonga/rb-grn-hash-cursor.c +1 -1
  19. data/ext/groonga/rb-grn-hash.c +1 -1
  20. data/ext/groonga/rb-grn-index-column.c +1 -1
  21. data/ext/groonga/rb-grn-index-cursor.c +1 -1
  22. data/ext/groonga/rb-grn-logger.c +1 -1
  23. data/ext/groonga/rb-grn-normalizer.c +1 -1
  24. data/ext/groonga/rb-grn-object.c +7 -7
  25. data/ext/groonga/rb-grn-operator.c +1 -1
  26. data/ext/groonga/rb-grn-patricia-trie-cursor.c +1 -1
  27. data/ext/groonga/rb-grn-patricia-trie.c +1 -1
  28. data/ext/groonga/rb-grn-plugin.c +1 -1
  29. data/ext/groonga/rb-grn-posting.c +1 -1
  30. data/ext/groonga/rb-grn-procedure.c +1 -1
  31. data/ext/groonga/rb-grn-record.c +1 -1
  32. data/ext/groonga/rb-grn-snippet.c +1 -1
  33. data/ext/groonga/rb-grn-table-cursor-key-support.c +1 -1
  34. data/ext/groonga/rb-grn-table-cursor.c +1 -1
  35. data/ext/groonga/rb-grn-table-key-support.c +1 -1
  36. data/ext/groonga/rb-grn-table.c +1 -1
  37. data/ext/groonga/rb-grn-type.c +1 -1
  38. data/ext/groonga/rb-grn-utils.c +1 -1
  39. data/ext/groonga/rb-grn-variable-size-column.c +1 -1
  40. data/ext/groonga/rb-grn-variable.c +1 -1
  41. data/ext/groonga/rb-grn.h +4 -4
  42. data/ext/groonga/rb-groonga.c +1 -1
  43. data/lib/groonga/context.rb +93 -13
  44. data/rroonga-build.rb +2 -2
  45. data/test/groonga-test-utils.rb +2 -1
  46. data/test/test-array.rb +86 -2
  47. data/test/test-context.rb +22 -2
  48. metadata +296 -288
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2010-2012 Kouhei Sutou <kou@clear-code.com>
3
+ # Copyright (C) 2010-2013 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
@@ -28,22 +28,81 @@ module Groonga
28
28
  Database.open(path, options, &block)
29
29
  end
30
30
 
31
- # _path_ に新しくデータベースを作成する。 _path_ を省略すると
32
- # 一時データベースとなる。
31
+ # This is convenience method. It wraps {Groonga::Database.create}
32
+ # for the context.
33
33
  #
34
- # @example
35
- # #一時データベースを作成:
36
- # context.create_database
34
+ # @overload create_database
35
+ # Creates a new temproary database for the context.
37
36
  #
38
- # #永続データベースを作成:
39
- # context.create_database("/tmp/db.groonga")
40
- def create_database(path=nil)
37
+ # @return [Groonga::Database] A new temporary database.
38
+ #
39
+ # @example Creating a new temporary database
40
+ # temporary_database = context.create_database
41
+ #
42
+ # @overload create_database(&block)
43
+ # Creates a new temproary database for the context. The database
44
+ # is closed after the passed block is finished.
45
+ #
46
+ # @yield [database] Yields a newly created temporary database
47
+ # for the context. The database is available only in the
48
+ # block.
49
+ #
50
+ # @yieldparam [Groonga::Database] database A newly created
51
+ # temporary database for the context.
52
+ #
53
+ # @yieldreturn [Object] The returned value from the block is the
54
+ # returned value from this method.
55
+ #
56
+ # @return Returned value from the block.
57
+ #
58
+ # @example Creating a new temporary database with block
59
+ # context.create_database do |temporary_database|
60
+ # # ...
61
+ # end
62
+ #
63
+ # @overload create_database(path)
64
+ # Creates a new persistent database for the context to the _path_.
65
+ #
66
+ # @param [String] path Database path for a new persistent
67
+ # database.
68
+ #
69
+ # @return [Groonga::Database] A new persistent database for the
70
+ # context.
71
+ #
72
+ # @example Creating a new persistent database to _"/tmp/db.groonga"_
73
+ # database = context.create_database("/tmp/db.groonga")
74
+ #
75
+ # @overload create_database(path, &block)
76
+ # Creates a new persistent database for the context to the
77
+ # _path_. The database is closed after the passed block is
78
+ # finished.
79
+ #
80
+ # @param [String] path Database path for a new persistent
81
+ # database.
82
+ #
83
+ # @yield [database] Yields a newly created persistent database
84
+ # for the context. The database is available only in the
85
+ # block.
86
+ #
87
+ # @yieldparam [Groonga::Database] database A newly created
88
+ # persistent database for the context.
89
+ #
90
+ # @yieldreturn [Object] The returned value from the block is the
91
+ # returned value from this method.
92
+ #
93
+ # @return Returned value from the block.
94
+ #
95
+ # @example Creating a new persistent database to _"/tmp/db.groonga"_ database with block
96
+ # context.create_database("/tmp/db.groonga") do |persistent_database|
97
+ # # ...
98
+ # end
99
+ def create_database(path=nil, &block)
41
100
  options = {:context => self}
42
101
  if path
43
102
  options[:path] = path
44
103
  end
45
104
 
46
- Database.create(options)
105
+ Database.create(options, &block)
47
106
  end
48
107
 
49
108
  # groongaのプラグインディレクトリにあるプラグイン _name_
@@ -78,28 +137,49 @@ module Groonga
78
137
 
79
138
  # Restore commands dumped by "grndump" command.
80
139
  #
81
- # @example
140
+ # @example Restore dumped commands.
82
141
  # dumped_commands = File.read("dump.grn")
83
142
  # context.restore(dumped_commands)
84
143
  #
144
+ # If block is given, response is yielded.
145
+ #
146
+ # @example Restore dumped commands and reports result.
147
+ # dumped_commands = File.read("dump.grn")
148
+ # context.restore(dumped_commands) do |command, response|
149
+ # puts("#{command} -> #{response}")
150
+ # end
151
+ #
85
152
  # @param [String] dumped_commands commands dumped by grndump.
153
+ # @yield [command, response]
154
+ # Yields a sent command and its response if block is given.
155
+ # @yieldparam command [String] A sent command.
156
+ # @yieldparam response [String] A response for a command.
157
+ # @return [void]
86
158
  def restore(dumped_commands)
87
159
  buffer = ""
160
+ continued = false
88
161
  dumped_commands.each_line do |line|
89
162
  line = line.chomp
90
163
  case line
91
164
  when /\\\z/
165
+ continued = true
92
166
  buffer << $PREMATCH
93
167
  else
168
+ continued = false
94
169
  buffer << line
95
170
  send(buffer)
96
- receive
171
+ _, response = receive
172
+ if block_given?
173
+ not_shared_command = continued ? buffer.dup : line
174
+ yield(not_shared_command, response)
175
+ end
97
176
  buffer.clear
98
177
  end
99
178
  end
100
179
  unless buffer.empty?
101
180
  send(buffer)
102
- receive
181
+ _, response = receive
182
+ yield(buffer.dup, response) if block_given?
103
183
  end
104
184
  end
105
185
  end
data/rroonga-build.rb CHANGED
@@ -17,8 +17,8 @@
17
17
 
18
18
  module RroongaBuild
19
19
  module RequiredGroongaVersion
20
- MAJOR = 2
21
- MINOR = 1
20
+ MAJOR = 3
21
+ MINOR = 0
22
22
  MICRO = 2
23
23
  VERSION = [MAJOR, MINOR, MICRO]
24
24
  end
@@ -15,6 +15,7 @@
15
15
 
16
16
  require 'fileutils'
17
17
  require 'pathname'
18
+ require 'tempfile'
18
19
  require 'time'
19
20
  require 'erb'
20
21
  require 'stringio'
@@ -46,7 +47,7 @@ module GroongaTestUtils
46
47
 
47
48
  def setup_tmp_directory
48
49
  @base_tmp_dir = Pathname(File.dirname(__FILE__)) + "tmp"
49
- memory_file_system = "/dev/shm"
50
+ memory_file_system = "/run/shm"
50
51
  if File.exist?(memory_file_system)
51
52
  FileUtils.mkdir_p(@base_tmp_dir.parent.to_s)
52
53
  FileUtils.rm_f(@base_tmp_dir.to_s)
data/test/test-array.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2009-2012 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2013 Kouhei Sutou <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -16,7 +16,7 @@
16
16
  class ArrayTest < Test::Unit::TestCase
17
17
  include GroongaTestUtils
18
18
 
19
- setup :setup_database
19
+ setup :setup_database, :before => :append
20
20
 
21
21
  def test_support_key?
22
22
  assert_not_predicate(Groonga::Array.create(:name => "Users"), :support_key?)
@@ -143,4 +143,88 @@ class ArrayTest < Test::Unit::TestCase
143
143
  user_ids = users.each.collect(&:id)
144
144
  assert_equal([1, 2, 3], user_ids)
145
145
  end
146
+
147
+ class TestPushPull < self
148
+ def setup
149
+ @queue = Groonga::Array.create(:name => "Queue")
150
+ @queue.define_column("content", "ShortText")
151
+ end
152
+
153
+ def teardown
154
+ @queue = nil
155
+ end
156
+
157
+ def test_block?
158
+ Tempfile.open("output") do |output|
159
+ Tempfile.open("blocked_pull.rb") do |pull_rb|
160
+ pull_rb.puts(pull_rb_source(":block? => true"))
161
+ pull_rb.close
162
+
163
+ pid = spawn({}, RbConfig.ruby, pull_rb.path, :out => output.path)
164
+ sleep(0.5)
165
+ @queue.push do |record|
166
+ record.content = "The first record"
167
+ end
168
+ Process.waitpid(pid)
169
+ assert_equal(<<-EXPECTED_OUTPUT, output.read)
170
+ start
171
+ 1, The first record
172
+ done
173
+ EXPECTED_OUTPUT
174
+ end
175
+ end
176
+ end
177
+
178
+ def test_not_block?
179
+ Tempfile.open("output") do |output|
180
+ Tempfile.open("not_blocked_pull.rb") do |pull_rb|
181
+ pull_rb.puts(pull_rb_source(":block? => false"))
182
+ pull_rb.close
183
+
184
+ pid = spawn({}, RbConfig.ruby, pull_rb.path, :out => output.path)
185
+ Process.waitpid(pid)
186
+ assert_equal(<<-EXPECTED_OUTPUT, output.read)
187
+ start
188
+ done
189
+ EXPECTED_OUTPUT
190
+
191
+ @queue.push do |record|
192
+ record.content = "The first record"
193
+ end
194
+ pid = spawn({}, RbConfig.ruby, pull_rb.path, :out => output.path)
195
+ Process.waitpid(pid)
196
+ output.rewind
197
+ assert_equal(<<-EXPECTED_OUTPUT, output.read)
198
+ start
199
+ 1, The first record
200
+ done
201
+ EXPECTED_OUTPUT
202
+ end
203
+ end
204
+ end
205
+
206
+ private
207
+ def pull_rb_source(options)
208
+ base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
209
+ <<-CODE
210
+ base_dir = #{base_dir.dump}
211
+ ext_dir = File.join(base_dir, "ext", "groonga")
212
+ lib_dir = File.join(base_dir, "lib")
213
+
214
+ $LOAD_PATH.unshift(ext_dir)
215
+ $LOAD_PATH.unshift(lib_dir)
216
+
217
+ require "groonga"
218
+
219
+ puts("start")
220
+ Groonga::Context.default.open_database(#{@database_path.to_s.dump}) do
221
+ queue = Groonga["Queue"]
222
+ queue.pull(#{options}) do |record|
223
+ puts([record.id, record.content].join(", "))
224
+ end
225
+ end
226
+ puts("done")
227
+ CODE
228
+ end
229
+ end
146
230
  end
data/test/test-context.rb CHANGED
@@ -178,12 +178,32 @@ column_create Items title COLUMN_SCALAR Text
178
178
  EOC
179
179
  end
180
180
 
181
+ def test_block
182
+ table_create = "table_create Items TABLE_HASH_KEY --key_type ShortText"
183
+ column_create = "column_create Items title COLUMN_SCALAR Text"
184
+ commands = <<-COMMANDS
185
+ #{table_create}
186
+
187
+ #{column_create}
188
+ COMMANDS
189
+ responses = []
190
+ restore(commands) do |command, response|
191
+ responses << [command.dup, response]
192
+ end
193
+ assert_equal([
194
+ [table_create, "true"],
195
+ ["", ""],
196
+ [column_create,"true"]
197
+ ],
198
+ responses)
199
+ end
200
+
181
201
  private
182
- def restore(commands)
202
+ def restore(commands, &block)
183
203
  restored_db_path = @tmp_dir + "restored.db"
184
204
  Groonga::Database.create(:path => restored_db_path.to_s)
185
205
 
186
- context.restore(commands)
206
+ context.restore(commands, &block)
187
207
  end
188
208
 
189
209
  def dump