You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficcontrol.apache.org by GitBox <gi...@apache.org> on 2018/09/20 22:48:43 UTC

[GitHub] rob05c closed pull request #2849: TO Golang: Updated ParseDBError

rob05c closed pull request #2849: TO Golang: Updated ParseDBError
URL: https://github.com/apache/trafficcontrol/pull/2849
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/traffic_ops/traffic_ops_golang/api/api.go b/traffic_ops/traffic_ops_golang/api/api.go
index f94fb841d..6d3d5d0ea 100644
--- a/traffic_ops/traffic_ops_golang/api/api.go
+++ b/traffic_ops/traffic_ops_golang/api/api.go
@@ -27,6 +27,7 @@ import (
 	"fmt"
 	"io"
 	"net/http"
+	"regexp"
 	"strconv"
 	"strings"
 	"time"
@@ -415,27 +416,66 @@ func TypeErrToAPIErr(err error, errType tc.ApiErrorType) (error, error, int) {
 	}
 }
 
-// ParseDBErr parses pq errors for uniqueness constraint violations, and returns the (userErr, sysErr, httpCode) format expected by the API helpers.
-// The dataType is the name of the API object, e.g. 'coordinate' or 'delivery service', used to construct the error string.
-func ParseDBErr(ierr error, dataType string) (error, error, int) {
+// small helper function to help with parsing below
+func toCamelCase(str string) string {
+	mutable := []byte(str)
+	for i := 0; i < len(str); i++ {
+		if mutable[i] == '_' && i+1 < len(str) {
+			mutable[i+1] = strings.ToUpper(string(str[i+1]))[0]
+		}
+	}
+	return strings.Replace(string(mutable[:]), "_", "", -1)
+}
+
+// parses pq errors for not null constraint
+func parseNotNullConstraintError(err *pq.Error) (error, error, int) {
+	pattern := regexp.MustCompile(`null value in column "(.+)" violates not-null constraint`)
+	match := pattern.FindStringSubmatch(err.Message)
+	if match == nil {
+		return nil, nil, http.StatusOK
+	}
+	return fmt.Errorf("%s is a required field", toCamelCase(match[1])), nil, http.StatusBadRequest
+}
+
+// parses pq errors for violated foreign key constraints
+func parseNotPresentFKConstraintError(err *pq.Error) (error, error, int) {
+	pattern := regexp.MustCompile(`Key \(.+\)=\(.+\) is not present in table "(.+)"`)
+	match := pattern.FindStringSubmatch(err.Detail)
+	if match == nil {
+		return nil, nil, http.StatusOK
+	}
+	return fmt.Errorf("%s not found", match[1]), nil, http.StatusNotFound
+}
+
+// parses pq errors for uniqueness constraint violations
+func parseUniqueConstraintError(err *pq.Error) (error, error, int) {
+	pattern := regexp.MustCompile(`Key \((.+)\)=\((.+)\) already exists`)
+	match := pattern.FindStringSubmatch(err.Detail)
+	if match == nil {
+		return nil, nil, http.StatusOK
+	}
+	return fmt.Errorf("%s %s already exists.", match[1], match[2]), nil, http.StatusBadRequest
+}
+
+// ParseDBError parses pq errors for uniqueness constraint violations, and returns the (userErr, sysErr, httpCode) format expected by the API helpers.
+func ParseDBError(ierr error) (error, error, int) {
+
 	err, ok := ierr.(*pq.Error)
 	if !ok {
 		return nil, errors.New("database returned non pq error: " + err.Error()), http.StatusInternalServerError
 	}
-	if len(err.Constraint) > 0 && len(err.Detail) > 0 { //we only want to continue parsing if it is a constraint error with details
-		detail := err.Detail
-		if strings.HasPrefix(detail, "Key ") && strings.HasSuffix(detail, " already exists.") { //we only want to continue parsing if it is a uniqueness constraint error
-			detail = strings.TrimPrefix(detail, "Key ")
-			detail = strings.TrimSuffix(detail, " already exists.")
-			//should look like "(column)=(dupe value)" at this point
-			details := strings.Split(detail, "=")
-			if len(details) == 2 {
-				column := strings.Trim(details[0], "()")
-				dupValue := strings.Trim(details[1], "()")
-				return errors.New("a " + dataType + " with " + column + " " + dupValue + " already exists."), nil, http.StatusBadRequest
-			}
-		}
+
+	if usrErr, sysErr, errCode := parseNotNullConstraintError(err); errCode != http.StatusOK {
+		return usrErr, sysErr, errCode
+	}
+
+	if usrErr, sysErr, errCode := parseNotPresentFKConstraintError(err); errCode != http.StatusOK {
+		return usrErr, sysErr, errCode
 	}
-	log.Errorln(dataType + " failed to parse unique constraint from pq error: " + err.Error())
+
+	if usrErr, sysErr, errCode := parseUniqueConstraintError(err); errCode != http.StatusOK {
+		return usrErr, sysErr, errCode
+	}
+
 	return nil, err, http.StatusInternalServerError
 }
diff --git a/traffic_ops/traffic_ops_golang/api/api_test.go b/traffic_ops/traffic_ops_golang/api/api_test.go
new file mode 100644
index 000000000..700d9c87a
--- /dev/null
+++ b/traffic_ops/traffic_ops_golang/api/api_test.go
@@ -0,0 +1,14 @@
+package api
+
+import "testing"
+
+func TestCamelCase(t *testing.T) {
+
+	testStrings := []string{"hello_world", "trailing_underscore_", "w_h_a_t____"}
+	expected := []string{"helloWorld", "trailingUnderscore", "wHAT"}
+	for i, str := range testStrings {
+		if toCamelCase(str) != expected[i] {
+			t.Errorf("expected: %v error, actual: %v", expected[i], toCamelCase(str))
+		}
+	}
+}
diff --git a/traffic_ops/traffic_ops_golang/api/crud.go b/traffic_ops/traffic_ops_golang/api/crud.go
index bb44c30ec..5c0dd3569 100644
--- a/traffic_ops/traffic_ops_golang/api/crud.go
+++ b/traffic_ops/traffic_ops_golang/api/crud.go
@@ -62,7 +62,7 @@ type GenericDeleter interface {
 func GenericCreate(val GenericCreator) (error, error, int) {
 	resultRows, err := val.APIInfo().Tx.NamedQuery(val.InsertQuery(), val)
 	if err != nil {
-		return ParseDBErr(err, val.GetType())
+		return ParseDBError(err)
 	}
 	defer resultRows.Close()
 
@@ -113,7 +113,7 @@ func GenericRead(val GenericReader) ([]interface{}, error, error, int) {
 func GenericUpdate(val GenericUpdater) (error, error, int) {
 	rows, err := val.APIInfo().Tx.NamedQuery(val.UpdateQuery(), val)
 	if err != nil {
-		return ParseDBErr(err, val.GetType())
+		return ParseDBError(err)
 	}
 	defer rows.Close()
 
diff --git a/traffic_ops/traffic_ops_golang/api/shared_handlers.go b/traffic_ops/traffic_ops_golang/api/shared_handlers.go
index 5a1eb3f30..975162ba3 100644
--- a/traffic_ops/traffic_ops_golang/api/shared_handlers.go
+++ b/traffic_ops/traffic_ops_golang/api/shared_handlers.go
@@ -286,7 +286,6 @@ func DeleteHandler(typeFactory CRUDFactory) http.HandlerFunc {
 			}
 		}
 
-		log.Debugf("calling delete on object: %++v", d) //should have id set now
 		userErr, sysErr, errCode = d.Delete()
 		if userErr != nil || sysErr != nil {
 			HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
@@ -324,9 +323,6 @@ func CreateHandler(typeConstructor CRUDFactory) http.HandlerFunc {
 			return
 		}
 
-		log.Debugf("%++v", i)
-		//now we have a validated local object to insert
-
 		if t, ok := i.(Tenantable); ok {
 			authorized, err := t.IsTenantAuthorized(inf.User)
 			if err != nil {
diff --git a/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go b/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go
index 5c838b6e1..9a833a0da 100644
--- a/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go
+++ b/traffic_ops/traffic_ops_golang/cachegroup/cachegroups.go
@@ -202,7 +202,7 @@ func (cg *TOCacheGroup) Create() (error, error, int) {
 		cg.SecondaryParentCachegroupID,
 	)
 	if err != nil {
-		return api.ParseDBErr(err, cg.GetType())
+		return api.ParseDBError(err)
 	}
 	defer resultRows.Close()
 
@@ -375,7 +375,7 @@ func (cg *TOCacheGroup) Update() (error, error, int) {
 		cg.ID,
 	)
 	if err != nil {
-		return api.ParseDBErr(err, cg.GetType())
+		return api.ParseDBError(err)
 	}
 	defer resultRows.Close()
 
diff --git a/traffic_ops/traffic_ops_golang/cdnfederation/cdnfederations.go b/traffic_ops/traffic_ops_golang/cdnfederation/cdnfederations.go
index 692abc8e0..28317cb71 100644
--- a/traffic_ops/traffic_ops_golang/cdnfederation/cdnfederations.go
+++ b/traffic_ops/traffic_ops_golang/cdnfederation/cdnfederations.go
@@ -26,7 +26,6 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/apache/trafficcontrol/lib/go-log"
 	"github.com/apache/trafficcontrol/lib/go-tc"
 	"github.com/apache/trafficcontrol/lib/go-tc/tovalidate"
 	"github.com/apache/trafficcontrol/lib/go-util"
@@ -35,7 +34,6 @@ import (
 	"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/tenant"
 	"github.com/asaskevich/govalidator"
 	"github.com/go-ozzo/ozzo-validation"
-	"github.com/lib/pq"
 )
 
 // we need a type alias to define functions on
@@ -126,22 +124,6 @@ func (fed *TOCDNFederation) Validate() error {
 	return util.JoinErrs(tovalidate.ToErrors(validateErrs))
 }
 
-// This separates out errors depending on whether or not some constraint prevented
-// the operation from occuring.
-func parseQueryError(parseErr error, method string) (error, tc.ApiErrorType) {
-	if pqErr, ok := parseErr.(*pq.Error); ok {
-		err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
-		if eType == tc.DataConflictError {
-			log.Errorf("data conflict error: %v", err)
-			return errors.New("a federation with " + err.Error()), eType
-		}
-		return err, eType
-	} else {
-		log.Errorf("received error: %++v from %s execution", parseErr, method)
-		return tc.DBError, tc.SystemError
-	}
-}
-
 // fedAPIInfo.Params["name"] is not used on creation, rather the cdn name
 // is connected when the federations/:id/deliveryservice links a federation
 // Note: cdns and deliveryservies have a 1-1 relationship
diff --git a/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go b/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
index 0b888700c..866342c8e 100644
--- a/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
+++ b/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
@@ -101,26 +101,6 @@ func parseCriteriaAndQueryValues(queryParamsToSQLCols map[string]WhereColumnInfo
 	return criteria, queryValues, errs
 }
 
-//parses pq errors for uniqueness constraint violations
-func ParsePQUniqueConstraintError(err *pq.Error) (error, tc.ApiErrorType) {
-	if len(err.Constraint) > 0 && len(err.Detail) > 0 { //we only want to continue parsing if it is a constraint error with details
-		detail := err.Detail
-		if strings.HasPrefix(detail, "Key ") && strings.HasSuffix(detail, " already exists.") { //we only want to continue parsing if it is a uniqueness constraint error
-			detail = strings.TrimPrefix(detail, "Key ")
-			detail = strings.TrimSuffix(detail, " already exists.")
-			//should look like "(column)=(dupe value)" at this point
-			details := strings.Split(detail, "=")
-			if len(details) == 2 {
-				column := strings.Trim(details[0], "()")
-				dupValue := strings.Trim(details[1], "()")
-				return errors.New(column + " " + dupValue + " already exists."), tc.DataConflictError
-			}
-		}
-	}
-	log.Error.Printf("failed to parse unique constraint from pq error: %v", err)
-	return tc.DBError, tc.SystemError
-}
-
 // FinishTx commits the transaction if commit is true when it's called, otherwise it rolls back the transaction. This is designed to be called in a defer.
 func FinishTx(tx *sql.Tx, commit *bool) {
 	if tx == nil {
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go
index 6075e3faa..649afb142 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go
@@ -147,11 +147,8 @@ func create(tx *sql.Tx, cfg config.Config, user *auth.CurrentUser, ds tc.Deliver
 
 	resultRows, err := tx.Query(insertQuery(), &ds.Active, &ds.AnonymousBlockingEnabled, &ds.CacheURL, &ds.CCRDNSTTL, &ds.CDNID, &ds.CheckPath, &deepCachingType, &ds.DisplayName, &ds.DNSBypassCNAME, &ds.DNSBypassIP, &ds.DNSBypassIP6, &ds.DNSBypassTTL, &ds.DSCP, &ds.EdgeHeaderRewrite, &ds.GeoLimitRedirectURL, &ds.GeoLimit, &ds.GeoLimitCountries, &ds.GeoProvider, &ds.GlobalMaxMBPS, &ds.GlobalMaxTPS, &ds.FQPacingRate, &ds.HTTPBypassFQDN, &ds.InfoURL, &ds.InitialDispersion, &ds.IPV6RoutingEnabled, &ds.LogsEnabled, &ds.LongDesc, &ds.LongDesc1, &ds.LongDesc2, &ds.MaxDNSAnswers, &ds.MidHeaderRewrite, &ds.MissLat, &ds.MissLong, &ds.MultiSiteOrigin, &ds.OriginShield, &ds.ProfileID, &ds.Protocol, &ds.QStringIgnore, &ds.RangeRequestHandling, &ds.RegexRemap, &ds.RegionalGeoBlocking, &ds.RemapText, &ds.RoutingName, &ds.SigningAlgorithm, &ds.SSLKeyVersion, &ds.TenantID, &ds.TRRequestHeaders, &ds.TRResponseHeaders, &ds.TypeID, &ds.XMLID)
 	if err != nil {
-		if pqerr, ok := err.(*pq.Error); ok {
-			err, _ := dbhelpers.ParsePQUniqueConstraintError(pqerr)
-			return tc.DeliveryServiceNullable{}, http.StatusBadRequest, errors.New("a delivery service with " + err.Error()), nil
-		}
-		return tc.DeliveryServiceNullable{}, http.StatusInternalServerError, nil, errors.New("inserting ds: " + err.Error())
+		usrErr, sysErr, code := api.ParseDBError(err)
+		return tc.DeliveryServiceNullable{}, code, usrErr, sysErr
 	}
 	defer resultRows.Close()
 
@@ -456,14 +453,8 @@ func update(tx *sql.Tx, cfg config.Config, user *auth.CurrentUser, ds *tc.Delive
 	resultRows, err := tx.Query(updateDSQuery(), &ds.Active, &ds.CacheURL, &ds.CCRDNSTTL, &ds.CDNID, &ds.CheckPath, &deepCachingType, &ds.DisplayName, &ds.DNSBypassCNAME, &ds.DNSBypassIP, &ds.DNSBypassIP6, &ds.DNSBypassTTL, &ds.DSCP, &ds.EdgeHeaderRewrite, &ds.GeoLimitRedirectURL, &ds.GeoLimit, &ds.GeoLimitCountries, &ds.GeoProvider, &ds.GlobalMaxMBPS, &ds.GlobalMaxTPS, &ds.FQPacingRate, &ds.HTTPBypassFQDN, &ds.InfoURL, &ds.InitialDispersion, &ds.IPV6RoutingEnabled, &ds.LogsEnabled, &ds.LongDesc, &ds.LongDesc1, &ds.LongDesc2, &ds.MaxDNSAnswers, &ds.MidHeaderRewrite, &ds.MissLat, &ds.MissLong, &ds.MultiSiteOrigin, &ds.OriginShield, &ds.ProfileID, &ds.Protocol, &ds.QStringIgnore, &ds.RangeRequestHandling, &ds.RegexRemap, &ds.RegionalGeoBlocking, &ds.RemapText, &ds.RoutingName, &ds.SigningAlgorithm, &ds.SSLKeyVersion, &ds.TenantID, &ds.TRRequestHeaders, &ds.TRResponseHeaders, &ds.TypeID, &ds.XMLID, &ds.AnonymousBlockingEnabled, &ds.ID)
 
 	if err != nil {
-		if err, ok := err.(*pq.Error); ok {
-			err, eType := dbhelpers.ParsePQUniqueConstraintError(err)
-			if eType == tc.DataConflictError {
-				return tc.DeliveryServiceNullable{}, http.StatusBadRequest, errors.New("a delivery service with " + err.Error()), nil
-			}
-			return tc.DeliveryServiceNullable{}, http.StatusInternalServerError, nil, errors.New("query updating delivery service: pq: " + err.Error())
-		}
-		return tc.DeliveryServiceNullable{}, http.StatusInternalServerError, nil, errors.New("query updating delivery service: " + err.Error())
+		usrErr, sysErr, code := api.ParseDBError(err)
+		return tc.DeliveryServiceNullable{}, code, usrErr, sysErr
 	}
 	defer resultRows.Close()
 	if !resultRows.Next() {
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go b/traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go
index 5b416951e..db1ded109 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go
@@ -114,7 +114,7 @@ func (comment *TODeliveryServiceRequestComment) Update() (error, error, int) {
 	current := TODeliveryServiceRequestComment{}
 	err := comment.ReqInfo.Tx.QueryRowx(selectQuery() + `WHERE dsrc.id=` + strconv.Itoa(*comment.ID)).StructScan(&current)
 	if err != nil {
-		return api.ParseDBErr(err, comment.GetType())
+		return api.ParseDBError(err)
 	}
 
 	userID := tc.IDNoMod(comment.ReqInfo.User.ID)
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/request/requests.go b/traffic_ops/traffic_ops_golang/deliveryservice/request/requests.go
index 7751b0489..613ef703d 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/request/requests.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/request/requests.go
@@ -389,7 +389,7 @@ func (req *deliveryServiceRequestAssignment) Update() (error, error, int) {
 	}
 
 	if _, err = req.APIInfo().Tx.Tx.Exec(`UPDATE deliveryservice_request SET assignee_id = $1 WHERE id = $2`, v, *req.ID); err != nil {
-		return api.ParseDBErr(err, req.GetType())
+		return api.ParseDBError(err)
 	}
 
 	if err = req.APIInfo().Tx.QueryRowx(selectDeliveryServiceRequestsQuery()+` WHERE r.id = $1`, *req.ID).StructScan(req); err != nil {
@@ -455,7 +455,7 @@ func (req *deliveryServiceRequestStatus) Update() (error, error, int) {
 	// LastEditedBy field should not change with status update
 
 	if _, err = req.APIInfo().Tx.Tx.Exec(`UPDATE deliveryservice_request SET status = $1 WHERE id = $2`, *req.Status, *req.ID); err != nil {
-		return api.ParseDBErr(err, req.GetType())
+		return api.ParseDBError(err)
 	}
 
 	if err = req.APIInfo().Tx.QueryRowx(selectDeliveryServiceRequestsQuery()+` WHERE r.id = $1`, *req.ID).StructScan(req); err != nil {
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
index a9888b0f6..e6a00ceff 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
@@ -32,7 +32,6 @@ import (
 	"github.com/apache/trafficcontrol/lib/go-util"
 	"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/api"
 	"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/auth"
-	"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/dbhelpers"
 	"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/deliveryservice"
 	"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/tenant"
 
@@ -267,17 +266,8 @@ func GetReplaceHandler(w http.ResponseWriter, r *http.Request) {
 	for _, server := range servers {
 		dtos := map[string]interface{}{"id": dsId, "server": server}
 		if _, err := inf.Tx.NamedExec(insertIdsQuery(), dtos); err != nil {
-			if pqErr, ok := err.(*pq.Error); ok {
-				err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
-				log.Errorln("could not begin transaction: %v", err)
-				if eType == tc.DataConflictError {
-					api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("inserting for delivery service servers replace: "+err.Error()))
-					return
-				}
-				api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("inserting for delivery service servers replace: "+err.Error()))
-				return
-			}
-			api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("inserting for delivery service servers replace: "+err.Error()))
+			usrErr, sysErr, code := api.ParseDBError(err)
+			api.HandleErr(w, r, inf.Tx.Tx, code, usrErr, sysErr)
 			return
 		}
 		respServers = append(respServers, server)
@@ -327,16 +317,9 @@ func GetCreateHandler(w http.ResponseWriter, r *http.Request) {
 
 	res, err := inf.Tx.Tx.Exec(`INSERT INTO deliveryservice_server (deliveryservice, server) SELECT $1, id FROM server WHERE host_name = ANY($2::text[])`, dsID, pq.Array(serverNames))
 	if err != nil {
-		if pqErr, ok := err.(*pq.Error); ok {
-			err, eType := dbhelpers.ParsePQUniqueConstraintError(pqErr)
-			if eType == tc.DataConflictError {
-				api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, errors.New("a deliveryservice-server association with "+err.Error()), nil)
-				return
-			}
-			api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("ds servers inserting for create delivery service servers: "+err.Error()))
-			return
-		}
-		api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("ds servers inserting for create delivery service servers received non pq error: "+err.Error()))
+
+		usrErr, sysErr, code := api.ParseDBError(err)
+		api.HandleErr(w, r, inf.Tx.Tx, code, usrErr, sysErr)
 		return
 	}
 
diff --git a/traffic_ops/traffic_ops_golang/origin/origins.go b/traffic_ops/traffic_ops_golang/origin/origins.go
index 0df598f48..15d117be7 100644
--- a/traffic_ops/traffic_ops_golang/origin/origins.go
+++ b/traffic_ops/traffic_ops_golang/origin/origins.go
@@ -341,7 +341,7 @@ func (origin *TOOrigin) Update() (error, error, int) {
 	log.Debugf("about to run exec query: %s with origin: %++v", updateQuery(), origin)
 	resultRows, err := origin.ReqInfo.Tx.NamedQuery(updateQuery(), origin)
 	if err != nil {
-		return api.ParseDBErr(err, origin.GetType())
+		return api.ParseDBError(err)
 	}
 	defer resultRows.Close()
 
@@ -397,7 +397,7 @@ func (origin *TOOrigin) Create() (error, error, int) {
 
 	resultRows, err := origin.ReqInfo.Tx.NamedQuery(insertQuery(), origin)
 	if err != nil {
-		return api.ParseDBErr(err, origin.GetType())
+		return api.ParseDBError(err)
 	}
 	defer resultRows.Close()
 
diff --git a/traffic_ops/traffic_ops_golang/profileparameter/profile_parameters.go b/traffic_ops/traffic_ops_golang/profileparameter/profile_parameters.go
index 287b8db26..872cf65a1 100644
--- a/traffic_ops/traffic_ops_golang/profileparameter/profile_parameters.go
+++ b/traffic_ops/traffic_ops_golang/profileparameter/profile_parameters.go
@@ -124,7 +124,7 @@ func (pp *TOProfileParameter) Validate() error {
 func (pp *TOProfileParameter) Create() (error, error, int) {
 	resultRows, err := pp.APIInfo().Tx.NamedQuery(insertQuery(), pp)
 	if err != nil {
-		return api.ParseDBErr(err, pp.GetType())
+		return api.ParseDBError(err)
 	}
 	defer resultRows.Close()
 
diff --git a/traffic_ops/traffic_ops_golang/steeringtargets/steeringtargets.go b/traffic_ops/traffic_ops_golang/steeringtargets/steeringtargets.go
index 9642983e8..c205b0825 100644
--- a/traffic_ops/traffic_ops_golang/steeringtargets/steeringtargets.go
+++ b/traffic_ops/traffic_ops_golang/steeringtargets/steeringtargets.go
@@ -182,7 +182,7 @@ func (st *TOSteeringTargetV11) Create() (error, error, int) {
 
 	rows, err := st.ReqInfo.Tx.NamedQuery(insertQuery(), st)
 	if err != nil {
-		return api.ParseDBErr(err, st.GetType())
+		return api.ParseDBError(err)
 	}
 	defer rows.Close()
 
@@ -223,7 +223,7 @@ func (st *TOSteeringTargetV11) Update() (error, error, int) {
 
 	rows, err := st.ReqInfo.Tx.NamedQuery(updateQuery(), st)
 	if err != nil {
-		return api.ParseDBErr(err, st.GetType())
+		return api.ParseDBError(err)
 	}
 	defer rows.Close()
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services