comparison 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
comparison
equal deleted inserted replaced
247:e57a5313ffe5 248:7a4f9bcb0bc2
303 s.BindString(0, "Index " + boost::lexical_cast<std::string>(i)); 303 s.BindString(0, "Index " + boost::lexical_cast<std::string>(i));
304 s.BindLargeObject(1, obj); 304 s.BindLargeObject(1, obj);
305 s.Run(); 305 s.Run();
306 306
307 std::string tmp; 307 std::string tmp;
308 PostgreSQLLargeObject::Read(tmp, *pg, obj.GetOid()); 308 PostgreSQLLargeObject::ReadWhole(tmp, *pg, obj.GetOid());
309 ASSERT_EQ(value, tmp); 309 ASSERT_EQ(value, tmp);
310 310
311 t.Commit(); 311 t.Commit();
312 } 312 }
313 } 313 }
408 ASSERT_EQ(0, CountLargeObjects(*database)); 408 ASSERT_EQ(0, CountLargeObjects(*database));
409 } 409 }
410 } 410 }
411 411
412 412
413 TEST(PostgreSQL, StorageReadRange)
414 {
415 std::unique_ptr<OrthancDatabases::PostgreSQLDatabase> database(
416 OrthancDatabases::PostgreSQLDatabase::OpenDatabaseConnection(globalParameters_));
417
418 OrthancDatabases::PostgreSQLStorageArea storageArea(globalParameters_, true /* clear database */);
419
420 {
421 std::unique_ptr<OrthancDatabases::StorageBackend::IAccessor> accessor(storageArea.CreateAccessor());
422 ASSERT_EQ(0, CountLargeObjects(*database));
423 accessor->Create("uuid", "abcd\0\1\2\3\4\5", 10, OrthancPluginContentType_Unknown);
424 ASSERT_EQ(1u, CountLargeObjects(*database));
425 }
426
427 {
428 std::unique_ptr<OrthancDatabases::StorageBackend::IAccessor> accessor(storageArea.CreateAccessor());
429 ASSERT_EQ(1u, CountLargeObjects(*database));
430
431 std::string s;
432 OrthancDatabases::StorageBackend::ReadWholeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown);
433 ASSERT_EQ(10u, s.size());
434 ASSERT_EQ('a', s[0]);
435 ASSERT_EQ('d', s[3]);
436 ASSERT_EQ('\0', s[4]);
437 ASSERT_EQ('\5', s[9]);
438
439 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 0);
440 ASSERT_TRUE(s.empty());
441
442 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 1);
443 ASSERT_EQ(1u, s.size());
444 ASSERT_EQ('a', s[0]);
445
446 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 1);
447 ASSERT_EQ(1u, s.size());
448 ASSERT_EQ('\0', s[0]);
449
450 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 9, 1);
451 ASSERT_EQ(1u, s.size());
452 ASSERT_EQ('\5', s[0]);
453
454 // Cannot read non-empty range after the end of the string. NB:
455 // The behavior on range (10, 0) is different than in MySQL!
456 ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString(
457 s, *accessor, "uuid", OrthancPluginContentType_Unknown, 10, 0), Orthanc::OrthancException);
458
459 ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString(
460 s, *accessor, "uuid", OrthancPluginContentType_Unknown, 10, 1), Orthanc::OrthancException);
461
462 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 4);
463 ASSERT_EQ(4u, s.size());
464 ASSERT_EQ('a', s[0]);
465 ASSERT_EQ('b', s[1]);
466 ASSERT_EQ('c', s[2]);
467 ASSERT_EQ('d', s[3]);
468
469 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 6);
470 ASSERT_EQ(6u, s.size());
471 ASSERT_EQ('\0', s[0]);
472 ASSERT_EQ('\1', s[1]);
473 ASSERT_EQ('\2', s[2]);
474 ASSERT_EQ('\3', s[3]);
475 ASSERT_EQ('\4', s[4]);
476 ASSERT_EQ('\5', s[5]);
477
478 ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString(
479 s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 7), Orthanc::OrthancException);
480 }
481 }
482
483
413 TEST(PostgreSQL, ImplicitTransaction) 484 TEST(PostgreSQL, ImplicitTransaction)
414 { 485 {
415 std::unique_ptr<PostgreSQLDatabase> db(CreateTestDatabase()); 486 std::unique_ptr<PostgreSQLDatabase> db(CreateTestDatabase());
416 487
417 ASSERT_FALSE(db->DoesTableExist("test")); 488 ASSERT_FALSE(db->DoesTableExist("test"));