Mercurial > hg > orthanc-databases
diff PostgreSQL/UnitTests/PostgreSQLTests.cpp @ 248:7a4f9bcb0bc2
PostgreSQL: Support of range reads from the storage area
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 14 Apr 2021 09:46:44 +0200 |
parents | 483af3f35a4b |
children | d663d9e44f8d |
line wrap: on
line diff
--- a/PostgreSQL/UnitTests/PostgreSQLTests.cpp Wed Apr 14 09:18:20 2021 +0200 +++ b/PostgreSQL/UnitTests/PostgreSQLTests.cpp Wed Apr 14 09:46:44 2021 +0200 @@ -305,7 +305,7 @@ s.Run(); std::string tmp; - PostgreSQLLargeObject::Read(tmp, *pg, obj.GetOid()); + PostgreSQLLargeObject::ReadWhole(tmp, *pg, obj.GetOid()); ASSERT_EQ(value, tmp); t.Commit(); @@ -410,6 +410,77 @@ } +TEST(PostgreSQL, StorageReadRange) +{ + std::unique_ptr<OrthancDatabases::PostgreSQLDatabase> database( + OrthancDatabases::PostgreSQLDatabase::OpenDatabaseConnection(globalParameters_)); + + OrthancDatabases::PostgreSQLStorageArea storageArea(globalParameters_, true /* clear database */); + + { + std::unique_ptr<OrthancDatabases::StorageBackend::IAccessor> accessor(storageArea.CreateAccessor()); + ASSERT_EQ(0, CountLargeObjects(*database)); + accessor->Create("uuid", "abcd\0\1\2\3\4\5", 10, OrthancPluginContentType_Unknown); + ASSERT_EQ(1u, CountLargeObjects(*database)); + } + + { + std::unique_ptr<OrthancDatabases::StorageBackend::IAccessor> accessor(storageArea.CreateAccessor()); + ASSERT_EQ(1u, CountLargeObjects(*database)); + + std::string s; + OrthancDatabases::StorageBackend::ReadWholeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown); + ASSERT_EQ(10u, s.size()); + ASSERT_EQ('a', s[0]); + ASSERT_EQ('d', s[3]); + ASSERT_EQ('\0', s[4]); + ASSERT_EQ('\5', s[9]); + + OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 0); + ASSERT_TRUE(s.empty()); + + OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 1); + ASSERT_EQ(1u, s.size()); + ASSERT_EQ('a', s[0]); + + OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 1); + ASSERT_EQ(1u, s.size()); + ASSERT_EQ('\0', s[0]); + + OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 9, 1); + ASSERT_EQ(1u, s.size()); + ASSERT_EQ('\5', s[0]); + + // Cannot read non-empty range after the end of the string. NB: + // The behavior on range (10, 0) is different than in MySQL! + ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString( + s, *accessor, "uuid", OrthancPluginContentType_Unknown, 10, 0), Orthanc::OrthancException); + + ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString( + s, *accessor, "uuid", OrthancPluginContentType_Unknown, 10, 1), Orthanc::OrthancException); + + OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 4); + ASSERT_EQ(4u, s.size()); + ASSERT_EQ('a', s[0]); + ASSERT_EQ('b', s[1]); + ASSERT_EQ('c', s[2]); + ASSERT_EQ('d', s[3]); + + OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 6); + ASSERT_EQ(6u, s.size()); + ASSERT_EQ('\0', s[0]); + ASSERT_EQ('\1', s[1]); + ASSERT_EQ('\2', s[2]); + ASSERT_EQ('\3', s[3]); + ASSERT_EQ('\4', s[4]); + ASSERT_EQ('\5', s[5]); + + ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString( + s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 7), Orthanc::OrthancException); + } +} + + TEST(PostgreSQL, ImplicitTransaction) { std::unique_ptr<PostgreSQLDatabase> db(CreateTestDatabase());