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)
}