Exemple #1
0
        public override async Task <ConvertDDLResponse> ConvertDDL(ConvertDDLRequest request, ServerCallContext context)
        {
            var sw = Stopwatch.StartNew();

            GrpcEnvironment.Logger.Info($@"Processing ConvertDDL Request");

            var databaseProject = new KDataStoreProject()
            {
                KickstartCRUDStoredProcedures = false, ConvertToSnakeCase = request.ConvertToSnakeCase,
                DataStoreType          = Utility.DataStoreTypes.Postgres,
                SqlTableText           = request.UnconvertedTableDDL,
                SqlTableTypeText       = request.UnconvertedTableTypeDDL,
                SqlStoredProcedureText = request.UnconvertedStoredProcedureDDL
            };

            var connectionString = "Server=localhost;";
            var outputRootPath   = string.Empty;

            _dbToKSolutionConverter.BuildSqlMeta(connectionString, outputRootPath, databaseProject);

            var response = new ConvertDDLResponse();
            ICSchemaToSchemaConverter                   schemaConverter;
            ICTableToTableConverter                     tableConverter;
            ICTableTypeToTableTypeConverter             tableTypeConverter;
            ICStoredProcedureToStoredProcedureConverter storedProcConverter;

            if (request.DatabaseType == Types.DatabaseTypes.Postgres)
            {
                schemaConverter     = new CSchemaToPostgresSchemaConverter();
                tableConverter      = new CTableToPostgresTableConverter();
                tableTypeConverter  = new CTableTypeToPostgresTableTypeConverter();
                storedProcConverter = new CStoredProcedureToPostgresStoredProcedureConverter();
            }
            else if (request.DatabaseType == Types.DatabaseTypes.SqlServer)
            {
                schemaConverter     = new CSchemaToSqlServerSchemaConverter();
                tableConverter      = new CTableToSqlServerTableConverter();
                tableTypeConverter  = new CTableTypeToSqlServerTableTypeConverter();
                storedProcConverter = new CStoredProcedureToSSqlServerStoredProcedureConverter();
            }
            else
            {
                throw new NotImplementedException();
            }

            var codeWriter          = new CodeWriter();
            var codeWriterTableType = new CodeWriter();

            var codeWriterStoredProc = new CodeWriter();

            using (var memoryStream = new MemoryStream( ))
            {
                using (var zipFile = new ZipArchive(memoryStream, ZipArchiveMode.Create))
                {
                    foreach (var schema in databaseProject.GetAllGeneratedSchemas())
                    {
                        if (request.DatabaseType == Types.DatabaseTypes.SqlServer && schema.SchemaName.ToLower() == "dbo")
                        {
                            continue;// dbo already exists on Sql Server
                        }

                        var ddl = schemaConverter.Convert(schema);

                        var fileName = _flywayFileNameService.GetFlywayFileName(schema);
                        //fileWriter.WriteFile(fileName, ddl);
                        var newEntry = zipFile.CreateEntry(Path.Combine("migrations", fileName));
                        using (var writer = new StreamWriter(newEntry.Open()))
                        {
                            writer.Write(ddl);
                        }
                    }
                    foreach (var table in databaseProject.Table)
                    {
                        var ddl = tableConverter.Convert(table.GeneratedTable);
                        codeWriter.WriteLine(ddl);
                        codeWriter.WriteLine();

                        var fileName = _flywayFileNameService.GetFlywayFileName(table.GeneratedTable);
                        //fileWriter.WriteFile(fileName, ddl);
                        var newEntry = zipFile.CreateEntry(Path.Combine("migrations", fileName));
                        using (var writer = new StreamWriter(newEntry.Open()))
                        {
                            writer.Write(ddl);
                        }
                    }
                    {
                        var rules = new CRules();

                        foreach (var table in databaseProject.Table)
                        {
                            var rList = _cTableToDmsRuleConverter.Convert(table.GeneratedTable);
                            rules.Rule.AddRange(rList);
                        }

                        var json     = rules.ToJson();
                        var fileName = "DmsRules.json";
                        var newEntry = zipFile.CreateEntry(fileName);
                        using (var writer = new StreamWriter(newEntry.Open()))
                        {
                            writer.Write(json);
                        }
                        response.ConvertedDmsJson = json;
                    }


                    foreach (var tableType in databaseProject.TableType)
                    {
                        var ddl = tableTypeConverter.Convert(tableType.GeneratedTableType);
                        codeWriterTableType.WriteLine(ddl);
                        codeWriterTableType.WriteLine();

                        var fileName = _flywayFileNameService.GetFlywayFileName(tableType.GeneratedTableType);
                        //fileWriter.WriteFile(fileName, ddl);
                        var newEntry = zipFile.CreateEntry(Path.Combine("migrations", fileName));
                        using (var writer = new StreamWriter(newEntry.Open()))
                        {
                            writer.Write(ddl);
                        }
                    }


                    foreach (var storedProc in databaseProject.StoredProcedure)
                    {
                        var ddl = storedProcConverter.Convert(storedProc.GeneratedStoredProcedure);
                        codeWriterStoredProc.WriteLine(ddl);
                        codeWriter.WriteLine();

                        var fileName = _flywayFileNameService.GetFlywayFileName(storedProc.GeneratedStoredProcedure);
                        //fileWriter.WriteFile(fileName, ddl);
                        var newEntry = zipFile.CreateEntry(Path.Combine("migrations", fileName));
                        using (var writer = new StreamWriter(newEntry.Open()))
                        {
                            writer.Write(ddl);
                        }
                    }
                }
                response.ZipAsBase64 = Convert.ToBase64String(memoryStream.ToArray());
            }
            response.ConvertedTableDDL           = codeWriter.ToString();
            response.ConvertedTableTypeDDL       = codeWriterTableType.ToString();
            response.ConvertedStoredProcedureDDL = codeWriterStoredProc.ToString();

            sw.Stop();
            GrpcEnvironment.Logger.Info($"Processed request in {sw.ElapsedMilliseconds} ms");
            return(response);
        }
        public override void Visit(CPart part)
        {
            if (part is CTableType)
            {
                var tableType = part as CTableType;
                //var ddl = (part as STableType).TableTypeBody;
                if (tableType.DatabaseType == Utility.DataStoreTypes.SqlServer)
                {
                    var converter = new CTableTypeToSqlServerTableTypeConverter();
                    var ddl       = converter.Convert(part as CTableType);
                    _codeWriter.Write(ddl);
                }
                else if (tableType.DatabaseType == Utility.DataStoreTypes.Postgres)
                {
                    var converter = new CTableTypeToPostgresTableTypeConverter();
                    var ddl       = converter.Convert(part as CTableType);
                    _codeWriter.Write(ddl);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            else if (part is CTable)
            {
                var table = part as CTable;

                if (table.DatabaseType == Utility.DataStoreTypes.SqlServer)
                {
                    if (!string.IsNullOrEmpty(table.TableText))
                    {
                        _codeWriter.Write(table.TableText);
                    }
                    else
                    {
                        var converter = new CTableToSqlServerTableConverter();
                        var ddl       = converter.Convert(table);

                        _codeWriter.Write(ddl);
                    }
                }
                else if (table.DatabaseType == Utility.DataStoreTypes.Postgres)
                {
                    var converter = new CTableToPostgresTableConverter();
                    var ddl       = converter.Convert(table);

                    _codeWriter.Write(ddl);
                }
                else if (table.DatabaseType == Utility.DataStoreTypes.MySql)
                {
                    var converter = new CTableToMySqlTableConverter();
                    var ddl       = converter.Convert(table);
                    _codeWriter.Write(ddl);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            else if (part is CView)
            {
                var ddl = (part as CView).ViewText;

                _codeWriter.Write(ddl);
            }
            else if (part is CSchema)
            {
                var schema = part as CSchema;
                if (schema.DatabaseType == Utility.DataStoreTypes.SqlServer)
                {
                    var converter = new CSchemaToSqlServerSchemaConverter();
                    var ddl       = converter.Convert(schema);
                    _codeWriter.Write(ddl);
                }
                else if (schema.DatabaseType == Utility.DataStoreTypes.Postgres)
                {
                    var converter = new CSchemaToPostgresSchemaConverter();
                    var ddl       = converter.Convert(schema);
                    _codeWriter.Write(ddl);
                }
                else if (schema.DatabaseType == Utility.DataStoreTypes.MySql)
                {
                    var converter = new CSchemaToMySqlSchemaConverter();
                    var ddl       = converter.Convert(schema);
                    _codeWriter.Write(ddl);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            else if (part is CStoredProcedure)
            {
                var storedProc = part as CStoredProcedure;
                ICStoredProcedureToStoredProcedureConverter converter = null;
                if (storedProc.DatabaseType == Utility.DataStoreTypes.SqlServer)
                {
                    converter = new CStoredProcedureToSSqlServerStoredProcedureConverter();
                }
                else if (storedProc.DatabaseType == Utility.DataStoreTypes.Postgres)
                {
                    converter = new CStoredProcedureToPostgresStoredProcedureConverter();
                }
                else
                {
                    throw new NotImplementedException();
                }

                var ddl = converter.Convert(storedProc);
                _codeWriter.Write(ddl);
            }
            else if (part is CRules)
            {
                var rules = part as CRules;
                var json  = rules.ToJson();
                _codeWriter.Write(json);
            }

            else if (part is CSeedScript)
            {
                var seedScript = part as CSeedScript;
                _codeWriter.Write(seedScript.SeedScriptBody);
            }
            else if (part is CProtoFile)
            {
                var protoFile = part as CProtoFile;

                if (!string.IsNullOrEmpty(protoFile.SourceProtoText))
                {
                    //source may have full comments
                    _codeWriter.Write(protoFile.SourceProtoText);
                }
                else
                {
                    var converter = new SProtoFileToProtoFileConverter();
                    _codeWriter.Write(converter.Convert(protoFile));
                }
            }
            else if (part is CProtoFileRef)
            {
                var protoFileRef = part as CProtoFileRef;
                var converter    = new SProtoFileToProtoFileConverter();
                _codeWriter.Write(converter.Convert(protoFileRef.ProtoFile));
            }
            else if (part is CText)
            {
                var textFile = part as CText;
                _codeWriter.Write(textFile.Text);
            }
            else if (part is CBatchFile)
            {
                var batchFile = part as CBatchFile;
                _codeWriter.Write(batchFile.BatchFileContent);
            }
            else
            {
                base.Visit(part);
            }
        }
Exemple #3
0
        private string InferStoredProcedures(KProtoFile kProtoFile)
        {
            var codeWriter = new CodeWriter();


            var convert = new CStoredProcedureToSSqlServerStoredProcedureConverter();

            foreach (var service in kProtoFile.GeneratedProtoFile.ProtoService)
            {
                foreach (var rpc in service.Rpc)
                {
                    var request = rpc.GetInnerMessageOrRequest();
                    //if  (!request.ProtoField.Any(f=>f.FieldType != GrpcType.__message))
                    //    continue;

                    var storedProc = new CStoredProcedure(DataStoreTypes.Unknown)
                    {
                        DerivedFrom         = request, // rpc,
                        Schema              = InferSchema(service),
                        StoredProcedureName = rpc.RpcName,
                        ResultSetName       = rpc.Response.MessageName + "Dto"//"ResultSet"
                    };

                    foreach (var pp in request.ProtoField)
                    {
                        var parameter = pp;
                        if (parameter.FieldType == GrpcType.__message)
                        {
                            //if the inner message is just a single scalar field, lets use that
                            var m = rpc.ProtoService.ProtoFile.ProtoMessage.FirstOrDefault(pm => pm.MessageName == parameter.MessageType);
                            if (m.ProtoField.Count == 1)
                            {
                                parameter = m.ProtoField.First();

                                /*
                                 * if (parameter.FieldType == GrpcType.__message)
                                 * {
                                 *  m = rpc.ProtoService.ProtoFile.ProtoMessage.FirstOrDefault(pm =>
                                 *      pm.MessageName == parameter.MessageType);
                                 *  if (m.ProtoField.Count == 1)
                                 *  {
                                 *      parameter = m.ProtoField.First();
                                 *
                                 *  }
                                 *  else if (m.ProtoField.Count > 1)
                                 *  {
                                 *      Debugger.Break();
                                 *
                                 *  }
                                 * }*/
                            }
                            else if (m.ProtoField.Count > 1)
                            {
                                /*
                                 * //todo: we need to pass table valued parameters to query
                                 * Debugger.Break();
                                 * parameter = m.ProtoField.First();
                                 *
                                 * if (parameter.FieldType == GrpcType.__message)
                                 * {
                                 *  m = rpc.ProtoService.ProtoFile.ProtoMessage.FirstOrDefault(pm =>
                                 *      pm.MessageName == parameter.MessageType);
                                 *  if (m.ProtoField.Count == 1)
                                 *  {
                                 *      parameter = m.ProtoField.First();
                                 *
                                 *  }
                                 *  else if (m.ProtoField.Count > 1)
                                 *  {
                                 *      //todo: we need to pass table valued parameters to query
                                 *      Debugger.Break();
                                 *      parameter = m.ProtoField.First();
                                 *
                                 *  }
                                 * }
                                 */
                            }
                        }

                        var p = InferStoredProcedureParameter(parameter);
                        if (!storedProc.Parameter.Exists(p2 => p2.ParameterName == p.ParameterName))
                        {
                            storedProc.Parameter.Add(p);
                        }
                    }

                    var tables   = new List <CTable>();
                    var request2 = rpc.GetInnerMessageOrRequest();

                    InferTable(tables, rpc, request2, null);
                    var table = tables.First();

                    if (rpc.OperationIs.HasFlag(COperationIs.Get) ||
                        rpc.OperationIs.HasFlag(COperationIs.Find) ||
                        rpc.OperationIs.HasFlag(COperationIs.List) ||
                        rpc.OperationIs.HasFlag(COperationIs.Read) ||
                        rpc.OperationIs.HasFlag(COperationIs.Dequeue) ||
                        rpc.OperationIs.HasFlag(COperationIs.Check)
                        )
                    {
                        storedProc.StoredProcedureBody = $@"SELECT {table.ColumnAsColumnList()} FROM {table.Schema.SchemaName.WrapReservedAndSnakeCase(DataStoreTypes.SqlServer, false)}.{table.TableName.WrapReservedAndSnakeCase(DataStoreTypes.SqlServer, false)}";
                    }
                    else if (rpc.OperationIs.HasFlag(COperationIs.Set) ||
                             rpc.OperationIs.HasFlag(COperationIs.Update) ||
                             rpc.OperationIs.HasFlag(COperationIs.Create))
                    {
                        storedProc.StoredProcedureBody = $@"PRINT 'todo: UPDATE {table.Schema.SchemaName}.{table.TableName} SET ....'";
                    }

                    codeWriter.WriteLine(convert.Convert(storedProc));
                    codeWriter.WriteLine();
                    codeWriter.WriteLine("GO");
                    codeWriter.WriteLine();

                    this.StoredProcedure.Add(new KStoredProcedure
                    {
                        StoredProcedureName = storedProc.StoredProcedureName,
                        Schema = storedProc.Schema.SchemaName,
                        ReturnsMultipleRows = storedProc.ReturnsMultipleRows,

                        ResultSetName            = storedProc.ResultSetName,
                        ParameterSetName         = storedProc.ParameterSetName,
                        DerivedFrom              = storedProc.DerivedFrom,
                        GeneratedStoredProcedure = storedProc
                    });
                }
            }
            return(codeWriter.ToString());
        }