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")); }
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); }
public ExecuteCommandCreateNewImagingDataset(IRDMPPlatformRepositoryServiceLocator repositoryLocator, DiscoveredTable expectedTable, ImageTableTemplate tableTemplate) { _repositoryLocator = repositoryLocator; _expectedTable = expectedTable; _tableTemplate = tableTemplate; }
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()); }