public void WorkedExampleTest()
        {
            //pick some tags that we are interested in (determines the table schema created)
            var toCreate = new ImageTableTemplate()
            {
                Columns = new[] {
                    new ImageColumnTemplate(DicomTag.SOPInstanceUID),
                    new ImageColumnTemplate(DicomTag.Modality)
                    {
                        AllowNulls = true
                    },
                    new ImageColumnTemplate(DicomTag.PatientID)
                    {
                        AllowNulls = true
                    }
                }
            };

            //load the Sql Server implementation of FAnsi
            ImplementationManager.Load <MicrosoftSQLImplementation>();

            //decide where you want to create the table
            var server = new DiscoveredServer(@"Server=localhost\sqlexpress;Database=mydb;Integrated Security=true;", FAnsi.DatabaseType.MicrosoftSQLServer);
            var db     = server.ExpectDatabase("test");

            //create the table
            var tbl = db.CreateTable("MyCoolTable", toCreate.GetColumns(FAnsi.DatabaseType.MicrosoftSQLServer));

            //add a column for where the image is on disk
            tbl.AddColumn("FileLocation", new DatabaseTypeRequest(typeof(string), 500), true, 500);

            //Create a DataTable in memory for the data we read from disk
            DataTable dt = new DataTable();

            dt.Columns.Add("SOPInstanceUID");
            dt.Columns.Add("Modality");
            dt.Columns.Add("PatientID");
            dt.Columns.Add("FileLocation");

            //Load some dicom files and copy tag data into DataTable (where tag exists)
            foreach (string file in Directory.EnumerateFiles(@"C:\temp\TestDicomFiles", "*.dcm", SearchOption.AllDirectories))
            {
                var dcm = DicomFile.Open(file);
                var ds  = dcm.Dataset;

                dt.Rows.Add(

                    DicomTypeTranslaterReader.GetCSharpValue(dcm.Dataset, DicomTag.SOPInstanceUID),
                    ds.Contains(DicomTag.Modality) ? DicomTypeTranslaterReader.GetCSharpValue(dcm.Dataset, DicomTag.Modality) : DBNull.Value,
                    ds.Contains(DicomTag.PatientID) ? DicomTypeTranslaterReader.GetCSharpValue(dcm.Dataset, DicomTag.PatientID) : DBNull.Value,
                    file);
            }

            //put the DataTable into the database
            using (var insert = tbl.BeginBulkInsert())
                insert.Upload(dt);
        }
        public void ExampleTableCreation()
        {
            var toCreate = new ImageTableTemplate()
            {
                Columns = new[] {
                    //pick some tags for the schema
                    new ImageColumnTemplate(DicomTag.SOPInstanceUID)
                    {
                        IsPrimaryKey = true, AllowNulls = false
                    },
                    new ImageColumnTemplate(DicomTag.PatientAge)
                    {
                        AllowNulls = true
                    },
                    new ImageColumnTemplate(DicomTag.PatientBirthDate)
                    {
                        AllowNulls = true
                    }
                }
            };

            //load the Sql Server implementation of FAnsi
            ImplementationManager.Load <MicrosoftSQLImplementation>();

            //decide where you want to create the table (these methods will actually attempt to connect to the database)
            var server = new DiscoveredServer("Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;", FAnsi.DatabaseType.MicrosoftSQLServer);
            var db     = server.ExpectDatabase("MyDb");

            var creator = new ImagingTableCreation(db.Server.GetQuerySyntaxHelper());
            var sql     = creator.GetCreateTableSql(db, "MyCoolTable", toCreate);

            //the following Sql gets created
            Assert.AreEqual(
                @"CREATE TABLE [MyDb]..[MyCoolTable](
[SOPInstanceUID] varchar(64)    NOT NULL ,
[PatientAge] varchar(4)    NULL ,
[PatientBirthDate] datetime2    NULL ,
 CONSTRAINT PK_MyCoolTable PRIMARY KEY ([SOPInstanceUID]))
"

                .Replace("\r", ""), sql.Replace("\r", ""));

            //actually do it
            //creator.CreateTable(db.ExpectTable("MyCoolTable"));
        }
Beispiel #3
0
        public void TestImageTemplates(DatabaseType type)
        {
            var db = GetCleanedServer(type);

            var template = new ImageTableTemplate
            {
                TableName = "Fish",
                Columns   = new[]
                {
                    new ImageColumnTemplate
                    {
                        IsPrimaryKey = true, AllowNulls = true, ColumnName = "RelativeFileArchiveURI"
                    },
                    new ImageColumnTemplate
                    {
                        IsPrimaryKey = false, AllowNulls = true, ColumnName = "SeriesInstanceUID"
                    }
                }
            };
            var tbl = db.ExpectTable(template.TableName);
            var cmd = new ExecuteCommandCreateNewImagingDataset(RepositoryLocator, tbl, template);

            Assert.IsFalse(cmd.IsImpossible);
            cmd.Execute();

            Assert.IsTrue(tbl.Exists());

            var cols = tbl.DiscoverColumns();

            Assert.AreEqual(2, cols.Length);

            var rfa = cols.Single(c => c.GetRuntimeName().Equals("RelativeFileArchiveURI"));

            Assert.IsTrue(rfa.IsPrimaryKey);
            Assert.IsFalse(rfa.AllowNulls); //because PK!


            var sid = cols.Single(c => c.GetRuntimeName().Equals("SeriesInstanceUID"));

            Assert.IsFalse(sid.IsPrimaryKey);
            Assert.IsTrue(sid.AllowNulls);
        }
Beispiel #4
0
 public ExecuteCommandCreateNewImagingDataset(IRDMPPlatformRepositoryServiceLocator repositoryLocator, DiscoveredTable expectedTable, ImageTableTemplate tableTemplate)
 {
     _repositoryLocator = repositoryLocator;
     _expectedTable     = expectedTable;
     _tableTemplate     = tableTemplate;
 }
Beispiel #5
0
        public void TestImageTemplates(DatabaseType type)
        {
            var db = GetCleanedServer(type);

            // Create a nice template with lots of columns
            var template = new ImageTableTemplate();

            template.TableName = "Fish";
            template.Columns   = new[]
            {
                new ImageColumnTemplate {
                    IsPrimaryKey = true, AllowNulls = true, ColumnName = "RelativeFileArchiveURI"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "SeriesInstanceUID"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "StudyDate"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "StudyInstanceUID"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "StudyDescription"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "EchoTime"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "RepetitionTime"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "PatientAge"
                },
            };

            // use it to create a table
            var tbl = db.ExpectTable(template.TableName);
            var cmd = new ExecuteCommandCreateNewImagingDataset(RepositoryLocator, tbl, template);

            Assert.IsFalse(cmd.IsImpossible);
            cmd.Execute();

            Assert.IsTrue(tbl.Exists());

            // import RDMP reference to the table
            var importer = new TableInfoImporter(CatalogueRepository, tbl);

            importer.DoImport(out TableInfo ti, out _);

            // compare the live with the template
            var comparer = new LiveVsTemplateComparer(ti, new ImageTableTemplateCollection()
            {
                DatabaseType = type, Tables = new List <ImageTableTemplate> {
                    template
                }
            });

            // should be no differences
            Assert.AreEqual(comparer.TemplateSql, comparer.LiveSql);

            // make a difference
            tbl.DropColumn(tbl.DiscoverColumn("EchoTime"));

            //now comparer should see a difference
            comparer = new LiveVsTemplateComparer(ti, new ImageTableTemplateCollection()
            {
                DatabaseType = type, Tables = new List <ImageTableTemplate> {
                    template
                }
            });
            Assert.AreNotEqual(comparer.TemplateSql, comparer.LiveSql);

            tbl.Drop();
        }
        public void TestAddTag_WithArchive(DatabaseType type)
        {
            var db = GetCleanedServer(type);

            // Create a nice template with lots of columns
            var template = new ImageTableTemplate();

            template.TableName = "Fish";
            template.Columns   = new[]
            {
                new ImageColumnTemplate {
                    IsPrimaryKey = true, AllowNulls = true, ColumnName = "RelativeFileArchiveURI"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "SeriesInstanceUID"
                },
                new ImageColumnTemplate {
                    IsPrimaryKey = false, AllowNulls = true, ColumnName = "StudyDate"
                },
            };

            // use it to create a table
            var            tbl = db.ExpectTable(template.TableName);
            IAtomicCommand cmd = new ExecuteCommandCreateNewImagingDataset(RepositoryLocator, tbl, template);

            Assert.IsFalse(cmd.IsImpossible);
            cmd.Execute();

            Assert.IsTrue(tbl.Exists());

            // import RDMP reference to the table
            var importer = new TableInfoImporter(CatalogueRepository, tbl);

            importer.DoImport(out TableInfo ti, out ColumnInfo[] cols);

            var forward = new ForwardEngineerCatalogue(ti, cols);

            forward.ExecuteForwardEngineering(out Catalogue catalogue, out _, out _);

            // Create an archive table and backup trigger like we would have if this were the target of a data load
            var triggerImplementerFactory = new TriggerImplementerFactory(type);
            var implementer = triggerImplementerFactory.Create(tbl);

            implementer.CreateTrigger(new ThrowImmediatelyCheckNotifier());

            var archive = tbl.Database.ExpectTable(tbl.GetRuntimeName() + "_Archive");

            Assert.IsTrue(archive.Exists());

            var activator = new ConsoleInputManager(RepositoryLocator, new ThrowImmediatelyCheckNotifier())
            {
                DisallowInput = true
            };

            // Test the actual commands
            cmd = new ExecuteCommandAddTag(activator, catalogue, "ffffff", "int");
            Assert.IsFalse(cmd.IsImpossible, cmd.ReasonCommandImpossible);
            cmd.Execute();

            cmd = new ExecuteCommandAddTag(activator, catalogue, "EchoTime", null);
            Assert.IsFalse(cmd.IsImpossible, cmd.ReasonCommandImpossible);
            cmd.Execute();

            var ex = Assert.Throws <Exception>(() => new ExecuteCommandAddTag(activator, catalogue, "StudyDate", null).Execute());

            StringAssert.StartsWith("Failed check with message: There is already a column called 'StudyDate' in TableInfo ", ex.Message);

            cmd = new ExecuteCommandAddTag(activator, catalogue, "SeriesDate", null);
            Assert.IsFalse(cmd.IsImpossible, cmd.ReasonCommandImpossible);
            cmd.Execute();

            Assert.AreEqual("int", tbl.DiscoverColumn("ffffff").DataType.SQLType);
            Assert.AreEqual("decimal(38,19)", tbl.DiscoverColumn("EchoTime").DataType.SQLType);
            Assert.AreEqual(typeof(DateTime), tbl.DiscoverColumn("SeriesDate").DataType.GetCSharpDataType());

            Assert.AreEqual("int", archive.DiscoverColumn("ffffff").DataType.SQLType);
            Assert.AreEqual("decimal(38,19)", archive.DiscoverColumn("EchoTime").DataType.SQLType);
            Assert.AreEqual(typeof(DateTime), archive.DiscoverColumn("SeriesDate").DataType.GetCSharpDataType());
        }