dbbrowser 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c03dfe89bdee6580f1ed6421d66fd4558895428f
4
+ data.tar.gz: 85da6c87bcc2876d87c76b589d5366038f2f717e
5
+ SHA512:
6
+ metadata.gz: df5bdb91c09985a18a113b0e6c84f6797633b19b973a3bbe524dd773d55599265277ec69785dc398b9af568aa3f3f82a4868f78648931e2c6b5209cbcf8e9d83
7
+ data.tar.gz: 30d2eda5dc410f0347366228296be179afbace07ff96fceff8adcfc8b61d2d4a6dc2f24d88e6752fdadc18ad490a8f93ae2a730978f0e329a62eda5117c69e00
@@ -3,7 +3,6 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  lib/dbbrowser.rb
6
- lib/dbbrowser/connection.rb
7
6
  lib/dbbrowser/public/jquery-2.0.3.min.js
8
7
  lib/dbbrowser/public/jquery.tabs.js
9
8
  lib/dbbrowser/public/style.css
data/README.md CHANGED
@@ -14,7 +14,7 @@ database browser (connections, schema, tables, records, etc.) as mountable web a
14
14
  In your rack configuration (`config.ru`) mount the databrowser app; add the line:
15
15
 
16
16
  ~~~
17
- map '/browse' { run DbBrowser::Server }
17
+ map('/browse') { run DbBrowser::Server }
18
18
  ~~~
19
19
 
20
20
 
data/Rakefile CHANGED
@@ -18,14 +18,17 @@ Hoe.spec 'dbbrowser' do
18
18
  self.history_file = 'History.md'
19
19
 
20
20
  self.extra_deps = [
21
- ['logutils', '>= 0.5']
21
+ ## ['logutils', '>= 0.5'], # already part of textutils - remove ???
22
+ ['textutils'],
23
+ ['activerecord'],
24
+ ['activerecord-utils', '>= 0.4.0'],
25
+ ['sinatra']
22
26
  ]
23
27
 
24
28
  self.licenses = ['Public Domain']
25
29
 
26
30
  self.spec_extras = {
27
- :required_ruby_version => '>= 1.9.2'
31
+ required_ruby_version: '>= 1.9.2'
28
32
  }
29
33
 
30
-
31
- end
34
+ end
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
 
2
4
  require 'pp'
3
5
 
@@ -7,18 +9,15 @@ require 'pp'
7
9
  require 'textutils'
8
10
 
9
11
  require 'active_record'
12
+ require 'activerecord/utils' ## pull in browser support
10
13
 
11
14
 
12
15
  # our own code
13
16
 
14
17
  require 'dbbrowser/version' # let it always go first
15
- require 'dbbrowser/connection'
16
18
 
17
- module DbBrowser
18
19
 
19
- def self.root
20
- "#{File.expand_path( File.dirname(File.dirname(__FILE__)) )}"
21
- end
20
+ module DbBrowser
22
21
 
23
22
 
24
23
  ### helper for DATABASE_URL for ActiveRecord
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
 
2
3
 
3
4
  # 3rd party libs/gems
@@ -25,7 +26,7 @@ class Server < Sinatra::Base
25
26
  set :static, true # set up static file routing
26
27
 
27
28
 
28
- set :man, ConnectionMan.new
29
+ set :browser, ActiveRecordUtils::Browser.new
29
30
 
30
31
  #################
31
32
  # Helpers
@@ -73,7 +74,7 @@ class Server < Sinatra::Base
73
74
  end
74
75
 
75
76
  def render_tables_for( key, opts={} )
76
- con = settings.man.connection_for( key )
77
+ con = settings.browser.connection_for( key )
77
78
  erb( 'shared/_tables'.to_sym,
78
79
  layout: false,
79
80
  locals: { tables: con.tables } )
@@ -103,7 +104,7 @@ class Server < Sinatra::Base
103
104
  end
104
105
 
105
106
  get '/db/:key/:table_name' do |key,table_name|
106
- con = settings.man.connection_for( key )
107
+ con = settings.browser.connection_for( key )
107
108
  table = con.table( table_name )
108
109
 
109
110
  query_opts = {}
@@ -118,7 +119,7 @@ class Server < Sinatra::Base
118
119
  end
119
120
 
120
121
  get '/db/:key' do |key|
121
- con = settings.man.connection_for( key )
122
+ con = settings.browser.connection_for( key )
122
123
  erb :db, locals: { key: key, tables: con.tables, con: con }
123
124
  end
124
125
 
@@ -1,4 +1,13 @@
1
+ # encoding: utf-8
1
2
 
2
3
  module DbBrowser
3
- VERSION = '0.1.3'
4
+
5
+ VERSION = '0.2.0'
6
+
7
+ def self.root
8
+ "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
9
+ end
10
+
4
11
  end
12
+
13
+
metadata CHANGED
@@ -1,63 +1,114 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbbrowser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Gerald Bauer
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-11-01 00:00:00.000000000 Z
11
+ date: 2015-02-04 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: logutils
16
- requirement: &73390850 !ruby/object:Gem::Requirement
17
- none: false
14
+ name: textutils
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: '0.5'
19
+ version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *73390850
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord-utils
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.4.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: sinatra
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
25
69
  - !ruby/object:Gem::Dependency
26
70
  name: rdoc
27
- requirement: &73390620 !ruby/object:Gem::Requirement
28
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
29
72
  requirements:
30
- - - ~>
73
+ - - "~>"
31
74
  - !ruby/object:Gem::Version
32
- version: '3.10'
75
+ version: '4.0'
33
76
  type: :development
34
77
  prerelease: false
35
- version_requirements: *73390620
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.0'
36
83
  - !ruby/object:Gem::Dependency
37
84
  name: hoe
38
- requirement: &73390260 !ruby/object:Gem::Requirement
39
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
40
86
  requirements:
41
- - - ~>
87
+ - - "~>"
42
88
  - !ruby/object:Gem::Version
43
- version: '3.3'
89
+ version: '3.13'
44
90
  type: :development
45
91
  prerelease: false
46
- version_requirements: *73390260
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.13'
47
97
  description: dbbrowser - database browser (connections, schema, tables, records, etc.)
48
98
  as mountable web app
49
99
  email: webslideshow@googlegroups.com
50
100
  executables: []
51
101
  extensions: []
52
102
  extra_rdoc_files:
103
+ - History.md
53
104
  - Manifest.txt
105
+ - README.md
54
106
  files:
55
107
  - History.md
56
108
  - Manifest.txt
57
109
  - README.md
58
110
  - Rakefile
59
111
  - lib/dbbrowser.rb
60
- - lib/dbbrowser/connection.rb
61
112
  - lib/dbbrowser/public/jquery-2.0.3.min.js
62
113
  - lib/dbbrowser/public/jquery.tabs.js
63
114
  - lib/dbbrowser/public/style.css
@@ -76,29 +127,28 @@ files:
76
127
  homepage: https://github.com/rubylibs/dbbrowser
77
128
  licenses:
78
129
  - Public Domain
130
+ metadata: {}
79
131
  post_install_message:
80
132
  rdoc_options:
81
- - --main
133
+ - "--main"
82
134
  - README.md
83
135
  require_paths:
84
136
  - lib
85
137
  required_ruby_version: !ruby/object:Gem::Requirement
86
- none: false
87
138
  requirements:
88
- - - ! '>='
139
+ - - ">="
89
140
  - !ruby/object:Gem::Version
90
141
  version: 1.9.2
91
142
  required_rubygems_version: !ruby/object:Gem::Requirement
92
- none: false
93
143
  requirements:
94
- - - ! '>='
144
+ - - ">="
95
145
  - !ruby/object:Gem::Version
96
146
  version: '0'
97
147
  requirements: []
98
- rubyforge_project: dbbrowser
99
- rubygems_version: 1.8.17
148
+ rubyforge_project:
149
+ rubygems_version: 2.4.2
100
150
  signing_key:
101
- specification_version: 3
151
+ specification_version: 4
102
152
  summary: dbbrowser - database browser (connections, schema, tables, records, etc.)
103
153
  as mountable web app
104
154
  test_files: []
@@ -1,275 +0,0 @@
1
- module DbBrowser
2
-
3
- class ConnectionMan # connection manager
4
-
5
- # get connection names
6
- # def connection_names
7
- # ActiveRecord::Base.configurations.keys
8
- # end
9
-
10
- CONNECTS = {} # cache connections
11
-
12
- def connection_for( key )
13
- # cache connections - needed? why? why not??
14
-
15
- # hack: for now only use cached connection if still active
16
- # if not; get a new one to avoid connection closed errors in rails
17
- con = CONNECTS[ key ]
18
- if con
19
- puts "[ConnectionMan] cached connection found; con.active? #{con.active?}"
20
- unless con.active?
21
- puts "[ConnectionMan] *** reset cached connection (reason: connection stale/closed/not active)"
22
- con = CONNECTS[ key ] = nil
23
- end
24
- end
25
-
26
- if con.nil?
27
- con = CONNECTS[ key ] = AbstractModel.connection_for( key )
28
- end
29
-
30
- # note: make sure connection is active?
31
- # use verify! - will try active? followed by reconnect!
32
- # - todo: check ourselves if active? - why? why not??
33
- # -- not working w/ rails - after verify! still getting error w/ closed connection
34
- # -- con.verify!
35
-
36
- # wrap ActiveRecord connection in our own connection class
37
- Connection.new( con, key )
38
- end
39
-
40
-
41
- class AbstractModel < ActiveRecord::Base
42
- self.abstract_class = true # no table; class just used for getting db connection
43
-
44
- def self.connection_for( key )
45
- establish_connection( key )
46
- connection
47
- end
48
-
49
- end # class AbstractModel
50
-
51
-
52
- class Connection
53
-
54
- def initialize( connection, key )
55
- @connection = connection
56
- @key = key
57
- end
58
-
59
- attr_reader :connection
60
- attr_reader :key
61
-
62
- delegate :select_value, :select_all, :adapter_name,
63
- :to => :connection
64
-
65
- def class_name
66
- @connection.class.name
67
- end
68
-
69
- # delegate :quote_table_name, :quote_column_name, :quote,
70
- # :update, :insert, :delete,
71
- # :add_limit_offset!,
72
- # :to => :connection
73
-
74
- def tables
75
- @tables ||= fetch_table_defs
76
- end
77
-
78
- def table( name )
79
- tables.find { |t| t.name.downcase == name.downcase }
80
- end
81
-
82
- # getting list of column definitions
83
- # and order them to be more human readable
84
- def table_columns( name )
85
- cols = fetch_table_column_defs( name )
86
- ### fix/to be done
87
- # cols.sort_by{|col|
88
- # [
89
- # fields_to_head.index(col.name) || 1e6,
90
- # -(fields_to_tail.index(col.name) || 1e6),
91
- # col.name
92
- # ]
93
- # }
94
- cols
95
- end
96
-
97
- def fetch_table_defs
98
- @connection.tables.sort.map do |name|
99
- Table.new( self, name )
100
- end
101
- end
102
-
103
- def fetch_table_column_defs( name )
104
- ### fix/todo: add reference to table_def
105
- @connection.columns( name ).map do |col|
106
- Column.new( col.name, col.sql_type, col.default, col.null )
107
- end
108
- end
109
-
110
-
111
- def fetch_table_select_all( name, opts={} )
112
- limit = (opts[:limit] || 33).to_i # 33 records limit/per page (for now default)
113
- limit = 33 if limit == 0 # use default page size if limit 0 (from not a number para)
114
-
115
- offset = (opts[:offset] || 0).to_i
116
-
117
- sql = "select * from #{name} limit #{limit}"
118
-
119
- sql << " offset #{offset}" if offset > 0 # add offset if present (e.g greater zero)
120
-
121
- # page = (opts[:page] || 1 ).try(:to_i)
122
- # fields = opts[:fields] || nil
123
-
124
- # rez = { :fields => fields }
125
- # if sql =~ /\s*select/i && per_page > 0
126
- # rez[:count] = select_value("select count(*) from (#{sql}) as t").to_i
127
- # rez[:pages] = (rez[:count].to_f / per_page).ceil
128
- # sql = "select * from (#{sql}) as t"
129
- # add_limit_offset!( sql,
130
- # :limit => per_page,
131
- # :offset => per_page * (page - 1))
132
- # end
133
-
134
- result = {}
135
- result[ :sql ] = sql # note: lets also always add sql query to result too
136
- result[ :rows ] = select_all( sql )
137
-
138
- # unless rez[:rows].blank?
139
- # rez[:fields] ||= []
140
- # rez[:fields].concat( self.sort_fields(rez[:rows].first.keys) - rez[:fields] )
141
- # end
142
-
143
- Result.new( result )
144
- rescue StandardError => ex
145
- Result.new( error: ex )
146
- end # fetch_table
147
-
148
-
149
- =begin
150
- def column_names(table)
151
- columns(table).map{|c| c.name}
152
- end
153
-
154
- # fields to see first
155
- def fields_to_head
156
- @fields_to_head ||= %w{id name login value}
157
- end
158
-
159
- # fields to see last
160
- def fields_to_tail
161
- @fields_to_tail ||= %w{created_at created_on updated_at updated_on}
162
- end
163
-
164
- attr_writer :fields_to_head, :fields_to_tail
165
-
166
- # sort field names in a rezult
167
- def sort_fields(fields)
168
- fields = (fields_to_head & fields) | (fields - fields_to_head)
169
- fields = (fields - fields_to_tail) | (fields_to_tail & fields)
170
- fields
171
- end
172
-
173
- # performs query with appropriate method
174
- def query(sql, opts={})
175
- per_page = (opts[:perpage] || nil).to_i
176
- page = (opts[:page] || 1 ).try(:to_i)
177
- fields = opts[:fields] || nil
178
- case sql
179
- when /\s*select/i , /\s*(update|insert|delete).+returning/im
180
- rez = {:fields => fields}
181
- if sql =~ /\s*select/i && per_page > 0
182
- rez[:count] = select_value("select count(*) from (#{sql}) as t").to_i
183
- rez[:pages] = (rez[:count].to_f / per_page).ceil
184
- sql = "select * from (#{sql}) as t"
185
- add_limit_offset!( sql,
186
- :limit => per_page,
187
- :offset => per_page * (page - 1))
188
- end
189
-
190
- rez[:rows] = select_all( sql )
191
-
192
- unless rez[:rows].blank?
193
- rez[:fields] ||= []
194
- rez[:fields].concat( self.sort_fields(rez[:rows].first.keys) - rez[:fields] )
195
- end
196
-
197
- Result.new(rez)
198
- when /\s*update/i
199
- Result.new :value => update( sql )
200
- when /\s*insert/i
201
- Result.new :value => insert( sql )
202
- when /\s*delete/i
203
- Result.new :value => delete( sql )
204
- end
205
- rescue StandardError => e
206
- Result.new :error => e
207
- end
208
-
209
- =end
210
-
211
- end # class Connection
212
-
213
-
214
- class Table
215
-
216
- def initialize(connection, name)
217
- @connection = connection
218
- @name = name
219
- end
220
-
221
- attr_reader :connection
222
- attr_reader :name
223
-
224
- def count
225
- @connection.select_value( "select count(*) from #{name}").to_i
226
- end
227
-
228
- def columns
229
- # load columns on demand for now (cache on first lookup)
230
- @columns ||= @connection.table_columns( @name )
231
- end
232
-
233
- def query( opts={})
234
- @connection.fetch_table_select_all( @name, opts )
235
- end
236
-
237
- end # class Table
238
-
239
-
240
- class Column
241
- def initialize(name, type, default, null)
242
- @name = name
243
- @type = type # note: is sql_type
244
- @default = default
245
- @null = null # note: true|false depending if NOT NULL or not
246
- end
247
-
248
- attr_reader :name, :type, :default, :null
249
- end # class Column
250
-
251
-
252
- class Result
253
- def initialize( opts={} )
254
- @sql = opts[:sql] # sql statement as a string
255
-
256
- if opts[:error]
257
- @error = opts[:error]
258
- else
259
- @rows = opts[:rows]
260
- # @count = opts[:count] || @rows.size
261
- # @pages = opts[:pages] || 1
262
- # @fields = opts[:fields]
263
- end
264
- end
265
-
266
- attr_reader :sql, :rows, :error ### to be done :count, :pages, :fields,
267
-
268
- def error?() @error.present?; end
269
- def rows?() @rows != nil; end
270
- end # class Result
271
-
272
-
273
- end # class ConnectionMan
274
-
275
- end # module DbBrowser