comparison 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
comparison
equal deleted inserted replaced
236:d1d2edbbe6fb 237:35598014f140
1066 bool IndexBackend::LookupGlobalProperty(std::string& target /*out*/, 1066 bool IndexBackend::LookupGlobalProperty(std::string& target /*out*/,
1067 DatabaseManager& manager, 1067 DatabaseManager& manager,
1068 const char* serverIdentifier, 1068 const char* serverIdentifier,
1069 int32_t property) 1069 int32_t property)
1070 { 1070 {
1071 return ::OrthancDatabases::LookupGlobalProperty(target, manager, serverIdentifier, 1071 DatabaseManager::CachedStatement statement(
1072 static_cast<Orthanc::GlobalProperty>(property)); 1072 STATEMENT_FROM_HERE, manager,
1073 "SELECT value FROM GlobalProperties WHERE property=${property}");
1074
1075 statement.SetReadOnly(true);
1076 statement.SetParameterType("property", ValueType_Integer64);
1077
1078 Dictionary args;
1079 args.SetIntegerValue("property", property);
1080
1081 statement.Execute(args);
1082 statement.SetResultFieldType(0, ValueType_Utf8String);
1083
1084 if (statement.IsDone())
1085 {
1086 return false;
1087 }
1088 else
1089 {
1090 ValueType type = statement.GetResultField(0).GetType();
1091
1092 if (type == ValueType_Null)
1093 {
1094 return false;
1095 }
1096 else if (type != ValueType_Utf8String)
1097 {
1098 throw Orthanc::OrthancException(Orthanc::ErrorCode_Database);
1099 }
1100 else
1101 {
1102 target = dynamic_cast<const Utf8StringValue&>(statement.GetResultField(0)).GetContent();
1103 return true;
1104 }
1105 }
1073 } 1106 }
1074 1107
1075 1108
1076 void IndexBackend::LookupIdentifier(std::list<int64_t>& target /*out*/, 1109 void IndexBackend::LookupIdentifier(std::list<int64_t>& target /*out*/,
1077 DatabaseManager& manager, 1110 DatabaseManager& manager,
1330 1363
1331 1364
1332 void IndexBackend::SetGlobalProperty(DatabaseManager& manager, 1365 void IndexBackend::SetGlobalProperty(DatabaseManager& manager,
1333 const char* serverIdentifier, 1366 const char* serverIdentifier,
1334 int32_t property, 1367 int32_t property,
1335 const char* value) 1368 const char* utf8)
1336 { 1369 {
1337 return ::OrthancDatabases::SetGlobalProperty( 1370 if (manager.GetDialect() == Dialect_SQLite)
1338 manager, serverIdentifier, static_cast<Orthanc::GlobalProperty>(property), value); 1371 {
1372 DatabaseManager::CachedStatement statement(
1373 STATEMENT_FROM_HERE, manager,
1374 "INSERT OR REPLACE INTO GlobalProperties VALUES (${property}, ${value})");
1375
1376 statement.SetParameterType("property", ValueType_Integer64);
1377 statement.SetParameterType("value", ValueType_Utf8String);
1378
1379 Dictionary args;
1380 args.SetIntegerValue("property", static_cast<int>(property));
1381 args.SetUtf8Value("value", utf8);
1382
1383 statement.Execute(args);
1384 }
1385 else
1386 {
1387 {
1388 DatabaseManager::CachedStatement statement(
1389 STATEMENT_FROM_HERE, manager,
1390 "DELETE FROM GlobalProperties WHERE property=${property}");
1391
1392 statement.SetParameterType("property", ValueType_Integer64);
1393
1394 Dictionary args;
1395 args.SetIntegerValue("property", property);
1396
1397 statement.Execute(args);
1398 }
1399
1400 {
1401 DatabaseManager::CachedStatement statement(
1402 STATEMENT_FROM_HERE, manager,
1403 "INSERT INTO GlobalProperties VALUES (${property}, ${value})");
1404
1405 statement.SetParameterType("property", ValueType_Integer64);
1406 statement.SetParameterType("value", ValueType_Utf8String);
1407
1408 Dictionary args;
1409 args.SetIntegerValue("property", static_cast<int>(property));
1410 args.SetUtf8Value("value", utf8);
1411
1412 statement.Execute(args);
1413 }
1414 }
1339 } 1415 }
1340 1416
1341 1417
1342 static void ExecuteSetTag(DatabaseManager::CachedStatement& statement, 1418 static void ExecuteSetTag(DatabaseManager::CachedStatement& statement,
1343 int64_t id, 1419 int64_t id,
2302 OrthancDatabases::DatabaseBackendAdapterV2::Register(backend); 2378 OrthancDatabases::DatabaseBackendAdapterV2::Register(backend);
2303 } 2379 }
2304 } 2380 }
2305 2381
2306 2382
2383 bool IndexBackend::LookupGlobalIntegerProperty(int& target,
2384 DatabaseManager& manager,
2385 const char* serverIdentifier,
2386 int32_t property)
2387 {
2388 std::string value;
2389
2390 if (LookupGlobalProperty(value, manager, serverIdentifier, property))
2391 {
2392 try
2393 {
2394 target = boost::lexical_cast<int>(value);
2395 return true;
2396 }
2397 catch (boost::bad_lexical_cast&)
2398 {
2399 LOG(ERROR) << "Corrupted PostgreSQL database";
2400 throw Orthanc::OrthancException(Orthanc::ErrorCode_Database);
2401 }
2402 }
2403 else
2404 {
2405 return false;
2406 }
2407 }
2408
2409
2410 void IndexBackend::SetGlobalIntegerProperty(DatabaseManager& manager,
2411 const char* serverIdentifier,
2412 int32_t property,
2413 int value)
2414 {
2415 std::string s = boost::lexical_cast<std::string>(value);
2416 SetGlobalProperty(manager, serverIdentifier, property, s.c_str());
2417 }
2418
2419
2307 void IndexBackend::Finalize() 2420 void IndexBackend::Finalize()
2308 { 2421 {
2309 OrthancDatabases::DatabaseBackendAdapterV2::Finalize(); 2422 OrthancDatabases::DatabaseBackendAdapterV2::Finalize();
2310 2423
2311 #if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in Orthanc 1.3.1 2424 #if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in Orthanc 1.3.1
2316 } 2429 }
2317 2430
2318 2431
2319 DatabaseManager* IndexBackend::CreateSingleDatabaseManager(IDatabaseBackend& backend) 2432 DatabaseManager* IndexBackend::CreateSingleDatabaseManager(IDatabaseBackend& backend)
2320 { 2433 {
2321 std::unique_ptr<IDatabase> database(backend.OpenDatabaseConnection()); 2434 std::unique_ptr<DatabaseManager> manager(new DatabaseManager(backend.OpenDatabaseConnection()));
2322 backend.ConfigureDatabase(*database); 2435 backend.ConfigureDatabase(*manager);
2323 return new DatabaseManager(database.release()); 2436 return manager.release();
2324 } 2437 }
2325 } 2438 }