mongo3 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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
  });