public ActionResult <ExportResult> Export(ExportLayout layout)
        {
            ExportImportService <T> tempService = new ExportImportService <T>(_context);
            var export = tempService.GetExportResult(layout);

            return(Ok(export));
        }
        public void GetExportZip(ExportLayout exportLayout, string outputfile)
        {
            List <SimpleExportResult> exportResults = GetExportResult(exportLayout);

            foreach (SimpleExportResult simpleExportResult in exportResults)
            {
                File.WriteAllText(Path.Combine(outputfile, simpleExportResult.EntityName + ".json"), JsonConvert.SerializeObject(simpleExportResult, Formatting.None, new JsonSerializerSettings()
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                }));
            }

            /*
             * using (FileStream stream = new FileStream(outputfile, FileMode.Create))
             * {
             *              ZipArchive archiv = new ZipArchive(stream, ZipArchiveMode.Create);
             *              foreach (SimpleExportResult result in exportResults)
             *              {
             *                              ZipArchiveEntry entry = archiv.CreateEntry(result.EntityName + ".json");
             *                              using (Stream entryStream = entry.Open())
             *                              {
             *                                              var sw = new StreamWriter(entryStream, System.Text.Encoding.UTF8);
             *                                              sw.Write(JsonConvert.SerializeObject(result));
             *                                              sw.Flush();
             *                                              entryStream.Close();
             *                              }
             *              }
             * }*/
        }
        public void GetLevel3Test()
        {
            InitData("GetLevel3Test");
            var exportLayout = new ExportLayout()
            {
                EntityPrimaryKey   = "Id",
                EntityPrimaryValue = "542c31f0-35e3-4a7d-a939-803f18f94669",
                Includes           = (new List <ExportInclude>()
                {
                    new ExportInclude()
                    {
                        Include = "SecondTableRows",
                        SubIncludes = (new List <ExportInclude>()
                        {
                            new ExportInclude()
                            {
                                Include = "ThirdTableRows"
                            }
                        }).ToArray()
                    }
                }).ToArray()
            };
            var exportResult = _exportService.GetExportResult(exportLayout);

            Assert.True(exportResult.EntityData != null);
            Assert.True(exportResult.AdditionalData.Length == 0);
            Assert.True(((Table1)exportResult.EntityData).Id == Guid.Parse("542c31f0-35e3-4a7d-a939-803f18f94669"));
            Assert.True(((Table1)exportResult.EntityData).SecondTableRows.Count == 1);
            Assert.True(((Table1)exportResult.EntityData).SecondTableRows.First().ThirdTableRows.Count == 1);
        }
        public ActionResult <ExportModel> ExportFile(ExportLayout layout)
        {
            // Save exportlayout for local export
            ExportModel toSaveExport = new ExportModel();

            toSaveExport.ExportLayout = JsonConvert.SerializeObject(layout);
            _context.Exports.Add(toSaveExport);
            _context.SaveChanges();
            return(Ok(toSaveExport));
        }
        public void GetLevel1Test()
        {
            InitData("GetLevel1Test");
            var exportLayout = new ExportLayout()
            {
                UseModelAttributes = false,
                EntityPrimaryKey   = "Id",
                EntityPrimaryValue = "542c31f0-35e3-4a7d-a939-803f18f94669",
                AdditionalData     = new ExportLayout[] { }
            };
            var exportResult = _exportService.GetExportResult(exportLayout);

            Assert.True(exportResult.EntityData != null);
            Assert.True(exportResult.AdditionalData.Length == 0);
            Assert.True(((Table1)exportResult.EntityData).Id == Guid.Parse("542c31f0-35e3-4a7d-a939-803f18f94669"));
            Assert.True(((Table1)exportResult.EntityData).SecondTableRows == null);
        }
        public void GetLevelAdditionalDataTest()
        {
            InitData("GetLevelAdditionalDataTest");
            var exportLayout = new ExportLayout()
            {
                EntityPrimaryKey   = "Id",
                EntityPrimaryValue = "542c31f0-35e3-4a7d-a939-803f18f94669",
                Includes           = (new List <ExportInclude>()
                {
                    new ExportInclude()
                    {
                        Include = "SecondTableRows",
                        SubIncludes = (new List <ExportInclude>()
                        {
                            new ExportInclude()
                            {
                                Include = "ThirdTableRows"
                            }
                        }).ToArray()
                    }
                }).ToArray(),
                AdditionalData = new ExportLayout[] {
                    new ExportLayout()
                    {
                        EntityName         = "AdditionalData",
                        EntityPrimaryValue = "cca5e277-77e7-4d70-9eb1-067156222da3"
                    }
                }
            };
            var exportResult = _exportService.GetExportResult(exportLayout);

            Assert.True(exportResult.EntityData != null);
            Assert.True(((Table1)exportResult.EntityData).Id == Guid.Parse("542c31f0-35e3-4a7d-a939-803f18f94669"));
            Assert.True(((Table1)exportResult.EntityData).SecondTableRows.Count == 1);
            Assert.True(((Table1)exportResult.EntityData).SecondTableRows.First().ThirdTableRows.Count == 1);
            Assert.True(exportResult.AdditionalData.Length > 0);
            Assert.True(((AdditionalData)((ExportResult)exportResult.AdditionalData.First()).EntityData).Name == "TestAdditional");
        }
        /// <summary>
        /// Collects data from database and returns it
        /// </summary>
        /// <param name="exportLayout"></param>
        /// <returns></returns>
        public List <SimpleExportResult> GetExportResult(ExportLayout exportLayout, bool loadAdditionalData = true)
        {
            var properties = _context.GetType().GetProperties();
            Dictionary <string, SimpleExportResult> exports = new Dictionary <string, SimpleExportResult>();

            PropertyInfo setType = properties.Where(p => p.PropertyType.IsGenericType &&
                                                    p.PropertyType.GetGenericArguments()[0] == typeof(T)).FirstOrDefault();

            if (setType != null)
            {
                Type[] typeArgs    = { typeof(T) };
                Type   genericType = typeof(DbSet <>);

                IQueryable <T> queryable = GetSet(_context).AsNoTracking <T>();
                if (exportLayout.EntityPrimaryValue != null)
                {
                    if (exportLayout.EntityPrimaryKeyType == null || exportLayout.EntityPrimaryKeyType == "")
                    {
                        // Get the key property
                        foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
                        {
                            if (Attribute.IsDefined(propertyInfo, typeof(KeyAttribute)))
                            {
                                exportLayout.EntityPrimaryKey     = propertyInfo.Name;
                                exportLayout.EntityPrimaryKeyType = propertyInfo.PropertyType.Name.ToUpper();
                                break;
                            }
                        }
                    }
                    if (exportLayout.EntityPrimaryKey != null &&
                        (exportLayout.EntityPrimaryKeyType == null || exportLayout.EntityPrimaryKeyType == ""))
                    {
                        PropertyInfo propertyInfo = typeof(T).GetProperty(exportLayout.EntityPrimaryKey);
                        exportLayout.EntityPrimaryKeyType = propertyInfo.PropertyType.Name.ToUpper();
                    }
                    string equalString = "";
                    if (exportLayout.EntityPrimaryKeyType != null && exportLayout.EntityPrimaryValue != "")
                    {
                        switch (exportLayout.EntityPrimaryKeyType.ToUpper())
                        {
                        case "GUID":
                            equalString = string.Format(".Equals(Guid.Parse(\"{0}\"))", exportLayout.EntityPrimaryValue);
                            break;

                        case "STRING":
                            equalString = string.Format("== \"{0}\"", exportLayout.EntityPrimaryValue);
                            break;

                        case "INT":
                            equalString = string.Format("== {0}", exportLayout.EntityPrimaryValue);
                            break;
                        }
                        Expression <Func <T, bool> > expression = DynamicExpressionParser.ParseLambda <T, bool>(null, false,
                                                                                                                exportLayout.EntityPrimaryKey + equalString);
                        queryable = queryable.Where(expression);
                    }
                }

                // Get Includes from Attributes
                if (exportLayout.Includes == null && exportLayout.UseModelAttributes)
                {
                    exportLayout.Includes = GetIncludesFromAttribute(typeof(T));
                }

                if (exportLayout.Includes != null)
                {
                    foreach (ExportInclude include in exportLayout.Includes)
                    {
                        queryable = SetIncludes(queryable, include);
                    }
                }

                if (exportLayout.AdditionalData == null && loadAdditionalData && exportLayout.UseModelAttributes)
                {
                    List <ExportLayout> additionalDataTables = new List <ExportLayout>();
                    foreach (PropertyInfo additionalData in properties.Where(p => p.PropertyType.IsGenericType &&
                                                                             Attribute.IsDefined(p.PropertyType.GetGenericArguments()[0], typeof(AdditionalDataAttribute))).ToList())
                    {
                        additionalDataTables.Add(new ExportLayout()
                        {
                            EntityName = additionalData.PropertyType.GetGenericArguments()[0].Name
                        });
                    }
                    if (additionalDataTables.Count > 0)
                    {
                        exportLayout.AdditionalData = additionalDataTables.ToArray();
                    }
                }

                List <ExportResult> additionalDatas = new List <ExportResult>();
                if (exportLayout.AdditionalData != null && loadAdditionalData)
                {
                    Type additionalType = typeof(ExportImportService <>);
                    foreach (ExportLayout subLayout in exportLayout.AdditionalData)
                    {
                        PropertyInfo setAdditionalType = properties.Where(p => p.PropertyType.IsGenericType &&
                                                                          p.PropertyType.GetGenericArguments()[0].Name == subLayout.EntityName).FirstOrDefault();

                        var    addionalInstance = additionalType.MakeGenericType(setAdditionalType.PropertyType.GetGenericArguments()[0]);
                        object subExportLayout  = Activator.CreateInstance(addionalInstance, new object[] { _context });

                        List <SimpleExportResult> tempExportResults = ((IExportImportService)subExportLayout).GetExportResult(subLayout, false);

                        foreach (SimpleExportResult temp in tempExportResults)
                        {
                            exports.Add(temp.EntityName, temp);
                        }
                    }
                }

                T entity = queryable.FirstOrDefault();

                // We get all Properties witch are relation classes
                if (entity != null)
                {
                    exports = Helpers.GetExportResult <T>(entity, exports);
                }
            }
            return(exports.Values.ToList());
        }
Example #8
0
        static void Main(string[] args)
        {
            /*args = new string[] {
             *  "--applychanges",
             *  "--ModelName",
             *  "Table1",
             *  "--WorkingFile",
             *  @"C:\Users\Coni\Downloads\output.json",
             *  "--SecondFile", @"C:\Users\Coni\Downloads\second.json",
             *  "--StatementsOutput", @"C:\Users\Coni\Downloads\output.json"
             * };*/
            Parser.Default.ParseArguments <Options>(args)
            .WithParsed <Options>(o =>
            {
                DbContextOptionsBuilder dbContextOptionBuilder = new DbContextOptionsBuilder();
                dbContextOptionBuilder.EnableSensitiveDataLogging(true);
                dbContextOptionBuilder.UseLoggerFactory(loggerFactory);
                dbContextOptionBuilder.UseSqlServer("Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=DatabaseCaseExtractorDb;Integrated Security=SSPI;");
                DatabaseContext context = new DatabaseContext(dbContextOptionBuilder.Options);

                if (o.ModelName == "")
                {
                    new Exception("We need a model-name for an export");
                }
                if (o.ExportProcess)
                {
                    if (o.WorkingFile == "")
                    {
                        new Exception("We need a working-file for an export");
                    }

                    ExportLayout exportLayout = new ExportLayout();
                    exportLayout.EntityName   = o.ModelName;
                    if (o.PrimaryKeyValue != "")
                    {
                        exportLayout.EntityPrimaryValue = o.PrimaryKeyValue;
                    }
                    ExportResult exportResult = ((IExportImportService)GetExportImportService(context, exportLayout.EntityName))
                                                .GetExportResult(exportLayout);
                    File.WriteAllText(o.WorkingFile,
                                      JsonConvert.SerializeObject(
                                          exportResult,
                                          Formatting.Indented,
                                          new JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                    }
                                          )
                                      );
                }
                else if (o.ImportProcess)
                {
                    if (o.WorkingFile == "")
                    {
                        new Exception("We need a working-file for an import");
                    }
                    ExportResult exportResult = JsonConvert.DeserializeObject <ExportResult>(File.ReadAllText(o.WorkingFile));
                    ((IExportImportService)GetExportImportService(context, o.ModelName))
                    .SetImportResult(exportResult);
                }
                else if (o.StatementProcess)
                {
                    if (o.WorkingFile == "")
                    {
                        new Exception("We need a working-file for a statetment");
                    }
                    if (o.SecondFile == "")
                    {
                        new Exception("We need a second-file for an  statetment");
                    }
                    List <LogEntry> entries = ((IExportImportService)GetExportImportService(context, o.ModelName))
                                              .ExportSQLScripts(
                        JsonConvert.DeserializeObject <ExportResult>(File.ReadAllText(o.WorkingFile)),
                        JsonConvert.DeserializeObject <ExportResult>(File.ReadAllText(o.SecondFile))
                        );
                    File.WriteAllText(o.StatementsOutput, JsonConvert.SerializeObject(entries));
                }
                else if (o.ApplyChanges)
                {
                    List <LogEntry> entries = JsonConvert.DeserializeObject <List <LogEntry> >(File.ReadAllText(o.WorkingFile));
                    foreach (LogEntry entry in entries)
                    {
                        context.Database.ExecuteSqlCommand(entry.Command, entry.Parameters.Values.ToArray().Reverse());
                    }
                }
            });
        }