func UpdateTableSchema()

in webv2/table/update_table_schema.go [61:152]


func UpdateTableSchema(w http.ResponseWriter, r *http.Request) {
	reqBody, err := ioutil.ReadAll(r.Body)
	if err != nil {
		http.Error(w, fmt.Sprintf("Body Read Error : %v", err), http.StatusInternalServerError)
		return
	}
	var t updateTable

	tableId := r.FormValue("table")

	err = json.Unmarshal(reqBody, &t)
	if err != nil {
		http.Error(w, fmt.Sprintf("Request Body parse error : %v", err), http.StatusBadRequest)
		return
	}

	sessionState := session.GetSessionState()
	sessionState.Conv.ConvLock.Lock()
	defer sessionState.Conv.ConvLock.Unlock()

	var conv *internal.Conv
	conv = nil
	conv = sessionState.Conv

	for colId, v := range t.UpdateCols {

		if v.Add {
			addColumn(tableId, colId, conv)
		}

		if v.Removed {
			RemoveColumn(tableId, colId, conv)
		}

		if v.Rename != "" && v.Rename != conv.SpSchema[tableId].ColDefs[colId].Name {

			oldName := conv.SrcSchema[tableId].ColDefs[colId].Name

			// Use a regular expression to match the exact column name
			re := regexp.MustCompile(`\b` + regexp.QuoteMeta(oldName) + `\b`)

			for i := range conv.SpSchema[tableId].CheckConstraints {
				originalString := conv.SpSchema[tableId].CheckConstraints[i].Expr
				updatedValue := re.ReplaceAllString(originalString, v.Rename)
				conv.SpSchema[tableId].CheckConstraints[i].Expr = updatedValue
			}

			renameColumn(v.Rename, tableId, colId, conv)
		}

		_, found := conv.SrcSchema[tableId].ColDefs[colId]
		if v.ToType != "" && found {

			typeChange, err := utilities.IsTypeChanged(v.ToType, tableId, colId, conv)
			if err != nil {
				http.Error(w, err.Error(), http.StatusBadRequest)
				return
			}

			if typeChange {
				UpdateColumnType(v.ToType, tableId, colId, conv, w)
			}
		}

		if v.NotNull != "" {
			UpdateNotNull(v.NotNull, tableId, colId, conv)
		}
		if v.MaxColLength != "" {
			UpdateColumnSize(v.MaxColLength, tableId, colId, conv)
		}
		if !v.Removed {
			sequences := UpdateAutoGenCol(v.AutoGen, tableId, colId, conv)
			conv.SpSequences = sequences
			UpdateDefaultValue(v.DefaultValue, tableId, colId, conv)
		}
	}

	common.ComputeNonKeyColumnSize(conv, tableId)

	delete(conv.SpSchema[tableId].ColDefs, "")
	sessionState.Conv = conv

	session.UpdateSessionFile()

	convm := session.ConvWithMetadata{
		SessionMetadata: sessionState.SessionMetadata,
		Conv:            *sessionState.Conv,
	}

	w.WriteHeader(http.StatusOK)
	json.NewEncoder(w).Encode(convm)
}