Browse Source

Merge branch 'query_editable'

Andrew Kane 8 years ago
parent
commit
7a2ae7845f

+ 3 - 1
app/models/blazer/query.rb

@@ -19,7 +19,9 @@ module Blazer
     end
 
     def editable?(user)
-      !persisted? || (name.present? && name.first != "*" && name.first != "#") || user == creator
+      editable = !persisted? || (name.present? && name.first != "*" && name.first != "#") || user == creator
+      editable &&= Blazer.query_editable.call(self, user) if Blazer.query_editable
+      editable
     end
   end
 end

+ 1 - 1
app/views/blazer/queries/_form.html.erb

@@ -16,7 +16,7 @@
           <%= link_to "Back", :back %>
         </div>
         <%= link_to "Schema", "#", target: "_blank", id: "view-schema", style: "margin-right: 10px;" %>
-        <%= f.select :data_source, Blazer.data_sources.values.map { |ds| [ds.name, ds.id] }, {}, class: ("hide" if Blazer.data_sources.size == 1), style: "width: 140px;" %>
+        <%= f.select :data_source, Blazer.data_sources.values.select { |ds| q = @query.dup; q.data_source = ds.id; q.editable?(blazer_user) }.map { |ds| [ds.name, ds.id] }, {}, class: ("hide" if Blazer.data_sources.size == 1), style: "width: 140px;" %>
         <div id="tables" style="display: inline-block; width: 250px; margin-right: 10px;" class="hide">
           <%= render partial: "tables" %>
         </div>

+ 1 - 0
lib/blazer.rb

@@ -33,6 +33,7 @@ module Blazer
     attr_accessor :anomaly_checks
     attr_accessor :async
     attr_accessor :images
+    attr_accessor :query_editable
   end
   self.audit = true
   self.user_name = :name

+ 4 - 0
lib/blazer/adapters/base_adapter.rb

@@ -39,6 +39,10 @@ module Blazer
         # optional
       end
 
+      def cachable?(statement)
+        true # optional
+      end
+
       protected
 
       def settings

+ 5 - 1
lib/blazer/adapters/sql_adapter.rb

@@ -41,7 +41,7 @@ module Blazer
       end
 
       def tables
-        result = data_source.run_statement(connection_model.send(:sanitize_sql_array, ["SELECT table_name FROM information_schema.tables WHERE table_schema IN (?) ORDER BY table_name", schemas]))
+        result = data_source.run_statement(connection_model.send(:sanitize_sql_array, ["SELECT table_name FROM information_schema.tables WHERE table_schema IN (?) ORDER BY table_name", schemas]), refresh_cache: true)
         result.rows.map(&:first)
       end
 
@@ -83,6 +83,10 @@ module Blazer
         end
       end
 
+      def cachable?(statement)
+        !%w[CREATE ALTER UPDATE INSERT DELETE].include?(statement.split.first.to_s.upcase)
+      end
+
       protected
 
       def select_all(statement)

+ 1 - 1
lib/blazer/data_source.rb

@@ -180,7 +180,7 @@ module Blazer
         cache_data = Marshal.dump([columns, rows, error, cache ? Time.now : nil]) rescue nil
       end
 
-      if cache && cache_data
+      if cache && cache_data && @adapter_instance.cachable?(statement)
         Blazer.cache.write(statement_cache_key(statement), cache_data, expires_in: cache_expires_in.to_f * 60)
       end