in webv2/api/schema.go [69:161]
func (expressionVerificationHandler *ExpressionsVerificationHandler) ConvertSchemaSQL(w http.ResponseWriter, r *http.Request) {
sessionState := session.GetSessionState()
if sessionState.SourceDB == nil || sessionState.DbName == "" || sessionState.Driver == "" {
http.Error(w, fmt.Sprintf("Database is not configured or Database connection is lost. Please set configuration and connect to database."), http.StatusNotFound)
return
}
conv := internal.MakeConv()
conv.SpDialect = sessionState.Dialect
conv.SpProjectId = sessionState.SpannerProjectId
conv.SpInstanceId = sessionState.SpannerInstanceID
conv.Source = sessionState.Driver
conv.IsSharded = sessionState.IsSharded
conv.SpProjectId = sessionState.SpannerProjectId
conv.SpInstanceId = sessionState.SpannerInstanceID
conv.Source = sessionState.Driver
var err error
additionalSchemaAttributes := internal.AdditionalSchemaAttributes{
IsSharded: sessionState.IsSharded,
}
processSchema := common.ProcessSchemaImpl{}
ctx := context.Background()
ddlVerifier, err := expressions_api.NewDDLVerifierImpl(ctx, conv.SpProjectId, conv.SpInstanceId)
if err != nil {
http.Error(w, fmt.Sprintf("Schema Conversion Error : %v", err), http.StatusNotFound)
return
}
schemaToSpanner := common.SchemaToSpannerImpl{
ExpressionVerificationAccessor: expressionVerificationHandler.ExpressionVerificationAccessor,
DdlV: ddlVerifier,
}
switch sessionState.Driver {
case constants.MYSQL:
err = processSchema.ProcessSchema(conv, mysql.InfoSchemaImpl{DbName: sessionState.DbName, Db: sessionState.SourceDB}, common.DefaultWorkers, additionalSchemaAttributes, &schemaToSpanner, &common.UtilsOrderImpl{}, &common.InfoSchemaImpl{})
case constants.POSTGRES:
temp := false
err = processSchema.ProcessSchema(conv, postgres.InfoSchemaImpl{Db: sessionState.SourceDB, IsSchemaUnique: &temp}, common.DefaultWorkers, additionalSchemaAttributes, &schemaToSpanner, &common.UtilsOrderImpl{}, &common.InfoSchemaImpl{})
case constants.SQLSERVER:
err = processSchema.ProcessSchema(conv, sqlserver.InfoSchemaImpl{DbName: sessionState.DbName, Db: sessionState.SourceDB}, common.DefaultWorkers, additionalSchemaAttributes, &schemaToSpanner, &common.UtilsOrderImpl{}, &common.InfoSchemaImpl{})
case constants.ORACLE:
err = processSchema.ProcessSchema(conv, oracle.InfoSchemaImpl{DbName: strings.ToUpper(sessionState.DbName), Db: sessionState.SourceDB}, common.DefaultWorkers, additionalSchemaAttributes, &schemaToSpanner, &common.UtilsOrderImpl{}, &common.InfoSchemaImpl{})
default:
http.Error(w, fmt.Sprintf("Driver : '%s' is not supported", sessionState.Driver), http.StatusBadRequest)
return
}
if err != nil {
http.Error(w, fmt.Sprintf("Schema Conversion Error : %v", err), http.StatusNotFound)
return
}
sessionState.Conv.ConvLock.Lock()
defer sessionState.Conv.ConvLock.Unlock()
sessionState.Conv = conv
if sessionState.IsSharded {
setShardIdColumnAsPrimaryKey(true)
addShardIdColumnToForeignKeys(true)
ruleId := internal.GenerateRuleId()
rule := internal.Rule{
Id: ruleId,
Name: ruleId,
Type: constants.AddShardIdPrimaryKey,
AssociatedObjects: "All Tables",
Data: types.ShardIdPrimaryKey{
AddedAtTheStart: true,
},
Enabled: true,
}
sessionState := session.GetSessionState()
sessionState.Conv.Rules = append(sessionState.Conv.Rules, rule)
session.UpdateSessionFile()
}
primarykey.DetectHotspot()
index.IndexSuggestion()
sessionMetadata := session.SessionMetadata{
SessionName: "NewSession",
DatabaseType: sessionState.Driver,
DatabaseName: sessionState.DbName,
Dialect: sessionState.Dialect,
}
convm := session.ConvWithMetadata{
SessionMetadata: sessionMetadata,
Conv: *sessionState.Conv,
}
sessionState.SessionMetadata = sessionMetadata
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(convm)
}