Mercurial > hg > orthanc
comparison OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp @ 5723:b1c86368af2b find-refactoring
moved experimental code to graveyard
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 19 Jul 2024 10:19:57 +0200 |
parents | 77875b51cf95 |
children | afd421225eb4 |
comparison
equal
deleted
inserted
replaced
5720:89d559e67b03 | 5723:b1c86368af2b |
---|---|
1137 while (s.Step()) | 1137 while (s.Step()) |
1138 { | 1138 { |
1139 target.insert(s.ColumnString(0)); | 1139 target.insert(s.ColumnString(0)); |
1140 } | 1140 } |
1141 } | 1141 } |
1142 | |
1143 | |
1144 #if 0 | |
1145 // TODO-FIND: Remove this implementation, as it should be done by | |
1146 // the compatibility mode implemented by "GenericFind" | |
1147 | |
1148 virtual void ExecuteFind(FindResponse& response, | |
1149 const FindRequest& request, | |
1150 const std::vector<DatabaseConstraint>& normalized) ORTHANC_OVERRIDE | |
1151 { | |
1152 #if 0 | |
1153 Compatibility::GenericFind find(*this); | |
1154 find.Execute(response, request); | |
1155 #else | |
1156 { | |
1157 SQLite::Statement s(db_, SQLITE_FROM_HERE, "DROP TABLE IF EXISTS FilteredResourcesIds"); | |
1158 s.Run(); | |
1159 } | |
1160 | |
1161 { | |
1162 | |
1163 LookupFormatter formatter; | |
1164 | |
1165 std::string sqlLookup; | |
1166 LookupFormatter::Apply(sqlLookup, | |
1167 formatter, | |
1168 normalized, | |
1169 request.GetLevel(), | |
1170 request.GetLabels(), | |
1171 request.GetLabelsConstraint(), | |
1172 (request.HasLimits() ? request.GetLimitsCount() : 0)); // TODO: handles since and count | |
1173 | |
1174 { | |
1175 // first create a temporary table that with the filtered and ordered results | |
1176 sqlLookup = "CREATE TEMPORARY TABLE FilteredResourcesIds AS " + sqlLookup; | |
1177 | |
1178 SQLite::Statement statement(db_, SQLITE_FROM_HERE_DYNAMIC(sqlLookup), sqlLookup); | |
1179 formatter.Bind(statement); | |
1180 statement.Run(); | |
1181 } | |
1182 | |
1183 { | |
1184 // create the response item with the public ids only | |
1185 SQLite::Statement statement(db_, SQLITE_FROM_HERE, "SELECT publicId FROM FilteredResourcesIds"); | |
1186 formatter.Bind(statement); | |
1187 | |
1188 while (statement.Step()) | |
1189 { | |
1190 const std::string resourceId = statement.ColumnString(0); | |
1191 response.Add(new FindResponse::Resource(request.GetLevel(), resourceId)); | |
1192 } | |
1193 } | |
1194 | |
1195 // request Each response content through INNER JOIN with the temporary table | |
1196 if (request.IsRetrieveMainDicomTags()) | |
1197 { | |
1198 // TODO-FIND: handle the case where we request tags from multiple levels | |
1199 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1200 "SELECT publicId, tagGroup, tagElement, value FROM MainDicomTags AS tags " | |
1201 " INNER JOIN FilteredResourcesIds ON tags.id = FilteredResourcesIds.internalId"); | |
1202 formatter.Bind(statement); | |
1203 | |
1204 while (statement.Step()) | |
1205 { | |
1206 const std::string& resourceId = statement.ColumnString(0); | |
1207 assert(response.HasResource(resourceId)); | |
1208 response.GetResource(resourceId).AddStringDicomTag(statement.ColumnInt(1), | |
1209 statement.ColumnInt(2), | |
1210 statement.ColumnString(3)); | |
1211 } | |
1212 } | |
1213 | |
1214 if (request.IsRetrieveChildrenIdentifiers()) | |
1215 { | |
1216 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1217 "SELECT filtered.publicId, childLevel.publicId AS childPublicId " | |
1218 "FROM Resources as currentLevel " | |
1219 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId " | |
1220 " INNER JOIN Resources childLevel ON childLevel.parentId = currentLevel.internalId"); | |
1221 formatter.Bind(statement); | |
1222 | |
1223 while (statement.Step()) | |
1224 { | |
1225 const std::string& resourceId = statement.ColumnString(0); | |
1226 assert(response.HasResource(resourceId)); | |
1227 response.GetResource(resourceId).AddChildIdentifier(GetChildResourceType(request.GetLevel()), statement.ColumnString(1)); | |
1228 } | |
1229 } | |
1230 | |
1231 if (request.IsRetrieveParentIdentifier()) | |
1232 { | |
1233 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1234 "SELECT filtered.publicId, parentLevel.publicId AS parentPublicId " | |
1235 "FROM Resources as currentLevel " | |
1236 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = currentLevel.internalId " | |
1237 " INNER JOIN Resources parentLevel ON currentLevel.parentId = parentLevel.internalId"); | |
1238 | |
1239 while (statement.Step()) | |
1240 { | |
1241 const std::string& resourceId = statement.ColumnString(0); | |
1242 const std::string& parentId = statement.ColumnString(1); | |
1243 assert(response.HasResource(resourceId)); | |
1244 response.GetResource(resourceId).SetParentIdentifier(parentId); | |
1245 } | |
1246 } | |
1247 | |
1248 if (request.IsRetrieveMetadata()) | |
1249 { | |
1250 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1251 "SELECT filtered.publicId, metadata.type, metadata.value " | |
1252 "FROM Metadata " | |
1253 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Metadata.id"); | |
1254 | |
1255 while (statement.Step()) | |
1256 { | |
1257 const std::string& resourceId = statement.ColumnString(0); | |
1258 assert(response.HasResource(resourceId)); | |
1259 response.GetResource(resourceId).AddMetadata(static_cast<MetadataType>(statement.ColumnInt(1)), | |
1260 statement.ColumnString(2)); | |
1261 } | |
1262 } | |
1263 | |
1264 if (request.IsRetrieveLabels()) | |
1265 { | |
1266 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1267 "SELECT filtered.publicId, label " | |
1268 "FROM Labels " | |
1269 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = Labels.id"); | |
1270 | |
1271 while (statement.Step()) | |
1272 { | |
1273 const std::string& resourceId = statement.ColumnString(0); | |
1274 assert(response.HasResource(resourceId)); | |
1275 response.GetResource(resourceId).AddLabel(statement.ColumnString(1)); | |
1276 } | |
1277 } | |
1278 | |
1279 if (request.IsRetrieveAttachments()) | |
1280 { | |
1281 SQLite::Statement statement(db_, SQLITE_FROM_HERE, | |
1282 "SELECT filtered.publicId, uuid, fileType, uncompressedSize, compressionType, compressedSize, " | |
1283 " uncompressedMD5, compressedMD5 " | |
1284 "FROM AttachedFiles " | |
1285 " INNER JOIN FilteredResourcesIds filtered ON filtered.internalId = AttachedFiles.id"); | |
1286 | |
1287 while (statement.Step()) | |
1288 { | |
1289 const std::string& resourceId = statement.ColumnString(0); | |
1290 FileInfo attachment = FileInfo(statement.ColumnString(1), | |
1291 static_cast<FileContentType>(statement.ColumnInt(2)), | |
1292 statement.ColumnInt64(3), | |
1293 statement.ColumnString(6), | |
1294 static_cast<CompressionType>(statement.ColumnInt(4)), | |
1295 statement.ColumnInt64(5), | |
1296 statement.ColumnString(7)); | |
1297 | |
1298 assert(response.HasResource(resourceId)); | |
1299 response.GetResource(resourceId).AddAttachment(attachment); | |
1300 }; | |
1301 } | |
1302 | |
1303 // TODO-FIND: implement other responseContent: ResponseContent_ChildInstanceId, ResponseContent_ChildrenMetadata (later: ResponseContent_IsStable) | |
1304 | |
1305 } | |
1306 | |
1307 #endif | |
1308 } | |
1309 #endif | |
1310 | |
1311 }; | 1142 }; |
1312 | 1143 |
1313 | 1144 |
1314 class SQLiteDatabaseWrapper::SignalFileDeleted : public SQLite::IScalarFunction | 1145 class SQLiteDatabaseWrapper::SignalFileDeleted : public SQLite::IScalarFunction |
1315 { | 1146 { |