Example #1
0
        private int Scaffold(
            ScaffoldOptions settings,
            ScaffoldInterceptors?interceptors,
            string provider,
            string?providerLocation,
            string connectionString,
            string?additionalConnectionString,
            string output,
            bool overwrite)
        {
            using var dc  = GetConnection(provider, providerLocation, connectionString, additionalConnectionString, out var secondaryConnection);
            using var sdc = secondaryConnection;
            if (dc == null)
            {
                return(StatusCodes.EXPECTED_ERROR);
            }

            var language = LanguageProviders.CSharp;

            var                  legacyProvider       = new LegacySchemaProvider(dc, settings.Schema, language);
            ISchemaProvider      schemaProvider       = legacyProvider;
            ITypeMappingProvider typeMappingsProvider = legacyProvider;

            if (sdc != null)
            {
                var secondLegacyProvider = new LegacySchemaProvider(sdc, settings.Schema, language);
                schemaProvider       = new MergedAccessSchemaProvider(legacyProvider, secondLegacyProvider);
                typeMappingsProvider = new AggregateTypeMappingsProvider(legacyProvider, secondLegacyProvider);
            }

            var generator  = new Scaffolder(LanguageProviders.CSharp, HumanizerNameConverter.Instance, settings, interceptors);
            var dataModel  = generator.LoadDataModel(schemaProvider, typeMappingsProvider);
            var sqlBuilder = dc.DataProvider.CreateSqlBuilder(dc.MappingSchema);
            var files      = generator.GenerateCodeModel(
                sqlBuilder,
                dataModel,
                MetadataBuilders.GetAttributeBasedMetadataBuilder(generator.Language, sqlBuilder),
                SqlBoolEqualityConverter.Create(generator.Language));
            var sourceCode = generator.GenerateSourceCode(files);

            Directory.CreateDirectory(output);

            for (var i = 0; i < sourceCode.Length; i++)
            {
                // TODO: add file name normalization/deduplication?
                var fileName = Path.Combine(output, sourceCode[i].FileName);
                if (File.Exists(fileName) && !overwrite)
                {
                    Console.WriteLine($"File '{fileName}' already exists. Specify '--overwrite true' option if you want to ovrerwrite existing files");
                    return(StatusCodes.EXPECTED_ERROR);
                }

                File.WriteAllText(fileName, sourceCode[i].Code);
            }

            return(StatusCodes.SUCCESS);
        }