old_sql 1.26.0 → 1.27.0

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.
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>