From bc5baed05ea92730b0078bdbbf8a154bd9dd87d2 Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Tue, 6 Dec 2022 22:41:00 +0100 Subject: [PATCH] Use `exec_query` for custom SQL execution Also align how we use query Postgres from controllers. The change is mainly due to regular (but not reproducible) issues with the `intervalstyle` defaulting to `postgres` (instead of `iso8601`) and thereby causing issues. We're just experimenting to see whether this change resolves the issue. --- app/controllers/community_solutions_controller.rb | 2 +- app/controllers/concerns/redirect_behavior.rb | 2 +- app/controllers/execution_environments_controller.rb | 4 ++-- app/controllers/external_users_controller.rb | 2 +- app/controllers/ping_controller.rb | 2 +- app/models/exercise.rb | 12 ++++++------ 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/controllers/community_solutions_controller.rb b/app/controllers/community_solutions_controller.rb index 827c9557..f1936075 100644 --- a/app/controllers/community_solutions_controller.rb +++ b/app/controllers/community_solutions_controller.rb @@ -60,7 +60,7 @@ class CommunitySolutionsController < ApplicationController # Acquire lock here! This is expensive but required for synchronization @community_solution_lock = ActiveRecord::Base.transaction do - ActiveRecord::Base.connection.execute("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE") + ApplicationRecord.connection.exec_query("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE") lock = CommunitySolutionLock.where(user: current_user, community_solution: @community_solution).order(locked_until: :asc).last diff --git a/app/controllers/concerns/redirect_behavior.rb b/app/controllers/concerns/redirect_behavior.rb index 1f2e2244..afe53fa1 100644 --- a/app/controllers/concerns/redirect_behavior.rb +++ b/app/controllers/concerns/redirect_behavior.rb @@ -90,7 +90,7 @@ module RedirectBehavior # Acquire lock here! This is expensive but required for synchronization @community_solution_lock = ActiveRecord::Base.transaction do - ActiveRecord::Base.connection.execute("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE") + ApplicationRecord.connection.exec_query("LOCK #{CommunitySolutionLock.table_name} IN ACCESS EXCLUSIVE MODE") # This is returned CommunitySolutionLock.find_or_create_by(community_solution: @community_solution, locked_until: Time.zone.now...) do |lock| diff --git a/app/controllers/execution_environments_controller.rb b/app/controllers/execution_environments_controller.rb index 0cd706a4..c5224f36 100644 --- a/app/controllers/execution_environments_controller.rb +++ b/app/controllers/execution_environments_controller.rb @@ -107,7 +107,7 @@ class ExecutionEnvironmentsController < ApplicationController working_time_statistics = {} user_statistics = {} - ApplicationRecord.connection.execute(working_time_query).each do |tuple| + ApplicationRecord.connection.exec_query(working_time_query).each do |tuple| tuple = tuple.merge({ 'average_time' => format_time_difference(tuple['average_time']), 'stddev_time' => format_time_difference(tuple['stddev_time']), @@ -115,7 +115,7 @@ class ExecutionEnvironmentsController < ApplicationController working_time_statistics[tuple['exercise_id'].to_i] = tuple end - ApplicationRecord.connection.execute(user_query).each do |tuple| + ApplicationRecord.connection.exec_query(user_query).each do |tuple| user_statistics[tuple['exercise_id'].to_i] = tuple end diff --git a/app/controllers/external_users_controller.rb b/app/controllers/external_users_controller.rb index b9ad2f1d..bc61ad07 100644 --- a/app/controllers/external_users_controller.rb +++ b/app/controllers/external_users_controller.rb @@ -69,7 +69,7 @@ class ExternalUsersController < ApplicationController statistics = {} - ApplicationRecord.connection.execute(working_time_query(tag&.id)).each do |tuple| + ApplicationRecord.connection.exec_query(working_time_query(tag&.id)).each do |tuple| tuple = tuple.merge('working_time' => format_time_difference(tuple['working_time'])) statistics[tuple['exercise_id'].to_i] = tuple end diff --git a/app/controllers/ping_controller.rb b/app/controllers/ping_controller.rb index 70a4d6da..efc52ff7 100644 --- a/app/controllers/ping_controller.rb +++ b/app/controllers/ping_controller.rb @@ -16,7 +16,7 @@ class PingController < ApplicationController def postgres_connected! # any unhandled exception leads to a HTTP 500 response. - return if ApplicationRecord.connection.execute('SELECT 1 as result').first['result'] == 1 + return if ApplicationRecord.connection.exec_query('SELECT 1 as result').first['result'] == 1 raise ActiveRecord::ConnectionNotEstablished end diff --git a/app/models/exercise.rb b/app/models/exercise.rb index 0793e853..3bcedbdc 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -68,7 +68,7 @@ class Exercise < ApplicationRecord def average_score if submissions.exists?(cause: 'submit') maximum_scores_query = submissions.select('MAX(score) AS maximum_score').group(:user_id).to_sql.sub('$1', id.to_s) - self.class.connection.execute("SELECT AVG(maximum_score) AS average_score FROM (#{maximum_scores_query}) AS maximum_scores").first['average_score'].to_f + self.class.connection.exec_query("SELECT AVG(maximum_score) AS average_score FROM (#{maximum_scores_query}) AS maximum_scores").first['average_score'].to_f else 0 end @@ -222,7 +222,7 @@ class Exercise < ApplicationRecord "AND user_id = #{user.id} AND user_type = '#{user.class.name}'" end - results = self.class.connection.execute(study_group_working_time_query(id, study_group_id, + results = self.class.connection.exec_query(study_group_working_time_query(id, study_group_id, additional_filter)).each do |tuple| bucket = if maximum_score > 0.0 && tuple['score'] <= maximum_score (tuple['score'] / maximum_score * max_bucket).round @@ -253,7 +253,7 @@ class Exercise < ApplicationRecord end def get_quantiles(quantiles) - result = self.class.connection.execute(" + result = self.class.connection.exec_query(" WITH working_time AS ( SELECT user_id, @@ -369,14 +369,14 @@ class Exercise < ApplicationRecord def retrieve_working_time_statistics @working_time_statistics = {'InternalUser' => {}, 'ExternalUser' => {}} - self.class.connection.execute(user_working_time_query).each do |tuple| + self.class.connection.exec_query(user_working_time_query).each do |tuple| tuple = tuple.merge('working_time' => format_time_difference(tuple['working_time'])) @working_time_statistics[tuple['user_type']][tuple['user_id'].to_i] = tuple end end def average_working_time - result = self.class.connection.execute(" + result = self.class.connection.exec_query(" SELECT avg(working_time) as average_time FROM (#{self.class.sanitize_sql(user_working_time_query)}) AS baz; @@ -392,7 +392,7 @@ class Exercise < ApplicationRecord def accumulated_working_time_for_only(user) user_type = user.external_user? ? 'ExternalUser' : 'InternalUser' begin - result = self.class.connection.execute(" + result = self.class.connection.exec_query(" WITH WORKING_TIME AS (SELECT user_id, id,