comparison Framework/Plugins/IndexBackend.cpp @ 238:f033cc039264

new table: "ServerProperties"
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 08 Apr 2021 19:33:36 +0200
parents 35598014f140
children e9ba888f371b
comparison
equal deleted inserted replaced
237:35598014f140 238:f033cc039264
1060 ReadString(statement, 5)); 1060 ReadString(statement, 5));
1061 return true; 1061 return true;
1062 } 1062 }
1063 } 1063 }
1064 1064
1065
1066 static bool ReadGlobalProperty(std::string& target,
1067 DatabaseManager::CachedStatement& statement,
1068 const Dictionary& args)
1069 {
1070 statement.Execute(args);
1071 statement.SetResultFieldType(0, ValueType_Utf8String);
1072
1073 if (statement.IsDone())
1074 {
1075 return false;
1076 }
1077 else
1078 {
1079 ValueType type = statement.GetResultField(0).GetType();
1080
1081 if (type == ValueType_Null)
1082 {
1083 return false;
1084 }
1085 else if (type != ValueType_Utf8String)
1086 {
1087 throw Orthanc::OrthancException(Orthanc::ErrorCode_Database);
1088 }
1089 else
1090 {
1091 target = dynamic_cast<const Utf8StringValue&>(statement.GetResultField(0)).GetContent();
1092 return true;
1093 }
1094 }
1095 }
1096
1065 1097
1066 bool IndexBackend::LookupGlobalProperty(std::string& target /*out*/, 1098 bool IndexBackend::LookupGlobalProperty(std::string& target /*out*/,
1067 DatabaseManager& manager, 1099 DatabaseManager& manager,
1068 const char* serverIdentifier, 1100 const char* serverIdentifier,
1069 int32_t property) 1101 int32_t property)
1070 { 1102 {
1071 DatabaseManager::CachedStatement statement( 1103 if (serverIdentifier == NULL)
1072 STATEMENT_FROM_HERE, manager, 1104 {
1073 "SELECT value FROM GlobalProperties WHERE property=${property}"); 1105 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
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 } 1106 }
1088 else 1107 else
1089 { 1108 {
1090 ValueType type = statement.GetResultField(0).GetType(); 1109 if (strlen(serverIdentifier) == 0)
1091 1110 {
1092 if (type == ValueType_Null) 1111 DatabaseManager::CachedStatement statement(
1093 { 1112 STATEMENT_FROM_HERE, manager,
1094 return false; 1113 "SELECT value FROM GlobalProperties WHERE property=${property}");
1095 } 1114
1096 else if (type != ValueType_Utf8String) 1115 statement.SetReadOnly(true);
1097 { 1116 statement.SetParameterType("property", ValueType_Integer64);
1098 throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); 1117
1118 Dictionary args;
1119 args.SetIntegerValue("property", property);
1120
1121 return ReadGlobalProperty(target, statement, args);
1099 } 1122 }
1100 else 1123 else
1101 { 1124 {
1102 target = dynamic_cast<const Utf8StringValue&>(statement.GetResultField(0)).GetContent(); 1125 DatabaseManager::CachedStatement statement(
1103 return true; 1126 STATEMENT_FROM_HERE, manager,
1127 "SELECT value FROM ServerProperties WHERE server=${server} AND property=${property}");
1128
1129 statement.SetReadOnly(true);
1130 statement.SetParameterType("server", ValueType_Utf8String);
1131 statement.SetParameterType("property", ValueType_Integer64);
1132
1133 Dictionary args;
1134 args.SetUtf8Value("server", serverIdentifier);
1135 args.SetIntegerValue("property", property);
1136
1137 return ReadGlobalProperty(target, statement, args);
1104 } 1138 }
1105 } 1139 }
1106 } 1140 }
1107 1141
1108 1142
1365 void IndexBackend::SetGlobalProperty(DatabaseManager& manager, 1399 void IndexBackend::SetGlobalProperty(DatabaseManager& manager,
1366 const char* serverIdentifier, 1400 const char* serverIdentifier,
1367 int32_t property, 1401 int32_t property,
1368 const char* utf8) 1402 const char* utf8)
1369 { 1403 {
1370 if (manager.GetDialect() == Dialect_SQLite) 1404 if (serverIdentifier == NULL)
1371 { 1405 {
1372 DatabaseManager::CachedStatement statement( 1406 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
1373 STATEMENT_FROM_HERE, manager, 1407 }
1374 "INSERT OR REPLACE INTO GlobalProperties VALUES (${property}, ${value})"); 1408 else if (manager.GetDialect() == Dialect_SQLite)
1375 1409 {
1376 statement.SetParameterType("property", ValueType_Integer64); 1410 bool hasServer = (strlen(serverIdentifier) != 0);
1377 statement.SetParameterType("value", ValueType_Utf8String); 1411
1412 std::unique_ptr<DatabaseManager::CachedStatement> statement;
1413
1414 if (hasServer)
1415 {
1416 statement.reset(new DatabaseManager::CachedStatement(
1417 STATEMENT_FROM_HERE, manager,
1418 "INSERT OR REPLACE INTO ServerProperties VALUES (${server}, ${property}, ${value})"));
1419 }
1420 else
1421 {
1422 statement.reset(new DatabaseManager::CachedStatement(
1423 STATEMENT_FROM_HERE, manager,
1424 "INSERT OR REPLACE INTO GlobalProperties VALUES (${property}, ${value})"));
1425 }
1426
1427 statement->SetParameterType("property", ValueType_Integer64);
1428 statement->SetParameterType("value", ValueType_Utf8String);
1378 1429
1379 Dictionary args; 1430 Dictionary args;
1380 args.SetIntegerValue("property", static_cast<int>(property)); 1431 args.SetIntegerValue("property", static_cast<int>(property));
1381 args.SetUtf8Value("value", utf8); 1432 args.SetUtf8Value("value", utf8);
1382 1433
1383 statement.Execute(args); 1434 if (hasServer)
1435 {
1436 statement->SetParameterType("server", ValueType_Utf8String);
1437 args.SetUtf8Value("server", serverIdentifier);
1438 }
1439
1440 statement->Execute(args);
1384 } 1441 }
1385 else 1442 else
1386 { 1443 {
1387 { 1444 bool hasServer = (strlen(serverIdentifier) != 0);
1388 DatabaseManager::CachedStatement statement( 1445
1389 STATEMENT_FROM_HERE, manager, 1446 std::unique_ptr<DatabaseManager::CachedStatement> statement;
1390 "DELETE FROM GlobalProperties WHERE property=${property}"); 1447
1391 1448 {
1392 statement.SetParameterType("property", ValueType_Integer64); 1449 if (hasServer)
1450 {
1451 statement.reset(new DatabaseManager::CachedStatement(
1452 STATEMENT_FROM_HERE, manager,
1453 "DELETE FROM ServerProperties WHERE server=${server} AND property=${property}"));
1454 }
1455 else
1456 {
1457 statement.reset(new DatabaseManager::CachedStatement(
1458 STATEMENT_FROM_HERE, manager,
1459 "DELETE FROM GlobalProperties WHERE property=${property}"));
1460 }
1461
1462 statement->SetParameterType("property", ValueType_Integer64);
1393 1463
1394 Dictionary args; 1464 Dictionary args;
1395 args.SetIntegerValue("property", property); 1465 args.SetIntegerValue("property", property);
1396 1466
1397 statement.Execute(args); 1467 if (hasServer)
1398 } 1468 {
1399 1469 statement->SetParameterType("server", ValueType_Utf8String);
1400 { 1470 args.SetUtf8Value("server", serverIdentifier);
1401 DatabaseManager::CachedStatement statement( 1471 }
1402 STATEMENT_FROM_HERE, manager, 1472
1403 "INSERT INTO GlobalProperties VALUES (${property}, ${value})"); 1473 statement->Execute(args);
1404 1474 }
1405 statement.SetParameterType("property", ValueType_Integer64); 1475
1406 statement.SetParameterType("value", ValueType_Utf8String); 1476 {
1477 if (hasServer)
1478 {
1479 statement.reset(new DatabaseManager::CachedStatement(
1480 STATEMENT_FROM_HERE, manager,
1481 "INSERT INTO ServerProperties VALUES (${server}, ${property}, ${value})"));
1482 }
1483 else
1484 {
1485 statement.reset(new DatabaseManager::CachedStatement(
1486 STATEMENT_FROM_HERE, manager,
1487 "INSERT INTO GlobalProperties VALUES (${property}, ${value})"));
1488 }
1489
1490 statement->SetParameterType("property", ValueType_Integer64);
1491 statement->SetParameterType("value", ValueType_Utf8String);
1407 1492
1408 Dictionary args; 1493 Dictionary args;
1409 args.SetIntegerValue("property", static_cast<int>(property)); 1494 args.SetIntegerValue("property", static_cast<int>(property));
1410 args.SetUtf8Value("value", utf8); 1495 args.SetUtf8Value("value", utf8);
1411 1496
1412 statement.Execute(args); 1497 if (hasServer)
1498 {
1499 statement->SetParameterType("server", ValueType_Utf8String);
1500 args.SetUtf8Value("server", serverIdentifier);
1501 }
1502
1503 statement->Execute(args);
1413 } 1504 }
1414 } 1505 }
1415 } 1506 }
1416 1507
1417 1508