4552: Tidy up ensure_unique_name block.
authorTom Clegg <tom@curoverse.com>
Mon, 17 Nov 2014 20:17:59 +0000 (15:17 -0500)
committerTom Clegg <tom@curoverse.com>
Tue, 18 Nov 2014 07:36:33 +0000 (02:36 -0500)
services/api/app/controllers/application_controller.rb

index 03fda754b02d0c5c557e95a963d31c43a844ecec..4f0364f15af205df240f2471b80d015ebb4b8b1e 100644 (file)
@@ -80,7 +80,6 @@ class ApplicationController < ActionController::Base
 
   def create
     @object = model_class.new resource_attrs
-    retry_save = true
 
     if @object.respond_to? :name and params[:ensure_unique_name]
       # Record the original name.  See below.
@@ -88,40 +87,35 @@ class ApplicationController < ActionController::Base
       counter = 1
     end
 
-    while retry_save
-      begin
-        retry_save = false
-        @object.save!
-      rescue ActiveRecord::RecordNotUnique => rn
-        # Dig into the error to determine if it is specifically calling out a
-        # (owner_uuid, name) uniqueness violation.  In this specific case, and
-        # the client requested a unique name with ensure_unique_name==true,
-        # update the name field and try to save again.  Loop as necessary to
-        # discover a unique name.  It is necessary to handle name choosing at
-        # this level (as opposed to the client) to ensure that record creation
-        # never fails due to a race condition.
-        if rn.original_exception.is_a? PG::UniqueViolation
-          # Unfortunately ActiveRecord doesn't abstract out any of the
-          # necessary information to figure out if this the error is actually
-          # the specific case where we want to apply the ensure_unique_name
-          # behavior, so the following code is specialized to Postgres.
-          err = rn.original_exception
-          detail = err.result.error_field(PG::Result::PG_DIAG_MESSAGE_DETAIL)
-          if /^Key \(owner_uuid, name\)=\([a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15}, .*?\) already exists\./.match detail
-            logger.error "params[:ensure_unique_name] is #{params[:ensure_unique_name]}"
-            if params[:ensure_unique_name]
-              counter += 1
-              @object.uuid = nil
-              @object.name = "#{name_stem} (#{counter})"
-              retry_save = true
-            end
-          end
-        end
-        if not retry_save
-          raise
-        end
-      end
-    end
+    begin
+      @object.save!
+    rescue ActiveRecord::RecordNotUnique => rn
+      raise unless params[:ensure_unique_name]
+
+      # Dig into the error to determine if it is specifically calling out a
+      # (owner_uuid, name) uniqueness violation.  In this specific case, and
+      # the client requested a unique name with ensure_unique_name==true,
+      # update the name field and try to save again.  Loop as necessary to
+      # discover a unique name.  It is necessary to handle name choosing at
+      # this level (as opposed to the client) to ensure that record creation
+      # never fails due to a race condition.
+      raise unless rn.original_exception.is_a? PG::UniqueViolation
+
+      # Unfortunately ActiveRecord doesn't abstract out any of the
+      # necessary information to figure out if this the error is actually
+      # the specific case where we want to apply the ensure_unique_name
+      # behavior, so the following code is specialized to Postgres.
+      err = rn.original_exception
+      detail = err.result.error_field(PG::Result::PG_DIAG_MESSAGE_DETAIL)
+      raise unless /^Key \(owner_uuid, name\)=\([a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15}, .*?\) already exists\./.match detail
+
+      # OK, this exception really is just a unique name constraint
+      # violation, and we've been asked to ensure_unique_name.
+      counter += 1
+      @object.uuid = nil
+      @object.name = "#{name_stem} (#{counter})"
+      redo
+    end while false
     show
   end