func handleReadServerCheck()

in traffic_ops/traffic_ops_golang/servercheck/servercheck.go [216:390]


func handleReadServerCheck(inf *api.Info, tx *sql.Tx) ([]tc.GenericServerCheck, error, error, int) {
	extensions := make(map[string]string)

	// Query Parameters to Database Query column mappings
	queryParamsToQueryCols := map[string]dbhelpers.WhereColumnInfo{
		"id":       dbhelpers.WhereColumnInfo{Column: "servercheck.server", Checker: api.IsInt},
		"hostName": dbhelpers.WhereColumnInfo{Column: "server.host_name"},
	}

	where, orderBy, pagination, queryValues, errs := dbhelpers.BuildWhereAndOrderByAndPagination(inf.Params, queryParamsToQueryCols)
	if len(errs) > 0 {
		return nil, util.JoinErrs(errs), nil, http.StatusBadRequest
	}
	// where clause is different for servercheck and server table. Also, it differs for the query param.
	var whereSC, whereSI string
	if len(inf.Params) < 1 {
		whereSI = "WHERE type.name LIKE 'MID%' OR type.name LIKE 'EDGE%' "
		whereSC = ""
	} else if len(inf.Params) == 1 {
		if _, ok := inf.Params["hostName"]; ok {
			whereSI = "WHERE (type.name LIKE 'MID%' OR type.name LIKE 'EDGE%') AND server.host_name=:hostName "
			whereSC = ""
		} else if _, ok = inf.Params["id"]; ok {
			whereSI = "WHERE (type.name LIKE 'MID%' OR type.name LIKE 'EDGE%') AND server.id=:id "
			whereSC = where
		} else {
			whereSI = "WHERE type.name LIKE 'MID%' OR type.name LIKE 'EDGE%' "
			whereSC = ""
		}
	} else if len(inf.Params) > 1 {
		_, ok := inf.Params["id"]
		_, ok1 := inf.Params["hostName"]
		if ok && ok1 {
			whereSI = "WHERE (type.name LIKE 'MID%' OR type.name LIKE 'EDGE%') AND (server.host_name=:hostName AND server.id=:id)"
			whereSC = "WHERE servercheck.server=:id"
		} else if ok && !ok1 {
			whereSI = "WHERE (type.name LIKE 'MID%' OR type.name LIKE 'EDGE%') AND server.id=:id "
			whereSC = "WHERE servercheck.server=:id"
		} else if ok1 && !ok {
			whereSI = "WHERE (type.name LIKE 'MID%' OR type.name LIKE 'EDGE%') AND server.host_name=:hostName "
			whereSC = ""
		} else {
			whereSI = "WHERE type.name LIKE 'MID%' OR type.name LIKE 'EDGE%' "
			whereSC = ""
		}
	}

	extRows, err := tx.Query(extensionsQuery)
	if err != nil {
		sysErr := fmt.Errorf("querying for extensions: %v", err)
		return nil, nil, sysErr, http.StatusInternalServerError
	}
	for extRows.Next() {
		var shortName string
		var checkName string
		if err = extRows.Scan(&shortName, &checkName); err != nil {
			sysErr := fmt.Errorf("scanning extension: %v", err)
			return nil, nil, sysErr, http.StatusInternalServerError
		}
		extensions[shortName] = checkName
	}

	querySC := serverChecksQuery + whereSC + orderBy + pagination
	colRows, err := inf.Tx.NamedQuery(querySC, queryValues)
	if err != nil {
		sysErr := fmt.Errorf("querying serverchecks columns: %v", err)
		return nil, nil, sysErr, http.StatusInternalServerError
	}

	columns := make(map[int]tc.ServerCheckColumns)
	for colRows.Next() {
		var cols tc.ServerCheckColumns
		if err = colRows.StructScan(&cols); err != nil {
			sysErr := fmt.Errorf("scanning server checks columns: %v", err)
			return nil, nil, sysErr, http.StatusInternalServerError
		}
		columns[cols.Server] = cols
	}

	orderBySI := orderBy + "ORDER BY hostName ASC"
	querySI := serverInfoQuery + whereSI + orderBySI + pagination
	serverRows, err := inf.Tx.NamedQuery(querySI, queryValues)
	if err != nil {
		sysErr := fmt.Errorf("querying server info for checks: %v", err)
		return nil, nil, sysErr, http.StatusInternalServerError
	}

	data := []tc.GenericServerCheck{}
	for serverRows.Next() {
		var serverInfo tc.GenericServerCheck
		if err = serverRows.Scan(&serverInfo.HostName, &serverInfo.ID, &serverInfo.Profile, &serverInfo.AdminState, &serverInfo.CacheGroup, &serverInfo.Type, &serverInfo.UpdPending, &serverInfo.RevalPending); err != nil {
			sysErr := fmt.Errorf("scanning server info for checks: %v", err)
			return nil, nil, sysErr, http.StatusInternalServerError
		}

		serverCheckCols, ok := columns[serverInfo.ID]
		if ok {
			serverInfo.Checks = make(map[string]*int)
		} else {
			data = append(data, serverInfo)
			continue
		}

		for colName, checkName := range extensions {
			switch colName {
			case "aa":
				serverInfo.Checks[checkName] = serverCheckCols.AA
			case "ab":
				serverInfo.Checks[checkName] = serverCheckCols.AB
			case "ac":
				serverInfo.Checks[checkName] = serverCheckCols.AC
			case "ad":
				serverInfo.Checks[checkName] = serverCheckCols.AD
			case "ae":
				serverInfo.Checks[checkName] = serverCheckCols.AE
			case "af":
				serverInfo.Checks[checkName] = serverCheckCols.AF
			case "ag":
				serverInfo.Checks[checkName] = serverCheckCols.AG
			case "ah":
				serverInfo.Checks[checkName] = serverCheckCols.AH
			case "ai":
				serverInfo.Checks[checkName] = serverCheckCols.AI
			case "aj":
				serverInfo.Checks[checkName] = serverCheckCols.AJ
			case "ak":
				serverInfo.Checks[checkName] = serverCheckCols.AK
			case "al":
				serverInfo.Checks[checkName] = serverCheckCols.AL
			case "am":
				serverInfo.Checks[checkName] = serverCheckCols.AM
			case "an":
				serverInfo.Checks[checkName] = serverCheckCols.AN
			case "ao":
				serverInfo.Checks[checkName] = serverCheckCols.AO
			case "ap":
				serverInfo.Checks[checkName] = serverCheckCols.AP
			case "aq":
				serverInfo.Checks[checkName] = serverCheckCols.AQ
			case "ar":
				serverInfo.Checks[checkName] = serverCheckCols.AR
			case "at":
				serverInfo.Checks[checkName] = serverCheckCols.AT
			case "au":
				serverInfo.Checks[checkName] = serverCheckCols.AU
			case "av":
				serverInfo.Checks[checkName] = serverCheckCols.AV
			case "aw":
				serverInfo.Checks[checkName] = serverCheckCols.AW
			case "ax":
				serverInfo.Checks[checkName] = serverCheckCols.AX
			case "ay":
				serverInfo.Checks[checkName] = serverCheckCols.AY
			case "az":
				serverInfo.Checks[checkName] = serverCheckCols.AZ
			case "ba":
				serverInfo.Checks[checkName] = serverCheckCols.BA
			case "bb":
				serverInfo.Checks[checkName] = serverCheckCols.BB
			case "bc":
				serverInfo.Checks[checkName] = serverCheckCols.BC
			case "bd":
				serverInfo.Checks[checkName] = serverCheckCols.BD
			case "be":
				serverInfo.Checks[checkName] = serverCheckCols.BE
			case "bf":
				serverInfo.Checks[checkName] = serverCheckCols.BF
			}
		}

		data = append(data, serverInfo)
	}

	return data, nil, nil, http.StatusOK
}