瀏覽代碼

Close transaction quicker

Andrew Kane 8 年之前
父節點
當前提交
e58f71ce4b
共有 1 個文件被更改,包括 15 次插入10 次删除
  1. 15 10
      lib/blazer/data_source.rb

+ 15 - 10
lib/blazer/data_source.rb

@@ -206,9 +206,10 @@ module Blazer
       rows = []
       error = nil
       start_time = Time.now
+      result = nil
 
-      in_transaction do
-        begin
+      begin
+        in_transaction do
           if timeout
             if postgresql? || redshift?
               connection_model.connection.execute("SET statement_timeout = #{timeout.to_i * 1000}")
@@ -220,18 +221,22 @@ module Blazer
           end
 
           result = connection_model.connection.select_all("#{statement} /*#{comment}*/")
-          columns = result.columns
-          cast_method = Rails::VERSION::MAJOR < 5 ? :type_cast : :cast_value
-          result.rows.each do |untyped_row|
-            rows << (result.column_types.empty? ? untyped_row : columns.each_with_index.map { |c, i| untyped_row[i] ? result.column_types[c].send(cast_method, untyped_row[i]) : nil })
-          end
-        rescue ActiveRecord::StatementInvalid => e
-          error = e.message.sub(/.+ERROR: /, "")
-          error = Blazer::TIMEOUT_MESSAGE if Blazer::TIMEOUT_ERRORS.any? { |e| error.include?(e) }
         end
+      rescue ActiveRecord::StatementInvalid => e
+        error = e.message.sub(/.+ERROR: /, "")
+        error = Blazer::TIMEOUT_MESSAGE if Blazer::TIMEOUT_ERRORS.any? { |e| error.include?(e) }
       end
 
       duration = Time.now - start_time
+
+      if result
+        columns = result.columns
+        cast_method = Rails::VERSION::MAJOR < 5 ? :type_cast : :cast_value
+        result.rows.each do |untyped_row|
+          rows << (result.column_types.empty? ? untyped_row : columns.each_with_index.map { |c, i| untyped_row[i] ? result.column_types[c].send(cast_method, untyped_row[i]) : nil })
+        end
+      end
+
       just_cached = false
       if !error && (cache_mode == "all" || (cache_mode == "slow" && duration >= cache_slow_threshold))
         Blazer.cache.write(cache_key(statement), Marshal.dump([columns, rows, Time.now]), expires_in: cache_expires_in.to_f * 60)