Browse Source

Lazy load adapter instance

Andrew 6 years ago
parent
commit
de03cbaf15
1 changed files with 17 additions and 14 deletions
  1. 17 14
      lib/blazer/data_source.rb

+ 17 - 14
lib/blazer/data_source.rb

@@ -4,24 +4,13 @@ module Blazer
   class DataSource
     extend Forwardable
 
-    attr_reader :id, :settings, :adapter, :adapter_instance
+    attr_reader :id, :settings
 
     def_delegators :adapter_instance, :schema, :tables, :preview_statement, :reconnect, :cost, :explain, :cancel
 
     def initialize(id, settings)
       @id = id
       @settings = settings
-
-      unless settings["url"] || Rails.env.development? || ["bigquery", "athena"].include?(settings["adapter"])
-        raise Blazer::Error, "Empty url for data source: #{id}"
-      end
-
-      @adapter_instance =
-        if Blazer.adapters[adapter]
-          Blazer.adapters[adapter].new(self)
-        else
-          raise Blazer::Error, "Unknown adapter"
-        end
     end
 
     def adapter
@@ -154,9 +143,23 @@ module Blazer
 
     protected
 
+    def adapter_instance
+      @adapter_instance ||= begin
+        unless settings["url"] || Rails.env.development? || ["bigquery", "athena"].include?(settings["adapter"])
+          raise Blazer::Error, "Empty url for data source: #{id}"
+        end
+
+        unless Blazer.adapters[adapter]
+          raise Blazer::Error, "Unknown adapter"
+        end
+
+        Blazer.adapters[adapter].new(self)
+      end
+    end
+
     def run_statement_helper(statement, comment, run_id)
       start_time = Time.now
-      columns, rows, error = @adapter_instance.run_statement(statement, comment)
+      columns, rows, error = adapter_instance.run_statement(statement, comment)
       duration = Time.now - start_time
 
       cache_data = nil
@@ -165,7 +168,7 @@ module Blazer
         cache_data = Marshal.dump([columns, rows, error, cache ? Time.now : nil]) rescue nil
       end
 
-      if cache && cache_data && @adapter_instance.cachable?(statement)
+      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