func()

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