old_sql 1.26.0 → 1.27.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,28 +1,22 @@
1
- # Old SQL
1
+ # Old SQL [pronounced /skuːl/]
2
2
 
3
3
  Old SQL is a Rails Engine database reporting gem that uses plain old SQL.
4
4
 
5
- Some features of Old SQL are:
6
-
7
- * Reports can be created using little or no Ruby code.
8
- - SQL for the report to be designed by a DBA, or other database developer independent of Ruby.
9
- - Reports can be designed using a design file that mocks the reports. This file can contain data
10
- from the SQL, as well as String literals, and formulas (that can also use numeric literals).
11
- - The design documents, which are nothing more than CSV files, can also serve as documentation,
12
- and describe the layout of the report in an intuitive way.
13
- - If you want more fine grained control, a custom report processor can parse the SQL.
14
- - Simple to convert legacy reports into Old SQL reports.
15
- * Multiple report views (jqGrid, HTML table, and chart).
16
- * Bar and Pie charts using Google Charts.
17
- * In the report design all data is rounded to a precision that can be set in the old_sql initializer.
18
- This feature can also be disabled in the initializer.
19
- * Old SQL has rake tasks for running the reports and outputting the result as CSV. This can simplify testing.
20
- It also allows reports to be run as a cron task.
21
- * The look of Old SQL can be customized.
22
- * Support for printing and exporting to CSV.
23
- * Old SQL uses Devise for authentication, and will install it for you. It can
24
- even add Devise support to an existing model (by default users).
5
+ * Write reports in plain old SQL with little or no coding.
6
+ * Layout reports using CSV and YAML.
7
+ * Reports can be displayed using jqGrid, plain HTML, or as a chart (using the Google Charts API).
8
+ * Automatic rounding of all values. Can be controlled via an initializer.
9
+ * Rake tasks for running reports from the command line.
10
+ * Devise for authentication. Which is installed and configured for you using the old_sql
11
+ generator._
12
+ * Printing and exporting to CSV.
25
13
  * Support for multiple database connections.
14
+ * Interface for running Ad hoc queries.
15
+
16
+ ## Coming Soon
17
+
18
+ * Schema browser
19
+ * Google docs integration
26
20
 
27
21
  ## Quick Setup and Demo
28
22
 
@@ -12,83 +12,105 @@ module OldSql
12
12
  helper_method :strip_html
13
13
  helper_method :chart_type
14
14
  helper_method :chart_data
15
+ helper_method :db_list
15
16
 
16
17
  layout "old_sql/report.html.erb"
17
-
18
+
18
19
  BASE_PROCESSOR = "base"
19
20
 
20
21
  def index
21
22
  @report_view = OldSql.default_report_view
22
23
  end
23
-
24
+
24
25
  def jqgrid
25
26
  @start_date = params[:start_date]
26
27
  @end_date = params[:end_date]
27
28
  @report_name = params[:report]
28
29
  @report_sql = params[:report_sql]
30
+ @query = params[:query]
31
+ @db = params[:db]
32
+ @caption = params[:caption]
33
+ w = params[:w]
29
34
 
30
35
  #todo allow these to be overridden in the report config
31
36
  @row_num = OldSql.jqgrid_row_num
32
- @width = OldSql.report_width
37
+ @width = w.nil? ? OldSql.report_width : w
33
38
  @height = OldSql.report_height
34
-
35
- render :template => "old_sql/report/datagrid.html.erb"
39
+
40
+ render :template => "old_sql/report/jqgrid.html.erb"
36
41
  end
37
-
42
+
38
43
  def table
39
44
  @start_date = params[:start_date]
40
45
  @end_date = params[:end_date]
41
46
  @report_name = params[:report]
42
47
  @report_sql = params[:report_sql].downcase
43
48
  @report_sql_orig = params[:report_sql].downcase
44
-
49
+
45
50
  @width = OldSql.report_width
46
51
  @height = OldSql.report_height
47
-
52
+
48
53
  processor = load_base_processor
49
54
  @report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
50
-
55
+
51
56
  render :template => "old_sql/report/table.html.erb"
52
57
  end
53
-
58
+
54
59
  def chart
55
60
  @start_date = params[:start_date]
56
61
  @end_date = params[:end_date]
57
62
  @report_name = params[:report]
58
63
  @report_sql = params[:report_sql].downcase
59
64
  @report_sql_orig = params[:report_sql].downcase
60
-
65
+
61
66
  @width = 800
62
67
  @height = 500
63
68
  @google_chart_colors = google_chart_colors
64
-
69
+
65
70
  processor = load_base_processor
66
71
  @report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
67
-
72
+
68
73
  render :layout => 'old_sql/chart.html.erb', :template => "old_sql/report/chart.html.erb"
69
74
  end
70
-
71
- def query
75
+
76
+ def print
72
77
  @start_date = params[:start_date]
73
78
  @end_date = params[:end_date]
74
79
  @report_name = params[:report]
80
+ @desc = params[:desc]
75
81
  @report_sql = params[:report_sql].downcase
76
82
  @report_sql_orig = params[:report_sql].downcase
77
-
83
+
78
84
  processor = load_base_processor
79
85
  @report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
80
-
86
+
87
+ render :template => "old_sql/report/print.html.erb"
88
+ end
89
+
90
+ #ajax call
91
+ def query
92
+ start_date = params[:start_date]
93
+ end_date = params[:end_date]
94
+ report_name = params[:report]
95
+ report_sql = params[:report_sql].downcase
96
+ report_sql_orig = params[:report_sql].downcase
97
+ query = params[:query]
98
+ db = params[:db]
99
+
100
+ @processor = load_base_processor
101
+ report = @processor.execute_query(@reports[report_name],start_date,end_date,query_vars(report_name),query,db)
102
+
81
103
  respond_to do |format|
82
- format.json { render :json => @report.to_json}
83
- format.xml { render :xml => @report.to_xml }
104
+ format.json { render :json => report.to_json}
105
+ format.xml { render :xml => report.to_xml }
84
106
  format.csv {
85
107
  csv_string = CSV.generate do |csv|
86
108
  # header row
87
- csv << ['Start Date', @start_date,'End Date', @end_date]
88
- csv << @reports[@report_name]['fields']
109
+ csv << ['Start Date', start_date,'End Date', end_date]
110
+ csv << @reports[report_name]['fields']
89
111
 
90
112
  # data rows
91
- @report[:rows].each do |row|
113
+ report[:rows].each do |row|
92
114
  rec = []
93
115
  row[:cell].each do |cell|
94
116
  rec << strip_html(cell.to_s).gsub("\n","")
@@ -98,113 +120,112 @@ module OldSql
98
120
  end
99
121
 
100
122
  send_data csv_string,
101
- :type => 'text/csv; charset=iso-8859-1; header=present',
102
- :disposition => "attachment; filename=#{@report_sql}_#{@start_date.gsub(' ','_')}_#{@end_date.gsub(' ','_')}.csv"
123
+ :type => 'text/csv; charset=iso-8859-1; header=present',
124
+ :disposition => "attachment; filename=#{report_sql}_#{start_date.gsub(' ','_')}_#{end_date.gsub(' ','_')}.csv"
103
125
  }
104
126
  end
105
127
  end
106
-
107
- def print
108
- @start_date = params[:start_date]
109
- @end_date = params[:end_date]
110
- @report_name = params[:report]
111
- @desc = params[:desc]
112
- @report_sql = params[:report_sql].downcase
113
- @report_sql_orig = params[:report_sql].downcase
114
-
115
- processor = load_base_processor
116
- @report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
117
-
118
- render :template => "old_sql/report/print.html.erb"
119
- end
120
-
128
+
121
129
 
122
130
  private
123
- def ensure_old_sql_admin!
124
- render_error(Exception.new "Old SQL Access Denied.") unless eval("current_user.old_sql_admin?")
125
- end
126
-
127
- def _init
128
- @host = self.request.host
129
- @port = self.request.port
130
- end
131
-
132
- def _reports
133
- template = File.read("#{Rails.root}/config/old_sql/reports.yml")
134
- @reports = YAML.load(Erubis::Eruby.new(template).result)
135
- end
136
-
137
- def load_base_processor
138
- require "old_sql/report_processor/base"
139
- OldSql::ReportProcessor::Base.new
140
- end
141
-
142
- def jqgrid_col_model
143
- @fields = []
144
- field_num = 1
145
-
146
- # [
147
- # {name:'id',index:'id', width:55},
148
- # {name:'invdate',index:'invdate', width:90, editable:true},
149
- # {name:'name',index:'name', width:100,editable:true},
150
- # {name:'amount',index:'amount', width:80, align:"right",editable:true},
151
- # {name:'tax',index:'tax', width:80, align:"right",editable:true},
152
- # {name:'total',index:'total', width:80,align:"right",editable:true},
153
- # {name:'note',index:'note', width:150, sortable:false,editable:true}
154
- # ]
155
-
156
- @reports[@report_name]['fields'].each do |field|
157
- if field_num == 1
158
- @fields << { :name=>field }
159
- else
160
- @fields << { :name=>field, :align=>"center" }
161
- end
162
- field_num+=1
163
- end
164
-
165
- @fields.to_json.html_safe
166
- end
167
-
168
- def jqgrid_col_names
169
- logger.info @reports
170
- logger.info "REPORT NAME #{@report_name}"
171
- json = @reports[@report_name]['fields'].to_json
172
- json.html_safe
173
- end
174
-
175
- def query_vars report
176
- query_vars = @reports[report]['query_vars']
177
- if !query_vars.nil? && query_vars.size > 0
178
- return query_vars[0]
131
+ def ensure_old_sql_admin!
132
+ render_error(Exception.new "Old SQL Access Denied.") unless eval("current_user.old_sql_admin?")
133
+ end
134
+
135
+ def _init
136
+ @host = self.request.host
137
+ @port = self.request.port
138
+ end
139
+
140
+ def _reports
141
+ template = File.read("#{Rails.root}/config/old_sql/reports.yml")
142
+ @reports = YAML.load(Erubis::Eruby.new(template).result)
143
+ end
144
+
145
+ def load_base_processor
146
+ require "old_sql/report_processor/base"
147
+ OldSql::ReportProcessor::Base.new
148
+ end
149
+
150
+ def jqgrid_col_model
151
+ @fields = []
152
+ field_num = 1
153
+
154
+ # [
155
+ # {name:'id',index:'id', width:55},
156
+ # {name:'invdate',index:'invdate', width:90, editable:true},
157
+ # {name:'name',index:'name', width:100,editable:true},
158
+ # {name:'amount',index:'amount', width:80, align:"right",editable:true},
159
+ # {name:'tax',index:'tax', width:80, align:"right",editable:true},
160
+ # {name:'total',index:'total', width:80,align:"right",editable:true},
161
+ # {name:'note',index:'note', width:150, sortable:false,editable:true}
162
+ # ]
163
+
164
+ qf = query_fields
165
+ return if qf.nil?
166
+
167
+ qf.each do |field|
168
+ if field_num == 1
169
+ @fields << { :name=>field }
179
170
  else
180
- return nil
171
+ @fields << { :name=>field, :align=>"center" }
181
172
  end
173
+ field_num+=1
182
174
  end
183
-
184
- def render_error(exception)
185
- logger.error(exception)
186
- render :template => "old_sql/errors/401.html.erb", :status => 401
187
- end
188
-
189
- def strip_html html
190
- OldSql.strip_html html
191
- end
192
-
193
- def chart_data
194
- return nil if @report.nil?
195
- json = @report.values.first.to_json
196
- json.html_safe
197
- end
198
-
199
- def chart_type
200
- return nil if @report.nil?
201
- @report.keys.first
202
- end
203
-
204
- def google_chart_colors
205
- json = OldSql.google_chart_colors.to_json
206
- json.html_safe
175
+
176
+ @fields.to_json.html_safe
177
+ end
178
+
179
+ def jqgrid_col_names
180
+ json = query_fields.to_json
181
+ json.html_safe
182
+ end
183
+
184
+ def query_fields
185
+ fields = load_base_processor.fields(@reports[@report_name],@start_date,@end_date,query_vars(@report_name),@query,@db)
186
+ logger.info "FIELDS #{fields}"
187
+ fields
188
+ end
189
+
190
+ def query_vars report
191
+ return nil if report.nil? || report.length<=0
192
+ query_vars = @reports[report]['query_vars']
193
+ if !query_vars.nil? && query_vars.size > 0
194
+ return query_vars[0]
195
+ else
196
+ return nil
207
197
  end
198
+ end
199
+
200
+ def render_error(exception)
201
+ logger.error(exception)
202
+ render :template => "old_sql/errors/401.html.erb", :status => 401
203
+ end
204
+
205
+ def strip_html html
206
+ OldSql.strip_html html
207
+ end
208
+
209
+ def chart_data
210
+ return nil if @report.nil?
211
+ json = @report.values.first.to_json
212
+ json.html_safe
213
+ end
214
+
215
+ def chart_type
216
+ return nil if @report.nil?
217
+ @report.keys.first
218
+ end
219
+
220
+ def google_chart_colors
221
+ json = OldSql.google_chart_colors.to_json
222
+ json.html_safe
223
+ end
224
+
225
+ def db_list
226
+ db = []
227
+ db << {name: Rails.env.capitalize, db_class: "active_record/base"}
228
+ end
208
229
  end
209
230
  end
210
231
 
@@ -0,0 +1,49 @@
1
+ <script>
2
+ jQuery(document).ready(function($){
3
+ $('#query-button').bind('click', function() {
4
+ query();
5
+ });
6
+
7
+ $('#delete-saved-queries').bind('click', function() {
8
+ deleted_saved_queries();
9
+ });
10
+
11
+ $('#saved-queries-list').bind('click', function() {
12
+ $('#query-text').val($("#saved-queries-list option:selected").val());
13
+ });
14
+ });
15
+ </script>
16
+
17
+ <div class="query">
18
+ <div>
19
+ DATABASE:
20
+ <select name="query-db" id="query-db" onchange="db_selected()">
21
+ <% db_list.each do |db| %>
22
+ <option value="<%=db[:name]%>" class_name="<%=db[:class_name]%>"><%=db[:name]%></option>
23
+ <% end %>
24
+ </select>
25
+ </div>
26
+
27
+ <div>
28
+ <textarea id="query-text" rows="12" cols="120"></textarea>
29
+ </div>
30
+
31
+ <div>
32
+ <input id="query-button" type="button" value="Run" onclick="return true;" /> or press ctrl-enter
33
+ </div>
34
+ </div>
35
+
36
+ <div id="saved_queries">
37
+ <div>
38
+ SAVED QUERIES:
39
+ </div>
40
+
41
+ <div>
42
+ <select id="saved-queries-list" size="14">
43
+ </select>
44
+ </div>
45
+
46
+ <div>
47
+ <input id="delete-saved-queries" type="button" value="Clear" onclick="return true;" />
48
+ </div>
49
+ </div>
@@ -0,0 +1,40 @@
1
+ <form id="report-form" name="report-form" action="/oldsql/reports/query" method="POST">
2
+ <div class="report-form-row">
3
+ <div class="report-form-label">SELECT A REPORT:</div>
4
+ <div class="report-form-input">
5
+ <select name="report" id="report"
6
+ onchange="report_selected()">
7
+ <option></option>
8
+ <% @reports.each do |report, data| %>
9
+ <option value="<%= data['name'] %>" report_sql="<%= data['report_sql'] %>"
10
+ desc="<%= data['description'] %>" name="<%=report%>"
11
+ report_view="<%=data['report_view']%>"><%= data['description'] %></option>
12
+ <% end %>
13
+ </select>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="report-form-row">
18
+ <div class="report-form-label">START DATE:</div>
19
+ <div class="report-form-input">
20
+ <input type="text" id="datepicker-start" name="start_date" value="">
21
+ </div>
22
+ </div>
23
+
24
+ <div class="report-form-row">
25
+ <div class="report-form-label">END DATE:</div>
26
+ <div class="report-form-input">
27
+ <input type="text" id="datepicker-end" name="end_date" value="">
28
+ </div>
29
+ </div>
30
+
31
+ <div class="report-form-row">
32
+ <div class="report-form-label"></div>
33
+ <input type="button" value="Run" onclick="load_report();"/>
34
+ </div>
35
+ </form>
36
+
37
+ <div id="links">
38
+ <div><%= link_to_function("Print Report", "javascript:print_report()") %></div>
39
+ <div><%= link_to_function("Export To Excel", "javascript:export_report_to_excel()") %></div>
40
+ </div>