groonga-database-viewer-gtk 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/NEWS.md +9 -0
- data/lib/groonga/database-viewer-gtk.rb +2 -2
- data/lib/groonga/database-viewer-gtk/table.rb +125 -0
- data/lib/groonga/database-viewer-gtk/version.rb +1 -1
- data/lib/groonga/database-viewer-gtk/window.rb +13 -108
- data/test/test-window.rb +5 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a123ff921e425f0c0c97ba55f8f92c05c04d45b
|
4
|
+
data.tar.gz: 7aafad21070d426840271ffb2621641f10e1d172
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 305720b3522cc67da8a962388a9aafd0afe607b23abcaaeed99d0f3525c780bf4d3a4b7bcaeb5a7733e868692541fc009c9875a56bd25766c577abad6916b7a2
|
7
|
+
data.tar.gz: f3ca5901a8172848aa7e9f37e2cc4c01f57b055f33f4715e78ecc4038c393e35c290c1cdc92cbfb637eee559ad35e222d434aad0cffe24b48c4cd3a51bd6fcf5
|
data/NEWS.md
CHANGED
@@ -14,5 +14,5 @@
|
|
14
14
|
# License along with this library; if not, write to the Free Software
|
15
15
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
16
|
|
17
|
-
require "groonga/
|
18
|
-
require "groonga/
|
17
|
+
require "groonga/database-viewer-gtk/version"
|
18
|
+
require "groonga/database-viewer-gtk/window"
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# Copyright (C) 2014 Masafumi Yokoyama <myokoym@gmail.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 as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
require "groonga"
|
18
|
+
require "gtk2"
|
19
|
+
|
20
|
+
module Groonga
|
21
|
+
module DatabaseViewerGtk
|
22
|
+
class Table < Gtk::TreeView
|
23
|
+
ID_COLUMN_INDEX = 0
|
24
|
+
KEY_COLUMN_INDEX = 1
|
25
|
+
|
26
|
+
attr_reader :updated
|
27
|
+
attr_reader :grn_table
|
28
|
+
|
29
|
+
def initialize(grn_table, db_path)
|
30
|
+
super()
|
31
|
+
@grn_table = grn_table
|
32
|
+
@db_path = db_path
|
33
|
+
@updated = false
|
34
|
+
@threads = []
|
35
|
+
signal_connect("destroy") do
|
36
|
+
@threads.each do |thread|
|
37
|
+
thread.kill
|
38
|
+
end
|
39
|
+
end
|
40
|
+
create_tree_view
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_tree_view
|
44
|
+
self.rules_hint = true
|
45
|
+
|
46
|
+
create_column("_id", ID_COLUMN_INDEX)
|
47
|
+
create_column("_key", KEY_COLUMN_INDEX)
|
48
|
+
|
49
|
+
@grn_table.columns.each_with_index do |grn_column, i|
|
50
|
+
create_column(grn_column.local_name, i + 2)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_column(name, index)
|
55
|
+
gtk_column = Gtk::TreeViewColumn.new
|
56
|
+
gtk_column.title = name.gsub(/_/, "__")
|
57
|
+
gtk_column.resizable = true
|
58
|
+
gtk_column.set_sort_column_id(index)
|
59
|
+
append_column(gtk_column)
|
60
|
+
|
61
|
+
renderer = Gtk::CellRendererText.new
|
62
|
+
gtk_column.pack_start(renderer, :expand => false)
|
63
|
+
gtk_column.add_attribute(renderer, :text, index)
|
64
|
+
end
|
65
|
+
|
66
|
+
def update_model(limit, query=nil)
|
67
|
+
@threads.reject! do |thread|
|
68
|
+
thread.kill
|
69
|
+
true
|
70
|
+
end
|
71
|
+
|
72
|
+
column_types = @grn_table.columns.collect do |column|
|
73
|
+
# TODO
|
74
|
+
String
|
75
|
+
end
|
76
|
+
column_types.unshift(String) # _key
|
77
|
+
column_types.unshift(Integer) # _id
|
78
|
+
|
79
|
+
model = Gtk::ListStore.new(*column_types)
|
80
|
+
self.model = model
|
81
|
+
|
82
|
+
thread = Thread.new do
|
83
|
+
each_records(limit, query).each do |grn_record|
|
84
|
+
load_record(model, grn_record)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
@threads << thread
|
88
|
+
|
89
|
+
@updated = true
|
90
|
+
end
|
91
|
+
|
92
|
+
def load_record(model, grn_record)
|
93
|
+
iter = model.append
|
94
|
+
iter.set_value(ID_COLUMN_INDEX, grn_record._id)
|
95
|
+
iter.set_value(KEY_COLUMN_INDEX, grn_record._key) if grn_record.respond_to?(:_key)
|
96
|
+
@grn_table.columns.each_with_index do |grn_column, i|
|
97
|
+
value = grn_record[grn_column.local_name]
|
98
|
+
iter.set_value(i + 2, value.to_s)
|
99
|
+
if grn_column.index?
|
100
|
+
ids = grn_column.search(grn_record._id).records.collect {|record| record._id}
|
101
|
+
value = "#{ids.size}, #{ids.to_s}"
|
102
|
+
else
|
103
|
+
value = grn_record[grn_column.local_name].to_s
|
104
|
+
end
|
105
|
+
iter.set_value(2 + i, value)
|
106
|
+
GC.start if i % 100 == 0
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def each_records(limit, query=nil)
|
111
|
+
grn_records = Groonga[@grn_table.name]
|
112
|
+
if query
|
113
|
+
grn_records = grn_records.select(query)
|
114
|
+
end
|
115
|
+
if block_given?
|
116
|
+
grn_records.take(limit).each do |grn_record|
|
117
|
+
yield(grn_record)
|
118
|
+
end
|
119
|
+
else
|
120
|
+
grn_records.take(limit)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -17,11 +17,16 @@
|
|
17
17
|
require "groonga"
|
18
18
|
require "gtk2"
|
19
19
|
|
20
|
+
require "groonga/database-viewer-gtk/table"
|
21
|
+
|
20
22
|
module Groonga
|
21
23
|
module DatabaseViewerGtk
|
22
24
|
class Window < Gtk::Window
|
25
|
+
RAW_QUERY_MODE = "--query"
|
26
|
+
|
23
27
|
def initialize(db_path)
|
24
28
|
super()
|
29
|
+
self.title = db_path
|
25
30
|
set_default_size(640, 480)
|
26
31
|
@grn_database = Database.open(db_path)
|
27
32
|
signal_connect("destroy") do
|
@@ -44,6 +49,7 @@ module Groonga
|
|
44
49
|
Gtk.main
|
45
50
|
end
|
46
51
|
|
52
|
+
private
|
47
53
|
def init_view(page_num)
|
48
54
|
target = get_tree_view(page_num)
|
49
55
|
return unless target
|
@@ -55,6 +61,8 @@ module Groonga
|
|
55
61
|
def select(column, word)
|
56
62
|
if word.empty?
|
57
63
|
query = nil
|
64
|
+
elsif column == RAW_QUERY_MODE
|
65
|
+
query = word
|
58
66
|
elsif column == "_id"
|
59
67
|
query = "#{column}:#{word}"
|
60
68
|
else
|
@@ -70,7 +78,7 @@ module Groonga
|
|
70
78
|
page_widget = @notebook.children[page_num]
|
71
79
|
if page_widget.is_a?(Gtk::ScrolledWindow)
|
72
80
|
page_widget.each do |child|
|
73
|
-
if child.is_a?(
|
81
|
+
if child.is_a?(Table)
|
74
82
|
return child
|
75
83
|
end
|
76
84
|
end
|
@@ -78,7 +86,6 @@ module Groonga
|
|
78
86
|
return nil
|
79
87
|
end
|
80
88
|
|
81
|
-
private
|
82
89
|
def create_search_hbox
|
83
90
|
hbox = Gtk::HBox.new
|
84
91
|
|
@@ -103,7 +110,7 @@ module Groonga
|
|
103
110
|
@limit_combo.append_text(text)
|
104
111
|
end
|
105
112
|
@limit_combo.append_text("268,435,455")
|
106
|
-
@limit_combo.active =
|
113
|
+
@limit_combo.active = 2
|
107
114
|
hbox.pack_end(@limit_combo, false, false, 4)
|
108
115
|
|
109
116
|
label = Gtk::Label.new("Limit:")
|
@@ -124,6 +131,7 @@ module Groonga
|
|
124
131
|
target.grn_table.columns.each do |column|
|
125
132
|
@combo_box.append_text(column.local_name)
|
126
133
|
end
|
134
|
+
@combo_box.append_text(RAW_QUERY_MODE)
|
127
135
|
@combo_box.active = 1
|
128
136
|
end
|
129
137
|
end
|
@@ -138,8 +146,8 @@ module Groonga
|
|
138
146
|
scrolled_window = Gtk::ScrolledWindow.new
|
139
147
|
scrolled_window.set_policy(:automatic, :automatic)
|
140
148
|
|
141
|
-
|
142
|
-
scrolled_window.add(
|
149
|
+
table = Table.new(grn_table, @grn_database.path)
|
150
|
+
scrolled_window.add(table)
|
143
151
|
|
144
152
|
label = Gtk::Label.new(grn_table.name)
|
145
153
|
notebook.append_page(scrolled_window, label)
|
@@ -153,108 +161,5 @@ module Groonga
|
|
153
161
|
notebook
|
154
162
|
end
|
155
163
|
end
|
156
|
-
|
157
|
-
class TreeView < Gtk::TreeView
|
158
|
-
ID_COLUMN_INDEX = 0
|
159
|
-
KEY_COLUMN_INDEX = 1
|
160
|
-
|
161
|
-
attr_reader :updated
|
162
|
-
attr_reader :grn_table
|
163
|
-
|
164
|
-
def initialize(grn_table, db_path)
|
165
|
-
super()
|
166
|
-
@grn_table = grn_table
|
167
|
-
@db_path = db_path
|
168
|
-
@updated = false
|
169
|
-
@threads = []
|
170
|
-
signal_connect("destroy") do
|
171
|
-
@threads.each do |thread|
|
172
|
-
thread.kill
|
173
|
-
end
|
174
|
-
end
|
175
|
-
create_tree_view
|
176
|
-
end
|
177
|
-
|
178
|
-
def create_tree_view
|
179
|
-
self.rules_hint = true
|
180
|
-
|
181
|
-
create_column("_id", ID_COLUMN_INDEX)
|
182
|
-
create_column("_key", KEY_COLUMN_INDEX)
|
183
|
-
|
184
|
-
@grn_table.columns.each_with_index do |grn_column, i|
|
185
|
-
create_column(grn_column.local_name, i + 2)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
def create_column(name, index)
|
190
|
-
gtk_column = Gtk::TreeViewColumn.new
|
191
|
-
gtk_column.title = name.gsub(/_/, "__")
|
192
|
-
gtk_column.resizable = true
|
193
|
-
gtk_column.set_sort_column_id(index)
|
194
|
-
append_column(gtk_column)
|
195
|
-
|
196
|
-
renderer = Gtk::CellRendererText.new
|
197
|
-
gtk_column.pack_start(renderer, :expand => false)
|
198
|
-
gtk_column.add_attribute(renderer, :text, index)
|
199
|
-
end
|
200
|
-
|
201
|
-
def update_model(limit, query=nil)
|
202
|
-
@threads.reject! do |thread|
|
203
|
-
thread.kill
|
204
|
-
true
|
205
|
-
end
|
206
|
-
|
207
|
-
column_types = @grn_table.columns.collect do |column|
|
208
|
-
# TODO
|
209
|
-
String
|
210
|
-
end
|
211
|
-
column_types.unshift(String) # _key
|
212
|
-
column_types.unshift(Integer) # _id
|
213
|
-
|
214
|
-
model = Gtk::ListStore.new(*column_types)
|
215
|
-
self.model = model
|
216
|
-
|
217
|
-
thread = Thread.new do
|
218
|
-
each_records(limit, query).each do |grn_record|
|
219
|
-
load_record(model, grn_record)
|
220
|
-
end
|
221
|
-
end
|
222
|
-
@threads << thread
|
223
|
-
|
224
|
-
@updated = true
|
225
|
-
end
|
226
|
-
|
227
|
-
def load_record(model, grn_record)
|
228
|
-
iter = model.append
|
229
|
-
iter.set_value(ID_COLUMN_INDEX, grn_record._id)
|
230
|
-
iter.set_value(KEY_COLUMN_INDEX, grn_record._key) if grn_record.respond_to?(:_key)
|
231
|
-
@grn_table.columns.each_with_index do |grn_column, i|
|
232
|
-
value = grn_record[grn_column.local_name]
|
233
|
-
iter.set_value(i + 2, value.to_s)
|
234
|
-
if grn_column.index?
|
235
|
-
ids = grn_column.search(grn_record._id).records.collect {|record| record._id}
|
236
|
-
value = "#{ids.size}, #{ids.to_s}"
|
237
|
-
else
|
238
|
-
value = grn_record[grn_column.local_name].to_s
|
239
|
-
end
|
240
|
-
iter.set_value(2 + i, value)
|
241
|
-
GC.start if i % 100 == 0
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
def each_records(limit, query=nil)
|
246
|
-
grn_records = Groonga[@grn_table.name]
|
247
|
-
if query
|
248
|
-
grn_records = grn_records.select(query)
|
249
|
-
end
|
250
|
-
if block_given?
|
251
|
-
grn_records.take(limit).each do |grn_record|
|
252
|
-
yield(grn_record)
|
253
|
-
end
|
254
|
-
else
|
255
|
-
grn_records.take(limit)
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
259
164
|
end
|
260
165
|
end
|
data/test/test-window.rb
CHANGED
@@ -26,6 +26,11 @@ class WindowTest < Test::Unit::TestCase
|
|
26
26
|
FileUtils.mkdir_p(@tmpdir)
|
27
27
|
@db_path = File.join(@tmpdir, "test.db")
|
28
28
|
Groonga::Database.create(:path => @db_path)
|
29
|
+
Groonga::Schema.define do |schema|
|
30
|
+
schema.create_table("Texts", :type => :hash) do |table|
|
31
|
+
table.text("text")
|
32
|
+
end
|
33
|
+
end
|
29
34
|
end
|
30
35
|
|
31
36
|
def teardown
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: groonga-database-viewer-gtk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masafumi Yokoyama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rroonga
|
@@ -109,6 +109,7 @@ files:
|
|
109
109
|
- bin/groonga-database-viewer-gtk
|
110
110
|
- groonga-database-viewer-gtk.gemspec
|
111
111
|
- lib/groonga/database-viewer-gtk.rb
|
112
|
+
- lib/groonga/database-viewer-gtk/table.rb
|
112
113
|
- lib/groonga/database-viewer-gtk/version.rb
|
113
114
|
- lib/groonga/database-viewer-gtk/window.rb
|
114
115
|
- test/run-test.rb
|