mongo3 0.0.5 → 0.0.6

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.
Files changed (57) hide show
  1. data/README.rdoc +6 -2
  2. data/Rakefile +1 -0
  3. data/data/populate +13 -11
  4. data/lib/controllers/databases.rb +3 -3
  5. data/lib/controllers/explore.rb +7 -5
  6. data/lib/helpers/main_helper.rb +24 -0
  7. data/lib/mongo3/connection.rb +105 -59
  8. data/lib/mongo3/node.rb +35 -6
  9. data/lib/mongo3.rb +1 -1
  10. data/lib/public/javascripts/{Jit/jit.js → jit.js} +0 -0
  11. data/lib/views/databases/_results.erb +29 -12
  12. data/lib/views/explore/explore.erb +52 -31
  13. data/lib/views/layout.erb +2 -6
  14. data/spec/mongo3/connection_spec.rb +40 -6
  15. metadata +13 -45
  16. data/lib/public/javascripts/Jit/Examples/Hypertree/example1.html +0 -57
  17. data/lib/public/javascripts/Jit/Examples/Hypertree/example1.js +0 -427
  18. data/lib/public/javascripts/Jit/Examples/Hypertree/example2.html +0 -58
  19. data/lib/public/javascripts/Jit/Examples/Hypertree/example2.js +0 -310
  20. data/lib/public/javascripts/Jit/Examples/Hypertree/example3.html +0 -199
  21. data/lib/public/javascripts/Jit/Examples/Hypertree/example3.js +0 -615
  22. data/lib/public/javascripts/Jit/Examples/Other/example1.html +0 -58
  23. data/lib/public/javascripts/Jit/Examples/Other/example1.js +0 -566
  24. data/lib/public/javascripts/Jit/Examples/Other/example2.html +0 -58
  25. data/lib/public/javascripts/Jit/Examples/Other/example2.js +0 -304
  26. data/lib/public/javascripts/Jit/Examples/Other/example3.html +0 -58
  27. data/lib/public/javascripts/Jit/Examples/Other/example3.js +0 -304
  28. data/lib/public/javascripts/Jit/Examples/RGraph/example1.html +0 -57
  29. data/lib/public/javascripts/Jit/Examples/RGraph/example1.js +0 -475
  30. data/lib/public/javascripts/Jit/Examples/RGraph/example2.html +0 -58
  31. data/lib/public/javascripts/Jit/Examples/RGraph/example2.js +0 -356
  32. data/lib/public/javascripts/Jit/Examples/RGraph/example3.html +0 -199
  33. data/lib/public/javascripts/Jit/Examples/RGraph/example3.js +0 -622
  34. data/lib/public/javascripts/Jit/Examples/Spacetree/example1.html +0 -91
  35. data/lib/public/javascripts/Jit/Examples/Spacetree/example1.js +0 -890
  36. data/lib/public/javascripts/Jit/Examples/Spacetree/example2.html +0 -90
  37. data/lib/public/javascripts/Jit/Examples/Spacetree/example2.js +0 -213
  38. data/lib/public/javascripts/Jit/Examples/Spacetree/example3.html +0 -75
  39. data/lib/public/javascripts/Jit/Examples/Spacetree/example3.js +0 -863
  40. data/lib/public/javascripts/Jit/Examples/Treemap/example1.html +0 -56
  41. data/lib/public/javascripts/Jit/Examples/Treemap/example1.js +0 -95
  42. data/lib/public/javascripts/Jit/Examples/Treemap/example2.html +0 -61
  43. data/lib/public/javascripts/Jit/Examples/Treemap/example2.js +0 -750
  44. data/lib/public/javascripts/Jit/Examples/Treemap/example3.html +0 -62
  45. data/lib/public/javascripts/Jit/Examples/Treemap/example3.js +0 -775
  46. data/lib/public/javascripts/Jit/Examples/css/Hypertree.css +0 -0
  47. data/lib/public/javascripts/Jit/Examples/css/Other.css +0 -8
  48. data/lib/public/javascripts/Jit/Examples/css/RGraph.css +0 -0
  49. data/lib/public/javascripts/Jit/Examples/css/Spacetree.css +0 -0
  50. data/lib/public/javascripts/Jit/Examples/css/Treemap.css +0 -78
  51. data/lib/public/javascripts/Jit/Examples/css/base.css +0 -106
  52. data/lib/public/javascripts/Jit/Examples/css/col1.png +0 -0
  53. data/lib/public/javascripts/Jit/Examples/css/col2.png +0 -0
  54. data/lib/public/javascripts/Jit/Examples/css/gradient.png +0 -0
  55. data/lib/public/javascripts/Jit/Extras/excanvas.js +0 -35
  56. data/lib/public/javascripts/Jit/jit-yc.js +0 -1
  57. data/lib/public/javascripts/Jit-1.1.3.zip +0 -0
data/README.rdoc CHANGED
@@ -31,8 +31,11 @@
31
31
 
32
32
  * Provide support for db authentication [done]
33
33
  * Ability to drilldown in collections and query for content [done]
34
- * CRUD on dbs, collections, indexes, users
35
- * Support for managing shards and replication
34
+ * CRUD on dbs, collections, indexes [done]
35
+ * Administer users
36
+ * Collection rename
37
+ * Manage logs
38
+ * Support for shards and replication
36
39
 
37
40
  == DEPENDENCIES
38
41
 
@@ -41,6 +44,7 @@
41
44
  * mongo + mongo_ext
42
45
  * agnostic-will_paginate
43
46
  * memcache-client
47
+ * sinatra
44
48
 
45
49
  == INSTALL:
46
50
 
data/Rakefile CHANGED
@@ -33,4 +33,5 @@ PROJ.rdoc.include = %w[.rb]
33
33
  depend_on "mongo" , ">= 0.18.1"
34
34
  depend_on "mongo_ext" , ">= 0.18.1"
35
35
  depend_on "agnostic-will_paginate", ">= 3.0.0"
36
+ depend_on "memcache-client" , ">= 1.5.0"
36
37
 
data/data/populate CHANGED
@@ -7,20 +7,22 @@ connection = Mongo::Connection.new( 'localhost', 27019 )
7
7
  # db.authenticate( 'admin', 'admin')
8
8
 
9
9
  db_name = "fernand_mdb"
10
- cltn_name = "blee"
10
+ cltn_names = %w[blee bobo]
11
11
 
12
12
 
13
13
  db = connection.db( db_name )
14
14
 
15
- cltn = db.create_collection( cltn_name )
16
- cltn.remove
15
+ cltn_names.each do |cltn_name|
16
+ cltn = db.create_collection( cltn_name )
17
+ cltn.remove
17
18
 
18
- 20.times do |i|
19
- row = { :name => "fred_#{i}", :last_name => "Blee_#{i}" }
20
- puts "Inserting row #{row.inspect}"
21
- cltn.insert( row )
22
- end
19
+ 20.times do |i|
20
+ row = { :name => "#{cltn_name}_#{i}", :last_name => "#{db_name}.#{cltn_name}_#{i}" }
21
+ puts "Inserting row #{row.inspect}"
22
+ cltn.insert( row )
23
+ end
23
24
 
24
- cltn = db[cltn_name]
25
- puts ""
26
- puts "Inserted `#{cltn.count} records in `#{cltn_name}"
25
+ cltn = db[cltn_name]
26
+ puts ""
27
+ puts "Inserted `#{cltn.count} records in `#{cltn_name}"
28
+ end
@@ -33,10 +33,10 @@ module Databases
33
33
  # ---------------------------------------------------------------------------
34
34
  post "/databases/delete/" do
35
35
  path = params[:path]
36
+
37
+ options.connection.drop_cltn( session[:path_names] + "|" + path )
36
38
 
37
- options.connection.drop_cltn( path )
38
-
39
- flash_it!( :info, "Collection #{path.split('|').last} was dropped successfully!" )
39
+ flash_it!( :info, "Collection #{path} was dropped successfully!" )
40
40
 
41
41
  @cltns = options.connection.paginate_db( session[:path_names], 1, 10 )
42
42
 
@@ -16,12 +16,14 @@ module Explore
16
16
 
17
17
  # -----------------------------------------------------------------------------
18
18
  get '/explore' do
19
- @root = options.connection.build_tree
20
- @nodes = @root.children
19
+ root = options.connection.build_tree
20
+ @root = root.to_adjacencies
21
+ @nodes = root.children
21
22
 
22
23
  reset_crumbs!
23
24
  reset_paths!
24
-
25
+
26
+ # Mongo3::Node.dump_adj( @root )
25
27
  erb :'explore/explore'
26
28
  end
27
29
 
@@ -66,11 +68,11 @@ module Explore
66
68
 
67
69
  crumbs_from_path( path_ids, path_names )
68
70
 
69
- root = options.connection.build_sub_tree( parent_id, path_names )
71
+ root = options.connection.build_sub_tree( parent_id, path_names )
70
72
  @sub_tree = root.to_adjacencies
71
73
  @node_id = @sub_tree.first[:id]
72
74
  @nodes = root.children
73
-
75
+ # Mongo3::Node.dump_adj( @sub_tree )
74
76
  erb :'explore/more_data_js', :layout => false
75
77
  end
76
78
 
@@ -1,6 +1,30 @@
1
1
  module MainHelper
2
2
  helpers do
3
3
 
4
+ def stylesheets( styles )
5
+ buff = []
6
+ styles.each do |style|
7
+ buff << "<link rel=\"stylesheet\" href=\"#{v_styles( style )}\" type=\"text/css\" media=\"screen\" />"
8
+ end
9
+ buff.join( "\n" )
10
+ end
11
+
12
+ def javascripts( scripts )
13
+ buff = []
14
+ scripts.each do |script|
15
+ buff << "<script src=\"#{v_js( script )}\" type=\"text/javascript\"></script>"
16
+ end
17
+ buff.join( "\n" )
18
+ end
19
+
20
+ def v_styles(stylesheet)
21
+ "/stylesheets/#{stylesheet}.css?" + File.mtime(File.join(Sinatra::Application.public, "stylesheets", "#{stylesheet}.css")).to_i.to_s
22
+ end
23
+
24
+ def v_js(js)
25
+ "/javascripts/#{js}.js?" + File.mtime(File.join(Sinatra::Application.public, "javascripts", "#{js}.js")).to_i.to_s
26
+ end
27
+
4
28
  def zone_locator
5
29
  locator = session[:path_names].split( "|" )[1]
6
30
  "<p class=\"ctx\"><span>zone</span>#{locator}</p>"
@@ -8,16 +8,16 @@ module Mongo3
8
8
  # drop a database using context and db name
9
9
  def drop_database( path_names, db_name )
10
10
  path_name_tokens = path_names.split( "|" )
11
- env = path_name_tokens[1]
12
- connect_for( env ) do |con|
11
+ zone = path_name_tokens[1]
12
+ connect_for( zone ) do |con|
13
13
  con.drop_database( db_name )
14
14
  end
15
15
  end
16
16
 
17
17
  def drop_db( path_names )
18
18
  path_name_tokens = path_names.split( "|" )
19
- env = path_name_tokens[1]
20
- connect_for( env ) do |con|
19
+ zone = path_name_tokens[1]
20
+ connect_for( zone ) do |con|
21
21
  db_name = path_name_tokens.pop
22
22
  con.drop_database( db_name )
23
23
  end
@@ -25,9 +25,9 @@ module Mongo3
25
25
 
26
26
  def indexes_for( path_names )
27
27
  path_name_tokens = path_names.split( "|" )
28
- env = path_name_tokens[1]
28
+ zone = path_name_tokens[1]
29
29
  indexes = {}
30
- connect_for( env ) do |con|
30
+ connect_for( zone ) do |con|
31
31
  cltn_name = path_name_tokens.pop
32
32
  db_name = path_name_tokens.pop
33
33
  db = con.db( db_name )
@@ -39,8 +39,8 @@ module Mongo3
39
39
 
40
40
  def drop_index( path_names, index )
41
41
  path_name_tokens = path_names.split( "|" )
42
- env = path_name_tokens[1]
43
- connect_for( env ) do |con|
42
+ zone = path_name_tokens[1]
43
+ connect_for( zone ) do |con|
44
44
  cltn_name = path_name_tokens.pop
45
45
  db_name = path_name_tokens.pop
46
46
  db = con.db( db_name )
@@ -51,8 +51,8 @@ module Mongo3
51
51
 
52
52
  def create_index( path_names, index, constraints )
53
53
  path_name_tokens = path_names.split( "|" )
54
- env = path_name_tokens[1]
55
- connect_for( env ) do |con|
54
+ zone = path_name_tokens[1]
55
+ connect_for( zone ) do |con|
56
56
  cltn_name = path_name_tokens.pop
57
57
  db_name = path_name_tokens.pop
58
58
  db = con.db( db_name )
@@ -63,8 +63,8 @@ module Mongo3
63
63
 
64
64
  def drop_cltn( path_names )
65
65
  path_name_tokens = path_names.split( "|" )
66
- env = path_name_tokens[1]
67
- connect_for( env ) do |con|
66
+ zone = path_name_tokens[1]
67
+ connect_for( zone ) do |con|
68
68
  cltn_name = path_name_tokens.pop
69
69
  db_name = path_name_tokens.pop
70
70
  db = con.db( db_name )
@@ -75,8 +75,8 @@ module Mongo3
75
75
 
76
76
  def clear_cltn( path_names )
77
77
  path_name_tokens = path_names.split( "|" )
78
- env = path_name_tokens[1]
79
- connect_for( env ) do |con|
78
+ zone = path_name_tokens[1]
79
+ connect_for( zone ) do |con|
80
80
  cltn_name = path_name_tokens.pop
81
81
  db_name = path_name_tokens.pop
82
82
  db = con.db( db_name )
@@ -87,8 +87,8 @@ module Mongo3
87
87
 
88
88
  def delete_row( path_names, id )
89
89
  path_name_tokens = path_names.split( "|" )
90
- env = path_name_tokens[1]
91
- connect_for( env ) do |con|
90
+ zone = path_name_tokens[1]
91
+ connect_for( zone ) do |con|
92
92
  cltn_name = path_name_tokens.pop
93
93
  db_name = path_name_tokens.pop
94
94
  db = con.db( db_name )
@@ -100,12 +100,12 @@ module Mongo3
100
100
  def show( path_names )
101
101
  path_name_tokens = path_names.split( "|" )
102
102
  info = OrderedHash.new
103
- env = path_name_tokens[1]
103
+ zone = path_name_tokens[1]
104
104
 
105
105
  info[:title] = path_name_tokens.last
106
106
  if path_name_tokens.size == 2
107
- connect_for( env ) do |con|
108
- info[:name] = env
107
+ connect_for( zone ) do |con|
108
+ info[:name] = zone
109
109
  info[:host] = con.host
110
110
  info[:port] = con.port
111
111
  info[:databases] = OrderedHash.new
@@ -116,7 +116,7 @@ module Mongo3
116
116
  elsif path_name_tokens.size == 3
117
117
  db_name = path_name_tokens.pop
118
118
  info[:links] = OrderedHash.new
119
- connect_for( env ) do |con|
119
+ connect_for( zone ) do |con|
120
120
  db = con.db( db_name )
121
121
  info[:links][:manage] = "/databases/1"
122
122
  # info[:links][:drop] = "/databases/drop/"
@@ -130,7 +130,7 @@ module Mongo3
130
130
  info[:links] = OrderedHash.new
131
131
  cltn_name = path_name_tokens.pop
132
132
  db_name = path_name_tokens.pop
133
- connect_for( env ) do |con|
133
+ connect_for( zone ) do |con|
134
134
  db = con.db( db_name )
135
135
  cltn = db[cltn_name]
136
136
  indexes = db.index_information( cltn_name )
@@ -146,9 +146,9 @@ module Mongo3
146
146
 
147
147
  def paginate_db( path_names, page=1, per_page=10 )
148
148
  path_name_tokens = path_names.split( "|" )
149
- env = path_name_tokens[1]
149
+ zone = path_name_tokens[1]
150
150
  list = nil
151
- connect_for( env ) do |con|
151
+ connect_for( zone ) do |con|
152
152
  db_name = path_name_tokens.pop
153
153
  db = con.db( db_name )
154
154
  cltn = collection_names(db).sort
@@ -172,9 +172,9 @@ module Mongo3
172
172
 
173
173
  def paginate_cltn( path_names, query_params=[{},[]], page=1, per_page=10 )
174
174
  path_name_tokens = path_names.split( "|" )
175
- env = path_name_tokens[1]
175
+ zone = path_name_tokens[1]
176
176
  list = nil
177
- connect_for( env ) do |con|
177
+ connect_for( zone ) do |con|
178
178
  cltn_name = path_name_tokens.pop
179
179
  db_name = path_name_tokens.pop
180
180
  db = con.db( db_name )
@@ -194,48 +194,85 @@ module Mongo3
194
194
  list
195
195
  end
196
196
 
197
- # Fetch the environment landscape from the config file
197
+ # Fetch the cluster landscape from the config file
198
198
  def landscape
199
199
  config
200
200
  end
201
201
 
202
- # Build environment tree
202
+ # Build zone tree
203
203
  def build_tree
204
204
  root = Node.make_node( "home" )
205
205
 
206
- # iterate thru envs
207
- id = 1
208
- config.each_pair do |env, info|
209
- node = Node.new( env, env, :dyna => true )
206
+ # iterate thru zones
207
+ adjacencies = {}
208
+ config.each_pair do |zone, info|
209
+ node = Node.new( zone, zone, :dyna => true )
210
210
  root << node
211
- id += 1
211
+ adjs = adjacencies[zone]
212
+ if adjs
213
+ node.mark_master!
214
+ adjs.each { |n| node << n }
215
+ end
216
+ masters = slave?( zone )
217
+ next if masters.empty?
218
+
219
+ node.mark_slave!
220
+ masters.each do |master|
221
+ host, port = master.split( ":" )
222
+ master_zone = zone_for( host, port )
223
+ next unless master_zone
224
+ master_node = root.find( "home|#{master_zone}")
225
+ if master_node
226
+ master_node.mark_master!
227
+ master_node << node
228
+ else
229
+ adjacencies[master_zone] = [] unless adjacencies[master_zone]
230
+ adjacencies[master_zone] << node
231
+ end
232
+ end
212
233
  end
213
234
  root
214
235
  end
215
-
216
- # Build environment tree
236
+
237
+ def slave?( zone )
238
+ masters = []
239
+ connect_for( zone ) do |con|
240
+ local = con.db( "local", :strict => true )
241
+ return masters unless local
242
+ begin
243
+ sources = local['sources']
244
+ srcs = sources.find( {}, :fields => [:host] )
245
+ srcs.each{ |src| masters << src['host'] }
246
+ rescue => boom
247
+ ;
248
+ end
249
+ end
250
+ masters
251
+ end
252
+
253
+ # Build zone tree
217
254
  def build_partial_tree( path_names )
218
255
  path_name_tokens = path_names.split( "|" )
219
- bm_env = path_name_tokens[1]
256
+ bm_zone = path_name_tokens[1]
220
257
  bm_cltn = path_name_tokens.pop if path_name_tokens.size == 4
221
258
  bm_db = path_name_tokens.pop if path_name_tokens.size == 3
222
259
 
223
260
  root = Node.make_node( "home" )
224
261
 
225
- # iterate thru envs
226
- config.each_pair do |env, info|
227
- node = Node.new( env, env, :dyna => true )
262
+ # iterate thru zones
263
+ config.each_pair do |zone, info|
264
+ node = Node.new( zone, zone, :dyna => true )
228
265
  root << node
229
266
 
230
- next unless node.name == bm_env
267
+ next unless node.name == bm_zone
231
268
 
232
- connect_for( env ) do |con|
269
+ connect_for( zone ) do |con|
233
270
  count = 0
234
271
  data = { :dyna => true }
235
272
  database_names( con ).each do |db_name|
236
273
  db = con.db( db_name, :strict => true )
237
274
  cltns = collection_names( db )
238
- db_node = Node.new( "#{env}_#{count}", "#{db_name}(#{cltns.size})", data.clone )
275
+ db_node = Node.new( "#{zone}_#{count}", "#{db_name}(#{cltns.size})", data.clone )
239
276
  node << db_node
240
277
  count += 1
241
278
  if bm_db and db_node.name =~ /^#{bm_db}/
@@ -257,24 +294,24 @@ module Mongo3
257
294
  # Build an appropriate subtree based on requested item
258
295
  def build_sub_tree( parent_id, path_names )
259
296
  path_name_tokens = path_names.split( "|" )
260
- env = path_name_tokens[1]
297
+ zone = path_name_tokens[1]
261
298
 
262
299
  if db_request?( path_name_tokens )
263
- sub_tree = build_db_tree( parent_id, env )
300
+ sub_tree = build_db_tree( parent_id, zone )
264
301
  else
265
302
  db_name = path_name_tokens.last
266
- sub_tree = build_cltn_tree( parent_id, env, db_name )
303
+ sub_tree = build_cltn_tree( parent_id, zone, db_name )
267
304
  end
268
305
  sub_tree
269
306
  end
270
307
 
271
308
  # Connects to host and spews out all available dbs
272
309
  # BOZO !! Need to deal with Auth?
273
- def build_db_tree( parent_id, env )
310
+ def build_db_tree( parent_id, zone )
274
311
  sub_root = nil
275
- connect_for( env ) do |con|
276
- root = Node.make_node( "home" )
277
- sub_root = Node.new( parent_id, env )
312
+ connect_for( zone ) do |con|
313
+ root = Node.make_node( "home" )
314
+ sub_root = Node.new( parent_id, zone )
278
315
 
279
316
  root << sub_root
280
317
 
@@ -283,7 +320,7 @@ module Mongo3
283
320
  database_names( con ).each do |db_name|
284
321
  db = con.db( db_name, :strict => true )
285
322
  cltns = collection_names( db ).size
286
- node = Node.new( "#{env}_#{count}", "#{db_name}(#{cltns})", data.clone )
323
+ node = Node.new( "#{zone}_#{count}", "#{db_name}(#{cltns})", data.clone )
287
324
  sub_root << node
288
325
  count += 1
289
326
  end
@@ -292,15 +329,15 @@ module Mongo3
292
329
  end
293
330
 
294
331
  # Show collections
295
- def build_cltn_tree( parent_id, env, db_name )
332
+ def build_cltn_tree( parent_id, zone, db_name )
296
333
  sub_root = nil
297
- connect_for( env ) do |con|
334
+ connect_for( zone ) do |con|
298
335
  db = con.db( db_name )
299
336
  root = Node.make_node( "home" )
300
- env_node = Node.make_node( env )
337
+ zone_node = Node.make_node( zone )
301
338
  sub_root = Node.new( parent_id, db_name )
302
- root << env_node
303
- env_node << sub_root
339
+ root << zone_node
340
+ zone_node << sub_root
304
341
 
305
342
  count = 0
306
343
  data = { :dyna => false }
@@ -328,17 +365,17 @@ module Mongo3
328
365
  con.database_names - excludes
329
366
  end
330
367
 
331
- # Connects to mongo given an environment
368
+ # Connects to mongo given an zone
332
369
  # BOZO !! Auth...
333
- def connect_for( env, &block )
334
- info = landscape[env]
335
- puts ">>> Connecting for #{env} -- #{info['host']}-#{info['port']}"
370
+ def connect_for( zone, &block )
371
+ info = landscape[zone]
372
+ # puts ">>> Connecting for #{zone} -- #{info['host']}-#{info['port']}"
336
373
  con = Mongo::Connection.new( info['host'], info['port'], { :slave_ok => true } )
337
374
 
338
375
  if info['user'] and info['password']
339
376
  con.db( 'admin' ).authenticate( info['user'], info['password'] )
340
377
  end
341
- yield con
378
+ yield con
342
379
  con.close()
343
380
  end
344
381
 
@@ -376,9 +413,18 @@ module Mongo3
376
413
  numb.to_s.gsub(/(\d)(?=\d{3}+(\.\d*)?$)/, '\1,')
377
414
  end
378
415
 
416
+ # find zone matching the host and port combination
417
+ def zone_for( host, port )
418
+ config.each_pair do |zone, info|
419
+ return zone if info['host'] == host and info['port'] == port.to_i
420
+ end
421
+ nil
422
+ end
423
+
379
424
  # Initialize the mongo installation landscape
380
425
  def config
381
426
  unless @config
427
+ puts ">>>> Loading config from file"
382
428
  @config = YAML.load_file( @config_file )
383
429
  end
384
430
  @config
data/lib/mongo3/node.rb CHANGED
@@ -17,6 +17,28 @@ module Mongo3
17
17
  Node.new( name, name, :path_ids => name, :path_names => name )
18
18
  end
19
19
 
20
+ def mark_slave!
21
+ data[:slave] = true
22
+ data['$lineWidth'] = 3
23
+ data['$color'] = "#434343"
24
+ data['$dim'] = 15
25
+ end
26
+
27
+ def mark_master!
28
+ data[:master] = true
29
+ data['$color'] = '#92b948'
30
+ data['$dim'] = 15
31
+ data['$lineWidth'] = 3
32
+ end
33
+
34
+ def master?
35
+ data.has_key?( :master )
36
+ end
37
+
38
+ def slave?
39
+ data.has_key?( :slave )
40
+ end
41
+
20
42
  # Add a child node
21
43
  def <<( new_one )
22
44
  new_one.parent = self
@@ -38,15 +60,22 @@ module Mongo3
38
60
 
39
61
  # convert a tree node to a set of adjacencies
40
62
  def to_adjacencies
41
- root_level = { :id => self.oid, :name => self.name, :data => self.data, :adjacencies => [] }
42
- cltn = [ root_level ]
43
- self.children.each do |child|
44
- root_level[:adjacencies] << child.oid
45
- cltn << { :id => child.oid, :name => child.name, :data => child.data, :adjacencies => [] }
46
- end
63
+ cltn = []
64
+ _to_adjacencies( self, cltn )
47
65
  cltn
48
66
  end
49
67
 
68
+ def _to_adjacencies( node, cltn )
69
+ node_level = { :id => node.oid, :name => node.name, :data => node.data, :adjacencies => [] }
70
+ cltn << node_level
71
+ node.children.each do |child|
72
+ node_level[:adjacencies] << child.oid
73
+ _to_adjacencies( child, cltn )
74
+ # cltn << { :id => child.oid, :name => child.name, :data => child.data, :adjacencies => [] }
75
+ end
76
+ # cltn
77
+ end
78
+
50
79
  # converts to json
51
80
  def to_json(*a)
52
81
  hash = OrderedHash.new
data/lib/mongo3.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  module Mongo3
3
3
 
4
4
  # :stopdoc:
5
- VERSION = '0.0.5'
5
+ VERSION = '0.0.6'
6
6
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
7
7
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
8
8
  # :startdoc:
File without changes
@@ -14,10 +14,9 @@
14
14
  </thead>
15
15
  <tbody>
16
16
  <% count = 0; @cltns.each do |cltn| %>
17
- <% path = "#{session[:path_names]}|#{cltn[:name]}"%>
18
17
  <tr id="<%=count%>" valign="top">
19
18
  <td id="<%=count%>">
20
- <img class="delete" id="<%=path%>" rel="<%=count%>" src="/images/delete.png" title="drop this collection"/>
19
+ <img rel="div#confirm_drop" class="drop" id="<%=cltn[:name]%>" rel="<%=count%>" src="/images/delete.png" title="drop this collection" style="display:none"/>
21
20
  <img class="wait" id="wait_<%=count%>" src="/images/loading.gif"></img>
22
21
  </td>
23
22
  <td><a href="/databases/collection/<%=cltn[:name]%>/"><%= cltn[:name] %></a></td>
@@ -34,27 +33,45 @@
34
33
  <div class="no_items">Oh snap! No collections found...</span>
35
34
  <% end %>
36
35
 
36
+ <div class="modal" id="confirm_drop" style="font-size:1em">
37
+ <p>Dropping collection. Are you sure?</p>
38
+ <p style="margin:10px">
39
+ <button class="close yes">Yes</button>
40
+ <button class="close">No</button>
41
+ </p>
42
+ </div>
43
+
37
44
  <script>
38
45
  $( function() {
39
46
  $("table#cltn tr" ).hover(
40
47
  function() {
41
48
  $(this).addClass( 'highlight' );
42
- $("td#" + $(this).attr('id') + " img.delete" ).show();
49
+ $("td#" + $(this).attr('id') + " img.drop" ).show();
43
50
  },
44
51
  function() {
45
52
  $(this).removeClass( 'highlight' );
46
- $("td#" + $(this).attr('id') + " img.delete" ).hide();
47
- });
48
- $( "img.delete" ).click( function() {
49
- var id = $(this).attr('id');
50
- var count = $(this).attr('rel')
53
+ $("td#" + $(this).attr('id') + " img.drop" ).hide();
54
+ });
55
+
56
+ $('img.drop' ).overlay( {
57
+ expose: {
58
+ color: '#212021',
59
+ loadSpeed: 200,
60
+ opacity: 0.9
61
+ },
62
+ onBeforeLoad: function() {
63
+ $("button.yes").attr( 'id', this.getTrigger().attr('id') );
64
+ },
65
+ closeOnClick: false
66
+ });
67
+
68
+ $( 'button.yes' ).click( function() {
69
+ var self = $(this);
51
70
  $.ajax({
52
- data: {path: id},
71
+ data: {path:self.attr('id')},
53
72
  dataType: 'script',
54
73
  type: 'post',
55
- url: '/databases/delete/',
56
- beforeSend: function() { $('img#_wait_' + count ).show(); },
57
- complete: function() { $('img#_wait_' + count ).hide(); }
74
+ url: '/databases/delete/'
58
75
  });
59
76
  });
60
77
  });