Mercurial > hg > orthanc
comparison OrthancServer/DatabaseWrapperBase.cpp @ 1671:2f2e2ec17bc4 db-changes
sample database plugin
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 01 Oct 2015 17:44:43 +0200 |
parents | 16955f8fec4d |
children | 2ad22b2970a2 |
comparison
equal
deleted
inserted
replaced
1670:16955f8fec4d | 1671:2f2e2ec17bc4 |
---|---|
96 | 96 |
97 return true; | 97 return true; |
98 } | 98 } |
99 } | 99 } |
100 | 100 |
101 bool DatabaseWrapperBase::LookupParent(int64_t& parentId, | 101 ErrorCode DatabaseWrapperBase::LookupParent(bool& found, |
102 int64_t resourceId) | 102 int64_t& parentId, |
103 int64_t resourceId) | |
103 { | 104 { |
104 SQLite::Statement s(db_, SQLITE_FROM_HERE, | 105 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
105 "SELECT parentId FROM Resources WHERE internalId=?"); | 106 "SELECT parentId FROM Resources WHERE internalId=?"); |
106 s.BindInt64(0, resourceId); | 107 s.BindInt64(0, resourceId); |
107 | 108 |
108 if (!s.Step()) | 109 if (!s.Step()) |
109 { | 110 { |
110 throw OrthancException(ErrorCode_UnknownResource); | 111 return ErrorCode_UnknownResource; |
111 } | 112 } |
112 | 113 |
113 if (s.ColumnIsNull(0)) | 114 if (s.ColumnIsNull(0)) |
114 { | 115 { |
115 return false; | 116 found = false; |
116 } | 117 } |
117 else | 118 else |
118 { | 119 { |
120 found = true; | |
119 parentId = s.ColumnInt(0); | 121 parentId = s.ColumnInt(0); |
120 return true; | 122 } |
121 } | 123 |
122 } | 124 return ErrorCode_Success; |
123 | 125 } |
124 std::string DatabaseWrapperBase::GetPublicId(int64_t resourceId) | 126 |
127 bool DatabaseWrapperBase::GetPublicId(std::string& result, | |
128 int64_t resourceId) | |
125 { | 129 { |
126 SQLite::Statement s(db_, SQLITE_FROM_HERE, | 130 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
127 "SELECT publicId FROM Resources WHERE internalId=?"); | 131 "SELECT publicId FROM Resources WHERE internalId=?"); |
128 s.BindInt64(0, resourceId); | 132 s.BindInt64(0, resourceId); |
129 | 133 |
130 if (!s.Step()) | 134 if (!s.Step()) |
131 { | 135 { |
132 throw OrthancException(ErrorCode_UnknownResource); | 136 return false; |
133 } | 137 } |
134 | 138 else |
135 return s.ColumnString(0); | 139 { |
136 } | 140 result = s.ColumnString(0); |
137 | 141 return true; |
138 | 142 } |
139 ResourceType DatabaseWrapperBase::GetResourceType(int64_t resourceId) | 143 } |
144 | |
145 | |
146 ErrorCode DatabaseWrapperBase::GetResourceType(ResourceType& result, | |
147 int64_t resourceId) | |
140 { | 148 { |
141 SQLite::Statement s(db_, SQLITE_FROM_HERE, | 149 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
142 "SELECT resourceType FROM Resources WHERE internalId=?"); | 150 "SELECT resourceType FROM Resources WHERE internalId=?"); |
143 s.BindInt64(0, resourceId); | 151 s.BindInt64(0, resourceId); |
144 | 152 |
145 if (!s.Step()) | 153 if (s.Step()) |
154 { | |
155 result = static_cast<ResourceType>(s.ColumnInt(0)); | |
156 return ErrorCode_Success; | |
157 } | |
158 else | |
146 { | 159 { |
147 throw OrthancException(ErrorCode_UnknownResource); | 160 return ErrorCode_UnknownResource; |
148 } | 161 } |
149 | |
150 return static_cast<ResourceType>(s.ColumnInt(0)); | |
151 } | 162 } |
152 | 163 |
153 | 164 |
154 void DatabaseWrapperBase::AttachChild(int64_t parent, | 165 void DatabaseWrapperBase::AttachChild(int64_t parent, |
155 int64_t child) | 166 int64_t child) |
398 s.BindString(3, change.GetDate()); | 409 s.BindString(3, change.GetDate()); |
399 s.Run(); | 410 s.Run(); |
400 } | 411 } |
401 | 412 |
402 | 413 |
403 void DatabaseWrapperBase::GetChangesInternal(std::list<ServerIndexChange>& target, | 414 ErrorCode DatabaseWrapperBase::GetChangesInternal(std::list<ServerIndexChange>& target, |
404 bool& done, | 415 bool& done, |
405 SQLite::Statement& s, | 416 SQLite::Statement& s, |
406 uint32_t maxResults) | 417 uint32_t maxResults) |
407 { | 418 { |
408 target.clear(); | 419 target.clear(); |
409 | 420 |
410 while (target.size() < maxResults && s.Step()) | 421 while (target.size() < maxResults && s.Step()) |
411 { | 422 { |
413 ChangeType changeType = static_cast<ChangeType>(s.ColumnInt(1)); | 424 ChangeType changeType = static_cast<ChangeType>(s.ColumnInt(1)); |
414 ResourceType resourceType = static_cast<ResourceType>(s.ColumnInt(3)); | 425 ResourceType resourceType = static_cast<ResourceType>(s.ColumnInt(3)); |
415 const std::string& date = s.ColumnString(4); | 426 const std::string& date = s.ColumnString(4); |
416 | 427 |
417 int64_t internalId = s.ColumnInt64(2); | 428 int64_t internalId = s.ColumnInt64(2); |
418 std::string publicId = GetPublicId(internalId); | 429 std::string publicId; |
430 if (!GetPublicId(publicId, internalId)) | |
431 { | |
432 return ErrorCode_UnknownResource; | |
433 } | |
419 | 434 |
420 target.push_back(ServerIndexChange(seq, changeType, resourceType, publicId, date)); | 435 target.push_back(ServerIndexChange(seq, changeType, resourceType, publicId, date)); |
421 } | 436 } |
422 | 437 |
423 done = !(target.size() == maxResults && s.Step()); | 438 done = !(target.size() == maxResults && s.Step()); |
424 } | 439 return ErrorCode_Success; |
425 | 440 } |
426 | 441 |
427 void DatabaseWrapperBase::GetChanges(std::list<ServerIndexChange>& target, | 442 |
428 bool& done, | 443 ErrorCode DatabaseWrapperBase::GetChanges(std::list<ServerIndexChange>& target, |
429 int64_t since, | 444 bool& done, |
430 uint32_t maxResults) | 445 int64_t since, |
446 uint32_t maxResults) | |
431 { | 447 { |
432 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM Changes WHERE seq>? ORDER BY seq LIMIT ?"); | 448 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM Changes WHERE seq>? ORDER BY seq LIMIT ?"); |
433 s.BindInt64(0, since); | 449 s.BindInt64(0, since); |
434 s.BindInt(1, maxResults + 1); | 450 s.BindInt(1, maxResults + 1); |
435 GetChangesInternal(target, done, s, maxResults); | 451 return GetChangesInternal(target, done, s, maxResults); |
436 } | 452 } |
437 | 453 |
438 void DatabaseWrapperBase::GetLastChange(std::list<ServerIndexChange>& target) | 454 ErrorCode DatabaseWrapperBase::GetLastChange(std::list<ServerIndexChange>& target) |
439 { | 455 { |
440 bool done; // Ignored | 456 bool done; // Ignored |
441 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM Changes ORDER BY seq DESC LIMIT 1"); | 457 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM Changes ORDER BY seq DESC LIMIT 1"); |
442 GetChangesInternal(target, done, s, 1); | 458 return GetChangesInternal(target, done, s, 1); |
443 } | 459 } |
444 | 460 |
445 | 461 |
446 void DatabaseWrapperBase::LogExportedResource(const ExportedResource& resource) | 462 void DatabaseWrapperBase::LogExportedResource(const ExportedResource& resource) |
447 { | 463 { |
571 "SELECT COUNT(*) FROM Resources WHERE resourceType=?"); | 587 "SELECT COUNT(*) FROM Resources WHERE resourceType=?"); |
572 s.BindInt(0, resourceType); | 588 s.BindInt(0, resourceType); |
573 | 589 |
574 if (!s.Step()) | 590 if (!s.Step()) |
575 { | 591 { |
576 throw OrthancException(ErrorCode_InternalError); | 592 return 0; |
577 } | 593 } |
578 | 594 else |
579 int64_t c = s.ColumnInt(0); | 595 { |
580 assert(!s.Step()); | 596 int64_t c = s.ColumnInt(0); |
581 | 597 assert(!s.Step()); |
582 return c; | 598 return c; |
599 } | |
583 } | 600 } |
584 | 601 |
585 | 602 |
586 bool DatabaseWrapperBase::SelectPatientToRecycle(int64_t& internalId) | 603 bool DatabaseWrapperBase::SelectPatientToRecycle(int64_t& internalId) |
587 { | 604 { |
662 | 679 |
663 void DatabaseWrapperBase::LookupIdentifier(std::list<int64_t>& target, | 680 void DatabaseWrapperBase::LookupIdentifier(std::list<int64_t>& target, |
664 const DicomTag& tag, | 681 const DicomTag& tag, |
665 const std::string& value) | 682 const std::string& value) |
666 { | 683 { |
667 if (!tag.IsIdentifier()) | |
668 { | |
669 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
670 } | |
671 | |
672 SQLite::Statement s(db_, SQLITE_FROM_HERE, | 684 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
673 "SELECT id FROM DicomIdentifiers WHERE tagGroup=? AND tagElement=? and value=?"); | 685 "SELECT id FROM DicomIdentifiers WHERE tagGroup=? AND tagElement=? and value=?"); |
674 | 686 |
675 s.BindInt(0, tag.GetGroup()); | 687 s.BindInt(0, tag.GetGroup()); |
676 s.BindInt(1, tag.GetElement()); | 688 s.BindInt(1, tag.GetElement()); |