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());