| 
					
				 | 
			
			
				@@ -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) 
			 |