comparison MySQL/UnitTests/UnitTestsMain.cpp @ 242:b97a537f4613

MySQL: Support of range reads for the storage area
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 13 Apr 2021 17:00:02 +0200
parents 675f8322eb7c
children 33fa478c119a
comparison
equal deleted inserted replaced
241:a063bbf10a3e 242:b97a537f4613
160 OrthancDatabases::MySQLDatabase::OpenDatabaseConnection(globalParameters_)); 160 OrthancDatabases::MySQLDatabase::OpenDatabaseConnection(globalParameters_));
161 161
162 OrthancDatabases::MySQLStorageArea storageArea(globalParameters_, true /* clear database */); 162 OrthancDatabases::MySQLStorageArea storageArea(globalParameters_, true /* clear database */);
163 163
164 { 164 {
165 OrthancDatabases::MySQLStorageArea::Accessor accessor(storageArea); 165 std::unique_ptr<OrthancDatabases::StorageBackend::IAccessor> accessor(storageArea.CreateAccessor());
166 166
167 ASSERT_EQ(0, CountFiles(*database)); 167 ASSERT_EQ(0, CountFiles(*database));
168 168
169 for (int i = 0; i < 10; i++) 169 for (int i = 0; i < 10; i++)
170 { 170 {
171 std::string uuid = boost::lexical_cast<std::string>(i); 171 std::string uuid = boost::lexical_cast<std::string>(i);
172 std::string value = "Value " + boost::lexical_cast<std::string>(i * 2); 172 std::string value = "Value " + boost::lexical_cast<std::string>(i * 2);
173 accessor.Create(uuid, value.c_str(), value.size(), OrthancPluginContentType_Unknown); 173 accessor->Create(uuid, value.c_str(), value.size(), OrthancPluginContentType_Unknown);
174 } 174 }
175 175
176 std::string buffer; 176 std::string buffer;
177 ASSERT_THROW(accessor.ReadToString(buffer, "nope", OrthancPluginContentType_Unknown), 177 ASSERT_THROW(OrthancDatabases::StorageBackend::ReadWholeToString(
178 buffer, *accessor, "nope", OrthancPluginContentType_Unknown),
178 Orthanc::OrthancException); 179 Orthanc::OrthancException);
179 180
180 ASSERT_EQ(10, CountFiles(*database)); 181 ASSERT_EQ(10, CountFiles(*database));
181 accessor.Remove("5", OrthancPluginContentType_Unknown); 182 accessor->Remove("5", OrthancPluginContentType_Unknown);
182 183
183 ASSERT_EQ(9, CountFiles(*database)); 184 ASSERT_EQ(9, CountFiles(*database));
184 185
185 for (int i = 0; i < 10; i++) 186 for (int i = 0; i < 10; i++)
186 { 187 {
188 std::string expected = "Value " + boost::lexical_cast<std::string>(i * 2); 189 std::string expected = "Value " + boost::lexical_cast<std::string>(i * 2);
189 std::string content; 190 std::string content;
190 191
191 if (i == 5) 192 if (i == 5)
192 { 193 {
193 ASSERT_THROW(accessor.ReadToString(buffer, uuid, OrthancPluginContentType_Unknown), 194 ASSERT_THROW(OrthancDatabases::StorageBackend::ReadWholeToString(
195 buffer, *accessor, uuid, OrthancPluginContentType_Unknown),
194 Orthanc::OrthancException); 196 Orthanc::OrthancException);
195 } 197 }
196 else 198 else
197 { 199 {
198 accessor.ReadToString(buffer, uuid, OrthancPluginContentType_Unknown); 200 OrthancDatabases::StorageBackend::ReadWholeToString(buffer, *accessor, uuid, OrthancPluginContentType_Unknown);
199 ASSERT_EQ(expected, buffer); 201 ASSERT_EQ(expected, buffer);
200 } 202 }
201 } 203 }
202 204
203 for (int i = 0; i < 10; i++) 205 for (int i = 0; i < 10; i++)
204 { 206 {
205 accessor.Remove(boost::lexical_cast<std::string>(i), OrthancPluginContentType_Unknown); 207 accessor->Remove(boost::lexical_cast<std::string>(i), OrthancPluginContentType_Unknown);
206 } 208 }
207 209
208 ASSERT_EQ(0, CountFiles(*database)); 210 ASSERT_EQ(0, CountFiles(*database));
211 }
212 }
213
214
215 TEST(MySQL, StorageReadRange)
216 {
217 std::unique_ptr<OrthancDatabases::MySQLDatabase> database(
218 OrthancDatabases::MySQLDatabase::OpenDatabaseConnection(globalParameters_));
219
220 OrthancDatabases::MySQLStorageArea storageArea(globalParameters_, true /* clear database */);
221
222 {
223 std::unique_ptr<OrthancDatabases::StorageBackend::IAccessor> accessor(storageArea.CreateAccessor());
224 ASSERT_EQ(0, CountFiles(*database));
225 accessor->Create("uuid", "abcd\0\1\2\3\4\5", 10, OrthancPluginContentType_Unknown);
226 ASSERT_EQ(1u, CountFiles(*database));
227 }
228
229 {
230 std::unique_ptr<OrthancDatabases::StorageBackend::IAccessor> accessor(storageArea.CreateAccessor());
231 ASSERT_EQ(1u, CountFiles(*database));
232
233 std::string s;
234 OrthancDatabases::StorageBackend::ReadWholeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown);
235 ASSERT_EQ(10u, s.size());
236 ASSERT_EQ('a', s[0]);
237 ASSERT_EQ('d', s[3]);
238 ASSERT_EQ('\0', s[4]);
239 ASSERT_EQ('\5', s[9]);
240
241 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 0);
242 ASSERT_TRUE(s.empty());
243
244 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 1);
245 ASSERT_EQ(1u, s.size());
246 ASSERT_EQ('a', s[0]);
247
248 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 1);
249 ASSERT_EQ(1u, s.size());
250 ASSERT_EQ('\0', s[0]);
251
252 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 9, 1);
253 ASSERT_EQ(1u, s.size());
254 ASSERT_EQ('\5', s[0]);
255
256 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 10, 0);
257 ASSERT_TRUE(s.empty());
258
259 // Cannot read non-empty range after the end of the string
260 ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString(
261 s, *accessor, "uuid", OrthancPluginContentType_Unknown, 10, 1), Orthanc::OrthancException);
262
263 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 0, 4);
264 ASSERT_EQ(4u, s.size());
265 ASSERT_EQ('a', s[0]);
266 ASSERT_EQ('b', s[1]);
267 ASSERT_EQ('c', s[2]);
268 ASSERT_EQ('d', s[3]);
269
270 OrthancDatabases::StorageBackend::ReadRangeToString(s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 6);
271 ASSERT_EQ(6u, s.size());
272 ASSERT_EQ('\0', s[0]);
273 ASSERT_EQ('\1', s[1]);
274 ASSERT_EQ('\2', s[2]);
275 ASSERT_EQ('\3', s[3]);
276 ASSERT_EQ('\4', s[4]);
277 ASSERT_EQ('\5', s[5]);
278
279 ASSERT_THROW(OrthancDatabases::StorageBackend::ReadRangeToString(
280 s, *accessor, "uuid", OrthancPluginContentType_Unknown, 4, 7), Orthanc::OrthancException);
209 } 281 }
210 } 282 }
211 283
212 284
213 TEST(MySQL, ImplicitTransaction) 285 TEST(MySQL, ImplicitTransaction)