in webv2/api/schema.go [308:367]
func GetTypeMap(w http.ResponseWriter, r *http.Request) {
sessionState := session.GetSessionState()
if sessionState.Conv == nil || sessionState.Driver == "" {
http.Error(w, fmt.Sprintf("Schema is not converted or Driver is not configured properly. Please retry converting the database to Spanner."), http.StatusNotFound)
return
}
sessionState.Conv.ConvLock.Lock()
defer sessionState.Conv.ConvLock.Unlock()
var typeMap map[string][]types.TypeIssue
initializeTypeMap()
switch sessionState.Driver {
case constants.MYSQL, constants.MYSQLDUMP:
typeMap = mysqlTypeMap
case constants.POSTGRES, constants.PGDUMP:
typeMap = postgresTypeMap
case constants.SQLSERVER:
typeMap = sqlserverTypeMap
case constants.ORACLE:
typeMap = oracleTypeMap
default:
http.Error(w, fmt.Sprintf("Driver : '%s' is not supported", sessionState.Driver), http.StatusBadRequest)
return
}
// Filter typeMap so it contains just the types SrcSchema uses.
filteredTypeMap := make(map[string][]types.TypeIssue)
for _, srcTable := range sessionState.Conv.SrcSchema {
for _, colDef := range srcTable.ColDefs {
if _, ok := filteredTypeMap[colDef.Type.Name]; ok {
continue
}
// Timestamp and interval types do not have exact key in typemap.
// Typemap for TIMESTAMP(6), TIMESTAMP(6) WITH LOCAL TIMEZONE,TIMESTAMP(6) WITH TIMEZONE is stored into TIMESTAMP key.
// Same goes with interval types like INTERVAL YEAR(2) TO MONTH, INTERVAL DAY(2) TO SECOND(6) etc.
// If exact key not found then check with regex.
if _, ok := typeMap[colDef.Type.Name]; !ok {
if oracle.TimestampReg.MatchString(colDef.Type.Name) {
filteredTypeMap[colDef.Type.Name] = typeMap["TIMESTAMP"]
} else if oracle.IntervalReg.MatchString(colDef.Type.Name) {
filteredTypeMap[colDef.Type.Name] = typeMap["INTERVAL"]
}
continue
}
filteredTypeMap[colDef.Type.Name] = typeMap[colDef.Type.Name]
}
}
for key, values := range filteredTypeMap {
for i := range values {
if sessionState.Dialect == constants.DIALECT_POSTGRESQL {
spType := ddl.Type{
Name: filteredTypeMap[key][i].T,
}
filteredTypeMap[key][i].DisplayT = ddl.GetPGType(spType)
} else {
filteredTypeMap[key][i].DisplayT = filteredTypeMap[key][i].T
}
}
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(filteredTypeMap)
}