activegroonga 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +1 -0
- data/NEWS.ja.rdoc +5 -0
- data/NEWS.rdoc +5 -0
- data/README.ja.rdoc +49 -0
- data/README.rdoc +49 -0
- data/Rakefile +175 -0
- data/lib/active_groonga.rb +75 -0
- data/lib/active_groonga/aggregations.rb +30 -0
- data/lib/active_groonga/associations.rb +93 -0
- data/lib/active_groonga/associations/belongs_to_association.rb +25 -0
- data/lib/active_groonga/attribute_methods.rb +36 -0
- data/lib/active_groonga/base.rb +1579 -0
- data/lib/active_groonga/column.rb +107 -0
- data/lib/active_groonga/dirty.rb +30 -0
- data/lib/active_groonga/fixtures.rb +92 -0
- data/lib/active_groonga/migration.rb +150 -0
- data/lib/active_groonga/rails_support.rb +31 -0
- data/lib/active_groonga/reflection.rb +30 -0
- data/lib/active_groonga/schema.rb +314 -0
- data/lib/active_groonga/schema_dumper.rb +147 -0
- data/lib/active_groonga/tasks.rb +16 -0
- data/lib/active_groonga/tasks/groonga.rake +162 -0
- data/lib/active_groonga/test_case.rb +21 -0
- data/lib/active_groonga/test_help.rb +21 -0
- data/lib/active_groonga/timestamp.rb +30 -0
- data/lib/active_groonga/validations.rb +26 -0
- data/lib/active_groonga/version.rb +24 -0
- data/license/LGPL +504 -0
- data/rails/README +28 -0
- data/rails/init.rb +70 -0
- data/rails_generators/model_groonga/USAGE +28 -0
- data/rails_generators/model_groonga/model_groonga_generator.rb +45 -0
- data/rails_generators/model_groonga/templates/fixtures.yml +17 -0
- data/rails_generators/model_groonga/templates/migration.rb +16 -0
- data/rails_generators/model_groonga/templates/model.rb +2 -0
- data/rails_generators/model_groonga/templates/unit_test.rb +8 -0
- data/test-unit/Rakefile +35 -0
- data/test-unit/TODO +5 -0
- data/test-unit/bin/testrb +5 -0
- data/test-unit/html/classic.html +15 -0
- data/test-unit/html/index.html +25 -0
- data/test-unit/html/index.html.ja +27 -0
- data/test-unit/lib/test/unit.rb +342 -0
- data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
- data/test-unit/lib/test/unit/assertions.rb +1149 -0
- data/test-unit/lib/test/unit/attribute.rb +125 -0
- data/test-unit/lib/test/unit/autorunner.rb +306 -0
- data/test-unit/lib/test/unit/collector.rb +43 -0
- data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
- data/test-unit/lib/test/unit/collector/dir.rb +108 -0
- data/test-unit/lib/test/unit/collector/load.rb +135 -0
- data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
- data/test-unit/lib/test/unit/color-scheme.rb +86 -0
- data/test-unit/lib/test/unit/color.rb +96 -0
- data/test-unit/lib/test/unit/diff.rb +538 -0
- data/test-unit/lib/test/unit/error.rb +124 -0
- data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
- data/test-unit/lib/test/unit/failure.rb +110 -0
- data/test-unit/lib/test/unit/fixture.rb +176 -0
- data/test-unit/lib/test/unit/notification.rb +125 -0
- data/test-unit/lib/test/unit/omission.rb +143 -0
- data/test-unit/lib/test/unit/pending.rb +146 -0
- data/test-unit/lib/test/unit/priority.rb +161 -0
- data/test-unit/lib/test/unit/runner/console.rb +52 -0
- data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
- data/test-unit/lib/test/unit/testcase.rb +360 -0
- data/test-unit/lib/test/unit/testresult.rb +89 -0
- data/test-unit/lib/test/unit/testsuite.rb +110 -0
- data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +220 -0
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
- data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
- data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
- data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
- data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
- data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
- data/test-unit/lib/test/unit/util/observable.rb +90 -0
- data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
- data/test-unit/lib/test/unit/version.rb +7 -0
- data/test-unit/sample/adder.rb +13 -0
- data/test-unit/sample/subtracter.rb +12 -0
- data/test-unit/sample/tc_adder.rb +18 -0
- data/test-unit/sample/tc_subtracter.rb +18 -0
- data/test-unit/sample/test_user.rb +22 -0
- data/test-unit/sample/ts_examples.rb +7 -0
- data/test-unit/test/collector/test-descendant.rb +135 -0
- data/test-unit/test/collector/test-load.rb +333 -0
- data/test-unit/test/collector/test_dir.rb +406 -0
- data/test-unit/test/collector/test_objectspace.rb +98 -0
- data/test-unit/test/run-test.rb +13 -0
- data/test-unit/test/test-attribute.rb +86 -0
- data/test-unit/test/test-color-scheme.rb +56 -0
- data/test-unit/test/test-color.rb +47 -0
- data/test-unit/test/test-diff.rb +477 -0
- data/test-unit/test/test-emacs-runner.rb +60 -0
- data/test-unit/test/test-fixture.rb +287 -0
- data/test-unit/test/test-notification.rb +33 -0
- data/test-unit/test/test-omission.rb +81 -0
- data/test-unit/test/test-pending.rb +70 -0
- data/test-unit/test/test-priority.rb +119 -0
- data/test-unit/test/test_assertions.rb +1082 -0
- data/test-unit/test/test_error.rb +26 -0
- data/test-unit/test/test_failure.rb +33 -0
- data/test-unit/test/test_testcase.rb +478 -0
- data/test-unit/test/test_testresult.rb +113 -0
- data/test-unit/test/test_testsuite.rb +129 -0
- data/test-unit/test/testunit-test-util.rb +14 -0
- data/test-unit/test/ui/test_testrunmediator.rb +20 -0
- data/test-unit/test/util/test-method-owner-finder.rb +38 -0
- data/test-unit/test/util/test_backtracefilter.rb +41 -0
- data/test-unit/test/util/test_observable.rb +102 -0
- data/test-unit/test/util/test_procwrapper.rb +36 -0
- data/test/active-groonga-test-utils.rb +234 -0
- data/test/fixtures/bookmark.rb +2 -0
- data/test/fixtures/task.rb +2 -0
- data/test/fixtures/user.rb +2 -0
- data/test/run-test.rb +51 -0
- data/test/test-associations.rb +24 -0
- data/test/test-base.rb +194 -0
- data/test/test-schema.rb +49 -0
- metadata +192 -0
@@ -0,0 +1,314 @@
|
|
1
|
+
# Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License version 2.1 as published by the Free Software Foundation.
|
6
|
+
#
|
7
|
+
# This library is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
10
|
+
# Lesser General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU Lesser General Public
|
13
|
+
# License along with this library; if not, write to the Free Software
|
14
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
|
+
|
16
|
+
module ActiveGroonga
|
17
|
+
module Schema
|
18
|
+
class << self
|
19
|
+
def define(info={}, &block)
|
20
|
+
initialize_schema_management_tables
|
21
|
+
instance_eval(&block)
|
22
|
+
|
23
|
+
unless info[:version].blank?
|
24
|
+
assume_migrated_upto_version(info[:version])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def assume_migrated_upto_version(version)
|
29
|
+
version = version.to_i
|
30
|
+
table_name = Migrator.groonga_schema_migrations_table_name
|
31
|
+
|
32
|
+
migrations_table = Base.context[table_name]
|
33
|
+
migrated = migrations_table.records.collect do |record|
|
34
|
+
record["version"].to_i
|
35
|
+
end
|
36
|
+
versions = Dir['db/migrate/[0-9]*_*.rb'].map do |filename|
|
37
|
+
filename.split('/').last.split('_').first.to_i
|
38
|
+
end
|
39
|
+
|
40
|
+
unless migrated.include?(version)
|
41
|
+
migrations_table.add(version.to_s)
|
42
|
+
end
|
43
|
+
|
44
|
+
inserted = Set.new
|
45
|
+
(versions - migrated).each do |v|
|
46
|
+
if inserted.include?(v)
|
47
|
+
raise "Duplicate migration #{v}. Please renumber your migrations to resolve the conflict."
|
48
|
+
elsif v < version
|
49
|
+
migration = migrations_table.add
|
50
|
+
migration["version"] = v.to_s
|
51
|
+
inserted << v
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def initialize_schema_management_tables
|
57
|
+
initialize_index_management_table
|
58
|
+
initialize_index_table
|
59
|
+
initialize_migrations_table
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_table(name, options={})
|
63
|
+
table_definition = TableDefinition.new(name)
|
64
|
+
yield(table_definition)
|
65
|
+
table_definition.create
|
66
|
+
end
|
67
|
+
|
68
|
+
def drop_table(name, options={})
|
69
|
+
table = Base.context[Base.groonga_table_name(name)]
|
70
|
+
table_id = table.id
|
71
|
+
table.remove
|
72
|
+
index_management_table.open_cursor do |cursor|
|
73
|
+
while cursor.next
|
74
|
+
cursor.delete if cursor.table_id == table_id
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_column(table_name, column_name, type, options={})
|
80
|
+
column = ColumnDefinition.new(table_name, column_name)
|
81
|
+
if type.to_s == "references"
|
82
|
+
table = options.delete(:to) || column_name.pluralize
|
83
|
+
column.type = Base.groonga_table_name(table)
|
84
|
+
else
|
85
|
+
column.type = type
|
86
|
+
end
|
87
|
+
column.create(options)
|
88
|
+
end
|
89
|
+
|
90
|
+
def remove_column(table_name, *column_names)
|
91
|
+
column_names.each do |column_name|
|
92
|
+
ColumnDefinition.new(table_name, column_name).remove
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def add_index(table_name, column_name, options={})
|
97
|
+
groonga_table_name = Base.groonga_table_name(table_name)
|
98
|
+
table = Base.context[groonga_table_name]
|
99
|
+
column_name = column_name.to_s
|
100
|
+
column = table.column(column_name)
|
101
|
+
|
102
|
+
base_dir = File.join(Base.metadata_directory,
|
103
|
+
index_table_name,
|
104
|
+
table_name)
|
105
|
+
FileUtils.mkdir_p(base_dir)
|
106
|
+
|
107
|
+
name = "#{table_name}/#{column_name}"
|
108
|
+
path = File.join(base_dir, "#{column_name}.groonga")
|
109
|
+
index_column = index_table.define_column(name, table,
|
110
|
+
:path => path,
|
111
|
+
:type => "index",
|
112
|
+
:compress => "zlib",
|
113
|
+
# :with_section => true,
|
114
|
+
# :with_weight => true,
|
115
|
+
:with_position => true)
|
116
|
+
index_column.source = column
|
117
|
+
|
118
|
+
record = index_management_table.add
|
119
|
+
record["table"] = groonga_table_name
|
120
|
+
record["column"] = column_name
|
121
|
+
record["index"] = name
|
122
|
+
end
|
123
|
+
|
124
|
+
def index_management_table
|
125
|
+
Base.context[groonga_index_management_table_name]
|
126
|
+
end
|
127
|
+
|
128
|
+
def index_table
|
129
|
+
Base.context[groonga_index_table_name]
|
130
|
+
end
|
131
|
+
|
132
|
+
def indexes(table_or_table_name)
|
133
|
+
if table_or_table_name.is_a?(String)
|
134
|
+
table_name = table_or_table_name
|
135
|
+
table = Base.context[Base.groonga_table_name(table_name)]
|
136
|
+
else
|
137
|
+
table = table_or_table_name
|
138
|
+
table_name = table.name.gsub(/(?:\A<table:|>\z)/, '')
|
139
|
+
end
|
140
|
+
indexes = []
|
141
|
+
index_management_table.records.each do |record|
|
142
|
+
next if record["table"] != table.name
|
143
|
+
indexes << IndexDefinition.new(table_name, record["index"],
|
144
|
+
false, record["column"])
|
145
|
+
end
|
146
|
+
indexes
|
147
|
+
end
|
148
|
+
|
149
|
+
private
|
150
|
+
def index_management_table_name
|
151
|
+
Base.table_name_prefix + 'indexes' + Base.table_name_suffix
|
152
|
+
end
|
153
|
+
|
154
|
+
def groonga_index_management_table_name
|
155
|
+
Base.groonga_metadata_table_name(index_management_table_name)
|
156
|
+
end
|
157
|
+
|
158
|
+
def index_table_name
|
159
|
+
Base.table_name_prefix + 'index' + Base.table_name_suffix
|
160
|
+
end
|
161
|
+
|
162
|
+
def groonga_index_table_name
|
163
|
+
Base.groonga_metadata_table_name(index_table_name)
|
164
|
+
end
|
165
|
+
|
166
|
+
def initialize_index_management_table
|
167
|
+
table_name = index_management_table_name
|
168
|
+
groonga_table_name = groonga_index_management_table_name
|
169
|
+
if Base.context[groonga_table_name].nil?
|
170
|
+
table_file = File.join(Base.metadata_directory,
|
171
|
+
"#{table_name}.groonga")
|
172
|
+
table = Groonga::Array.create(:name => groonga_table_name,
|
173
|
+
:path => table_file)
|
174
|
+
|
175
|
+
base_dir = File.join(Base.metadata_directory, table_name)
|
176
|
+
FileUtils.mkdir_p(base_dir)
|
177
|
+
|
178
|
+
column_file = File.join(base_dir, "table.groonga")
|
179
|
+
table.define_column("table", "<shorttext>", :path => column_file)
|
180
|
+
|
181
|
+
column_file = File.join(base_dir, "column.groonga")
|
182
|
+
table.define_column("column", "<shorttext>", :path => column_file)
|
183
|
+
|
184
|
+
column_file = File.join(base_dir, "index.groonga")
|
185
|
+
table.define_column("index", "<shorttext>", :path => column_file)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def initialize_index_table
|
190
|
+
table_name = index_table_name
|
191
|
+
groonga_table_name = groonga_index_table_name
|
192
|
+
if Base.context[groonga_table_name].nil?
|
193
|
+
table_file = File.join(Base.metadata_directory,
|
194
|
+
"#{table_name}.groonga")
|
195
|
+
table = Groonga::PatriciaTrie.create(:name => groonga_table_name,
|
196
|
+
:key_type => "<shorttext>",
|
197
|
+
# :key_with_sis => true,
|
198
|
+
# :key_normalize => true,
|
199
|
+
:path => table_file)
|
200
|
+
|
201
|
+
base_dir = File.join(Base.metadata_directory, table_name)
|
202
|
+
FileUtils.mkdir_p(base_dir)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def initialize_migrations_table
|
207
|
+
table_name = Migrator.schema_migrations_table_name
|
208
|
+
groonga_table_name = Migrator.groonga_schema_migrations_table_name
|
209
|
+
if Base.context[groonga_table_name].nil?
|
210
|
+
table_file = File.join(Base.metadata_directory,
|
211
|
+
"#{table_name}.groonga")
|
212
|
+
Groonga::Hash.create(:name => groonga_table_name,
|
213
|
+
:path => table_file,
|
214
|
+
:key_type => "<shorttext>")
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
|
220
|
+
undef_method :primary_key, :to_sql, :native
|
221
|
+
|
222
|
+
def initialize(name)
|
223
|
+
super(nil)
|
224
|
+
@name = name
|
225
|
+
@indexes = []
|
226
|
+
end
|
227
|
+
|
228
|
+
def create
|
229
|
+
table_file = File.join(Base.tables_directory, "#{@name}.groonga")
|
230
|
+
Groonga::Array.create(:name => Base.groonga_table_name(@name),
|
231
|
+
:path => table_file)
|
232
|
+
@columns.each(&:create)
|
233
|
+
@indexes.each do |column_name, options|
|
234
|
+
Schema.add_index(@name.to_s, column_name, options)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
def column(name, type, options={})
|
239
|
+
column = self[name] || ColumnDefinition.new(@name, name)
|
240
|
+
column.type = type
|
241
|
+
@columns << column unless @columns.include?(column)
|
242
|
+
self
|
243
|
+
end
|
244
|
+
|
245
|
+
def index(column_name, options={})
|
246
|
+
@indexes << [column_name.to_s, options]
|
247
|
+
end
|
248
|
+
|
249
|
+
def references(*args)
|
250
|
+
options = args.extract_options!
|
251
|
+
args.each do |col|
|
252
|
+
groonga_table_name = Base.groonga_table_name(col.to_s.pluralize)
|
253
|
+
table = Base.context[groonga_table_name]
|
254
|
+
column(col, table, options)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
alias :belongs_to :references
|
258
|
+
end
|
259
|
+
|
260
|
+
class ColumnDefinition
|
261
|
+
attr_accessor :name, :type
|
262
|
+
|
263
|
+
def initialize(table_name, name)
|
264
|
+
@table_name = table_name
|
265
|
+
@name = name
|
266
|
+
@name = @name.to_s if @name.is_a?(Symbol)
|
267
|
+
@type = nil
|
268
|
+
end
|
269
|
+
|
270
|
+
def create(options={})
|
271
|
+
column_file = File.join(Base.columns_directory(@table_name),
|
272
|
+
"#{@name}.groonga")
|
273
|
+
options = options.merge(:path => column_file)
|
274
|
+
table = Base.context[Base.groonga_table_name(@table_name)]
|
275
|
+
table.define_column(@name,
|
276
|
+
normalize_type(@type),
|
277
|
+
options)
|
278
|
+
end
|
279
|
+
|
280
|
+
def remove
|
281
|
+
Base.context[@name].remove
|
282
|
+
end
|
283
|
+
|
284
|
+
def normalize_type(type)
|
285
|
+
return type if type.is_a?(Groonga::Object)
|
286
|
+
case type.to_s
|
287
|
+
when "string"
|
288
|
+
"<shorttext>"
|
289
|
+
when "text"
|
290
|
+
"<text>"
|
291
|
+
when "integer"
|
292
|
+
"<int>"
|
293
|
+
when "float"
|
294
|
+
"<float>"
|
295
|
+
when "decimal"
|
296
|
+
"<int64>"
|
297
|
+
when "datetime", "timestamp", "time", "date"
|
298
|
+
"<time>"
|
299
|
+
when "binary"
|
300
|
+
"<longtext>"
|
301
|
+
when "boolean"
|
302
|
+
"<int>"
|
303
|
+
else
|
304
|
+
type
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
class IndexDefinition < ActiveRecord::ConnectionAdapters::IndexDefinition
|
310
|
+
alias_method :column, :columns
|
311
|
+
alias_method :column=, :columns=
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License version 2.1 as published by the Free Software Foundation.
|
6
|
+
#
|
7
|
+
# This library is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
10
|
+
# Lesser General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU Lesser General Public
|
13
|
+
# License along with this library; if not, write to the Free Software
|
14
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
|
+
|
16
|
+
module ActiveGroonga
|
17
|
+
class SchemaDumper < ActiveRecord::SchemaDumper
|
18
|
+
class << self
|
19
|
+
def dump(stream=STDOUT)
|
20
|
+
new.dump(StreamWrapper.new(stream))
|
21
|
+
stream
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize
|
26
|
+
@version = Migrator.current_version
|
27
|
+
end
|
28
|
+
|
29
|
+
def dump(stream)
|
30
|
+
@references = []
|
31
|
+
header(stream)
|
32
|
+
dump_tables(stream)
|
33
|
+
dump_references(stream)
|
34
|
+
trailer(stream)
|
35
|
+
stream
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def dump_tables(stream)
|
40
|
+
tables.sort.each do |name|
|
41
|
+
next if ignore_tables.any? {|ignored| ignored === name}
|
42
|
+
dump_table(name, stream)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def tables
|
47
|
+
Dir[File.join(Base.tables_directory, "*.groonga")].collect do |path|
|
48
|
+
File.basename(path, ".groonga")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def dump_table(name, stream)
|
53
|
+
begin
|
54
|
+
table_schema = StringIO.new
|
55
|
+
table_schema.puts " create_table #{name.inspect}, :force => true do |t|"
|
56
|
+
column_specs = []
|
57
|
+
columns(name).each do |column|
|
58
|
+
if column.reference_type?
|
59
|
+
@references << [name, column]
|
60
|
+
next
|
61
|
+
end
|
62
|
+
|
63
|
+
spec = {}
|
64
|
+
spec[:type] = column.type.to_s
|
65
|
+
spec[:name] = column.name.inspect
|
66
|
+
column_specs << spec
|
67
|
+
end
|
68
|
+
|
69
|
+
column_specs.each do |spec|
|
70
|
+
table_schema.print(" t.#{spec[:type]} #{spec[:name]}")
|
71
|
+
table_schema.puts
|
72
|
+
end
|
73
|
+
|
74
|
+
table_schema.puts " end"
|
75
|
+
table_schema.puts
|
76
|
+
|
77
|
+
dump_indexes(name, table_schema)
|
78
|
+
|
79
|
+
stream.print table_schema.string
|
80
|
+
rescue => e
|
81
|
+
stream.puts "# Could not dump table #{name.inspect} because of following #{e.class}"
|
82
|
+
stream.puts "# #{e.message}"
|
83
|
+
e.backtrace.each do |trace|
|
84
|
+
stream.puts "# #{trace}"
|
85
|
+
end
|
86
|
+
stream.puts
|
87
|
+
end
|
88
|
+
|
89
|
+
stream
|
90
|
+
end
|
91
|
+
|
92
|
+
def dump_indexes(table, stream)
|
93
|
+
_indexes = indexes(table)
|
94
|
+
return if _indexes.empty?
|
95
|
+
|
96
|
+
add_index_statements = _indexes.collect do |index|
|
97
|
+
statement_parts = []
|
98
|
+
statement_parts << "add_index #{index.table.inspect}"
|
99
|
+
statement_parts << index.columns.inspect
|
100
|
+
statement_parts << ":name => #{index.name.inspect}"
|
101
|
+
' ' + statement_parts.join(', ')
|
102
|
+
end
|
103
|
+
|
104
|
+
stream.puts add_index_statements.sort.join("\n")
|
105
|
+
stream.puts
|
106
|
+
end
|
107
|
+
|
108
|
+
def dump_references(stream)
|
109
|
+
@references.sort_by do |name, column|
|
110
|
+
[name, column.name]
|
111
|
+
end.each do |name, column|
|
112
|
+
statement = " add_column #{name.inspect}, "
|
113
|
+
statement << "#{column.name.inspect}, :references, "
|
114
|
+
statement << ":to => #{column.reference_object_name.inspect}"
|
115
|
+
stream.puts(statement)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def columns(table_name)
|
120
|
+
table_name = Base.groonga_table_name(table_name)
|
121
|
+
Base.context[table_name].columns.collect {|column| Column.new(column)}
|
122
|
+
end
|
123
|
+
|
124
|
+
def indexes(table_name)
|
125
|
+
Schema.indexes(table_name)
|
126
|
+
end
|
127
|
+
|
128
|
+
class StreamWrapper
|
129
|
+
def initialize(stream)
|
130
|
+
@stream = stream
|
131
|
+
end
|
132
|
+
|
133
|
+
def method_missing(name, *args, &block)
|
134
|
+
@stream.send(name, *args.collect {|arg| normalize_string(arg)}, &block)
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
def normalize_string(string)
|
139
|
+
if string.is_a?(String)
|
140
|
+
string.gsub(/Active ?Record/, "ActiveGroonga")
|
141
|
+
else
|
142
|
+
string
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|