Mercurial > hg > orthanc-databases
diff Framework/Plugins/IndexBackend.cpp @ 237:35598014f140
refactoring to remove GlobalProperties.cpp
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 08 Apr 2021 19:09:04 +0200 |
parents | d1b124d116c1 |
children | f033cc039264 |
line wrap: on
line diff
--- a/Framework/Plugins/IndexBackend.cpp Thu Apr 08 12:00:01 2021 +0200 +++ b/Framework/Plugins/IndexBackend.cpp Thu Apr 08 19:09:04 2021 +0200 @@ -1068,8 +1068,41 @@ const char* serverIdentifier, int32_t property) { - return ::OrthancDatabases::LookupGlobalProperty(target, manager, serverIdentifier, - static_cast<Orthanc::GlobalProperty>(property)); + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, manager, + "SELECT value FROM GlobalProperties WHERE property=${property}"); + + statement.SetReadOnly(true); + statement.SetParameterType("property", ValueType_Integer64); + + Dictionary args; + args.SetIntegerValue("property", property); + + statement.Execute(args); + statement.SetResultFieldType(0, ValueType_Utf8String); + + if (statement.IsDone()) + { + return false; + } + else + { + ValueType type = statement.GetResultField(0).GetType(); + + if (type == ValueType_Null) + { + return false; + } + else if (type != ValueType_Utf8String) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); + } + else + { + target = dynamic_cast<const Utf8StringValue&>(statement.GetResultField(0)).GetContent(); + return true; + } + } } @@ -1332,10 +1365,53 @@ void IndexBackend::SetGlobalProperty(DatabaseManager& manager, const char* serverIdentifier, int32_t property, - const char* value) + const char* utf8) { - return ::OrthancDatabases::SetGlobalProperty( - manager, serverIdentifier, static_cast<Orthanc::GlobalProperty>(property), value); + if (manager.GetDialect() == Dialect_SQLite) + { + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, manager, + "INSERT OR REPLACE INTO GlobalProperties VALUES (${property}, ${value})"); + + statement.SetParameterType("property", ValueType_Integer64); + statement.SetParameterType("value", ValueType_Utf8String); + + Dictionary args; + args.SetIntegerValue("property", static_cast<int>(property)); + args.SetUtf8Value("value", utf8); + + statement.Execute(args); + } + else + { + { + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, manager, + "DELETE FROM GlobalProperties WHERE property=${property}"); + + statement.SetParameterType("property", ValueType_Integer64); + + Dictionary args; + args.SetIntegerValue("property", property); + + statement.Execute(args); + } + + { + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, manager, + "INSERT INTO GlobalProperties VALUES (${property}, ${value})"); + + statement.SetParameterType("property", ValueType_Integer64); + statement.SetParameterType("value", ValueType_Utf8String); + + Dictionary args; + args.SetIntegerValue("property", static_cast<int>(property)); + args.SetUtf8Value("value", utf8); + + statement.Execute(args); + } + } } @@ -2304,6 +2380,43 @@ } + bool IndexBackend::LookupGlobalIntegerProperty(int& target, + DatabaseManager& manager, + const char* serverIdentifier, + int32_t property) + { + std::string value; + + if (LookupGlobalProperty(value, manager, serverIdentifier, property)) + { + try + { + target = boost::lexical_cast<int>(value); + return true; + } + catch (boost::bad_lexical_cast&) + { + LOG(ERROR) << "Corrupted PostgreSQL database"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); + } + } + else + { + return false; + } + } + + + void IndexBackend::SetGlobalIntegerProperty(DatabaseManager& manager, + const char* serverIdentifier, + int32_t property, + int value) + { + std::string s = boost::lexical_cast<std::string>(value); + SetGlobalProperty(manager, serverIdentifier, property, s.c_str()); + } + + void IndexBackend::Finalize() { OrthancDatabases::DatabaseBackendAdapterV2::Finalize(); @@ -2318,8 +2431,8 @@ DatabaseManager* IndexBackend::CreateSingleDatabaseManager(IDatabaseBackend& backend) { - std::unique_ptr<IDatabase> database(backend.OpenDatabaseConnection()); - backend.ConfigureDatabase(*database); - return new DatabaseManager(database.release()); + std::unique_ptr<DatabaseManager> manager(new DatabaseManager(backend.OpenDatabaseConnection())); + backend.ConfigureDatabase(*manager); + return manager.release(); } }