PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::storage::mpps_repository Class Reference

#include <mpps_repository.h>

Collaboration diagram for kcenon::pacs::storage::mpps_repository:
Collaboration graph

Public Member Functions

 mpps_repository (sqlite3 *db)
 
 ~mpps_repository ()
 
 mpps_repository (const mpps_repository &)=delete
 
auto operator= (const mpps_repository &) -> mpps_repository &=delete
 
 mpps_repository (mpps_repository &&) noexcept
 
auto operator= (mpps_repository &&) noexcept -> mpps_repository &
 
auto create_mpps (std::string_view mpps_uid, std::string_view station_ae="", std::string_view modality="", std::string_view study_uid="", std::string_view accession_no="", std::string_view start_datetime="") -> Result< int64_t >
 
auto create_mpps (const mpps_record &record) -> Result< int64_t >
 
auto update_mpps (std::string_view mpps_uid, std::string_view new_status, std::string_view end_datetime="", std::string_view performed_series="") -> VoidResult
 
auto update_mpps (const mpps_record &record) -> VoidResult
 
auto find_mpps (std::string_view mpps_uid) const -> std::optional< mpps_record >
 
auto find_mpps_by_pk (int64_t pk) const -> std::optional< mpps_record >
 
auto list_active_mpps (std::string_view station_ae) const -> Result< std::vector< mpps_record > >
 
auto find_mpps_by_study (std::string_view study_uid) const -> Result< std::vector< mpps_record > >
 
auto search_mpps (const mpps_query &query) const -> Result< std::vector< mpps_record > >
 
auto delete_mpps (std::string_view mpps_uid) -> VoidResult
 
auto mpps_count () const -> Result< size_t >
 
auto mpps_count (std::string_view status) const -> Result< size_t >
 

Private Member Functions

auto parse_mpps_row (void *stmt) const -> mpps_record
 

Static Private Member Functions

static auto parse_timestamp (const std::string &str) -> std::chrono::system_clock::time_point
 

Private Attributes

sqlite3 * db_ {nullptr}
 

Detailed Description

Definition at line 99 of file mpps_repository.h.

Constructor & Destructor Documentation

◆ mpps_repository() [1/3]

kcenon::pacs::storage::mpps_repository::mpps_repository ( sqlite3 * db)
explicit

Definition at line 541 of file mpps_repository.cpp.

◆ ~mpps_repository()

kcenon::pacs::storage::mpps_repository::~mpps_repository ( )
default

◆ mpps_repository() [2/3]

kcenon::pacs::storage::mpps_repository::mpps_repository ( const mpps_repository & )
delete

◆ mpps_repository() [3/3]

kcenon::pacs::storage::mpps_repository::mpps_repository ( mpps_repository && other)
noexcept

Definition at line 545 of file mpps_repository.cpp.

546 : db_(other.db_) {
547 other.db_ = nullptr;
548}

Member Function Documentation

◆ create_mpps() [1/2]

auto kcenon::pacs::storage::mpps_repository::create_mpps ( const mpps_record & record) -> Result<int64_t>
nodiscard

Definition at line 605 of file mpps_repository.cpp.

605 {
606 if (record.mpps_uid.empty()) {
607 return make_error<int64_t>(-1, "MPPS SOP Instance UID is required",
608 "storage");
609 }
610
611 if (!record.status.empty() && record.status != "IN PROGRESS") {
612 return make_error<int64_t>(
613 -1, "N-CREATE must create MPPS with status 'IN PROGRESS'",
614 "storage");
615 }
616
617 const char* sql = R"(
618 INSERT INTO mpps (
619 mpps_uid, status, start_datetime, station_ae, station_name,
620 modality, study_uid, accession_no, scheduled_step_id,
621 requested_proc_id, performed_series, updated_at
622 ) VALUES (?, 'IN PROGRESS', ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))
623 RETURNING mpps_pk;
624 )";
625
626 sqlite3_stmt* stmt = nullptr;
627 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
628 if (rc != SQLITE_OK) {
629 return make_error<int64_t>(
630 rc,
631 kcenon::pacs::compat::format("Failed to prepare statement: {}",
632 sqlite3_errmsg(db_)),
633 "storage");
634 }
635
636 sqlite3_bind_text(stmt, 1, record.mpps_uid.c_str(), -1, SQLITE_TRANSIENT);
637 sqlite3_bind_text(stmt, 2, record.start_datetime.c_str(), -1,
638 SQLITE_TRANSIENT);
639 sqlite3_bind_text(stmt, 3, record.station_ae.c_str(), -1, SQLITE_TRANSIENT);
640 sqlite3_bind_text(stmt, 4, record.station_name.c_str(), -1,
641 SQLITE_TRANSIENT);
642 sqlite3_bind_text(stmt, 5, record.modality.c_str(), -1, SQLITE_TRANSIENT);
643 sqlite3_bind_text(stmt, 6, record.study_uid.c_str(), -1, SQLITE_TRANSIENT);
644 sqlite3_bind_text(stmt, 7, record.accession_no.c_str(), -1,
645 SQLITE_TRANSIENT);
646 sqlite3_bind_text(stmt, 8, record.scheduled_step_id.c_str(), -1,
647 SQLITE_TRANSIENT);
648 sqlite3_bind_text(stmt, 9, record.requested_proc_id.c_str(), -1,
649 SQLITE_TRANSIENT);
650 sqlite3_bind_text(stmt, 10, record.performed_series.c_str(), -1,
651 SQLITE_TRANSIENT);
652
653 rc = sqlite3_step(stmt);
654 if (rc != SQLITE_ROW) {
655 auto error_msg = sqlite3_errmsg(db_);
656 sqlite3_finalize(stmt);
657 return make_error<int64_t>(
658 rc, kcenon::pacs::compat::format("Failed to create MPPS: {}", error_msg),
659 "storage");
660 }
661
662 auto pk = sqlite3_column_int64(stmt, 0);
663 sqlite3_finalize(stmt);
664 return pk;
665}

◆ create_mpps() [2/2]

auto kcenon::pacs::storage::mpps_repository::create_mpps ( std::string_view mpps_uid,
std::string_view station_ae = "",
std::string_view modality = "",
std::string_view study_uid = "",
std::string_view accession_no = "",
std::string_view start_datetime = "" ) -> Result<int64_t>
nodiscard

Definition at line 587 of file mpps_repository.cpp.

593 {
594 mpps_record record;
595 record.mpps_uid = std::string(mpps_uid);
596 record.station_ae = std::string(station_ae);
597 record.modality = std::string(modality);
598 record.study_uid = std::string(study_uid);
599 record.accession_no = std::string(accession_no);
600 record.start_datetime = std::string(start_datetime);
601 record.status = "IN PROGRESS";
602 return create_mpps(record);
603}
auto create_mpps(std::string_view mpps_uid, std::string_view station_ae="", std::string_view modality="", std::string_view study_uid="", std::string_view accession_no="", std::string_view start_datetime="") -> Result< int64_t >

◆ delete_mpps()

auto kcenon::pacs::storage::mpps_repository::delete_mpps ( std::string_view mpps_uid) -> VoidResult
nodiscard

Definition at line 963 of file mpps_repository.cpp.

963 {
964 const char* sql = "DELETE FROM mpps WHERE mpps_uid = ?;";
965
966 sqlite3_stmt* stmt = nullptr;
967 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
968 if (rc != SQLITE_OK) {
969 return make_error<std::monostate>(
970 rc,
971 kcenon::pacs::compat::format("Failed to prepare delete: {}",
972 sqlite3_errmsg(db_)),
973 "storage");
974 }
975
976 sqlite3_bind_text(stmt, 1, mpps_uid.data(),
977 static_cast<int>(mpps_uid.size()), SQLITE_TRANSIENT);
978
979 rc = sqlite3_step(stmt);
980 sqlite3_finalize(stmt);
981
982 if (rc != SQLITE_DONE) {
983 return make_error<std::monostate>(
984 rc,
985 kcenon::pacs::compat::format("Failed to delete MPPS: {}",
986 sqlite3_errmsg(db_)),
987 "storage");
988 }
989
990 return ok();
991}

◆ find_mpps()

auto kcenon::pacs::storage::mpps_repository::find_mpps ( std::string_view mpps_uid) const -> std::optional<mpps_record>
nodiscard

Definition at line 754 of file mpps_repository.cpp.

755 {
756 const char* sql = R"(
757 SELECT mpps_pk, mpps_uid, status, start_datetime, end_datetime,
758 station_ae, station_name, modality, study_uid, accession_no,
759 scheduled_step_id, requested_proc_id, performed_series,
760 created_at, updated_at
761 FROM mpps
762 WHERE mpps_uid = ?;
763 )";
764
765 sqlite3_stmt* stmt = nullptr;
766 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
767 if (rc != SQLITE_OK) {
768 return std::nullopt;
769 }
770
771 sqlite3_bind_text(stmt, 1, mpps_uid.data(),
772 static_cast<int>(mpps_uid.size()), SQLITE_TRANSIENT);
773
774 rc = sqlite3_step(stmt);
775 if (rc != SQLITE_ROW) {
776 sqlite3_finalize(stmt);
777 return std::nullopt;
778 }
779
780 auto record = parse_mpps_row(stmt);
781 sqlite3_finalize(stmt);
782 return record;
783}
auto parse_mpps_row(void *stmt) const -> mpps_record

◆ find_mpps_by_pk()

auto kcenon::pacs::storage::mpps_repository::find_mpps_by_pk ( int64_t pk) const -> std::optional<mpps_record>
nodiscard

Definition at line 785 of file mpps_repository.cpp.

786 {
787 const char* sql = R"(
788 SELECT mpps_pk, mpps_uid, status, start_datetime, end_datetime,
789 station_ae, station_name, modality, study_uid, accession_no,
790 scheduled_step_id, requested_proc_id, performed_series,
791 created_at, updated_at
792 FROM mpps
793 WHERE mpps_pk = ?;
794 )";
795
796 sqlite3_stmt* stmt = nullptr;
797 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
798 if (rc != SQLITE_OK) {
799 return std::nullopt;
800 }
801
802 sqlite3_bind_int64(stmt, 1, pk);
803
804 rc = sqlite3_step(stmt);
805 if (rc != SQLITE_ROW) {
806 sqlite3_finalize(stmt);
807 return std::nullopt;
808 }
809
810 auto record = parse_mpps_row(stmt);
811 sqlite3_finalize(stmt);
812 return record;
813}

◆ find_mpps_by_study()

auto kcenon::pacs::storage::mpps_repository::find_mpps_by_study ( std::string_view study_uid) const -> Result<std::vector<mpps_record>>
nodiscard

Definition at line 850 of file mpps_repository.cpp.

851 {
852 std::vector<mpps_record> results;
853
854 const char* sql = R"(
855 SELECT mpps_pk, mpps_uid, status, start_datetime, end_datetime,
856 station_ae, station_name, modality, study_uid, accession_no,
857 scheduled_step_id, requested_proc_id, performed_series,
858 created_at, updated_at
859 FROM mpps
860 WHERE study_uid = ?
861 ORDER BY start_datetime DESC;
862 )";
863
864 sqlite3_stmt* stmt = nullptr;
865 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
866 if (rc != SQLITE_OK) {
867 return make_error<std::vector<mpps_record>>(
868 rc,
869 kcenon::pacs::compat::format("Failed to prepare query: {}",
870 sqlite3_errmsg(db_)),
871 "storage");
872 }
873
874 sqlite3_bind_text(stmt, 1, study_uid.data(),
875 static_cast<int>(study_uid.size()), SQLITE_TRANSIENT);
876
877 while (sqlite3_step(stmt) == SQLITE_ROW) {
878 results.push_back(parse_mpps_row(stmt));
879 }
880
881 sqlite3_finalize(stmt);
882 return ok(std::move(results));
883}

◆ list_active_mpps()

auto kcenon::pacs::storage::mpps_repository::list_active_mpps ( std::string_view station_ae) const -> Result<std::vector<mpps_record>>
nodiscard

Definition at line 815 of file mpps_repository.cpp.

816 {
817 std::vector<mpps_record> results;
818
819 const char* sql = R"(
820 SELECT mpps_pk, mpps_uid, status, start_datetime, end_datetime,
821 station_ae, station_name, modality, study_uid, accession_no,
822 scheduled_step_id, requested_proc_id, performed_series,
823 created_at, updated_at
824 FROM mpps
825 WHERE status = 'IN PROGRESS' AND station_ae = ?
826 ORDER BY start_datetime DESC;
827 )";
828
829 sqlite3_stmt* stmt = nullptr;
830 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
831 if (rc != SQLITE_OK) {
832 return make_error<std::vector<mpps_record>>(
833 rc,
834 kcenon::pacs::compat::format("Failed to prepare query: {}",
835 sqlite3_errmsg(db_)),
836 "storage");
837 }
838
839 sqlite3_bind_text(stmt, 1, station_ae.data(),
840 static_cast<int>(station_ae.size()), SQLITE_TRANSIENT);
841
842 while (sqlite3_step(stmt) == SQLITE_ROW) {
843 results.push_back(parse_mpps_row(stmt));
844 }
845
846 sqlite3_finalize(stmt);
847 return ok(std::move(results));
848}
@ station_ae
(0008,1010) Station Name or calling AE

◆ mpps_count() [1/2]

auto kcenon::pacs::storage::mpps_repository::mpps_count ( ) const -> Result<size_t>
nodiscard

Definition at line 993 of file mpps_repository.cpp.

993 {
994 const char* sql = "SELECT COUNT(*) FROM mpps;";
995 sqlite3_stmt* stmt = nullptr;
996 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
997 if (rc != SQLITE_OK) {
998 return make_error<size_t>(
999 rc,
1000 kcenon::pacs::compat::format("Failed to prepare query: {}",
1001 sqlite3_errmsg(db_)),
1002 "storage");
1003 }
1004
1005 size_t count = 0;
1006 if (sqlite3_step(stmt) == SQLITE_ROW) {
1007 count = static_cast<size_t>(sqlite3_column_int64(stmt, 0));
1008 }
1009 sqlite3_finalize(stmt);
1010 return ok(count);
1011}

References db_.

◆ mpps_count() [2/2]

auto kcenon::pacs::storage::mpps_repository::mpps_count ( std::string_view status) const -> Result<size_t>
nodiscard

Definition at line 1013 of file mpps_repository.cpp.

1014 {
1015 const char* sql = "SELECT COUNT(*) FROM mpps WHERE status = ?;";
1016 sqlite3_stmt* stmt = nullptr;
1017 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
1018 if (rc != SQLITE_OK) {
1019 return make_error<size_t>(
1020 rc,
1021 kcenon::pacs::compat::format("Failed to prepare query: {}",
1022 sqlite3_errmsg(db_)),
1023 "storage");
1024 }
1025
1026 sqlite3_bind_text(stmt, 1, status.data(), static_cast<int>(status.size()),
1027 SQLITE_TRANSIENT);
1028
1029 size_t count = 0;
1030 if (sqlite3_step(stmt) == SQLITE_ROW) {
1031 count = static_cast<size_t>(sqlite3_column_int64(stmt, 0));
1032 }
1033 sqlite3_finalize(stmt);
1034 return ok(count);
1035}
constexpr dicom_tag status
Status.

◆ operator=() [1/2]

auto kcenon::pacs::storage::mpps_repository::operator= ( const mpps_repository & ) -> mpps_repository &=delete
delete

◆ operator=() [2/2]

auto kcenon::pacs::storage::mpps_repository::operator= ( mpps_repository && other) -> mpps_repository&
noexcept

Definition at line 550 of file mpps_repository.cpp.

551 {
552 if (this != &other) {
553 db_ = other.db_;
554 other.db_ = nullptr;
555 }
556 return *this;
557}

◆ parse_mpps_row()

auto kcenon::pacs::storage::mpps_repository::parse_mpps_row ( void * stmt) const -> mpps_record
nodiscardprivate

Definition at line 564 of file mpps_repository.cpp.

564 {
565 auto* stmt = static_cast<sqlite3_stmt*>(stmt_ptr);
566 mpps_record record;
567
568 record.pk = sqlite3_column_int64(stmt, 0);
569 record.mpps_uid = get_text(stmt, 1);
570 record.status = get_text(stmt, 2);
571 record.start_datetime = get_text(stmt, 3);
572 record.end_datetime = get_text(stmt, 4);
573 record.station_ae = get_text(stmt, 5);
574 record.station_name = get_text(stmt, 6);
575 record.modality = get_text(stmt, 7);
576 record.study_uid = get_text(stmt, 8);
577 record.accession_no = get_text(stmt, 9);
578 record.scheduled_step_id = get_text(stmt, 10);
579 record.requested_proc_id = get_text(stmt, 11);
580 record.performed_series = get_text(stmt, 12);
581 record.created_at = parse_datetime(get_text(stmt, 13).c_str());
582 record.updated_at = parse_datetime(get_text(stmt, 14).c_str());
583
584 return record;
585}

◆ parse_timestamp()

auto kcenon::pacs::storage::mpps_repository::parse_timestamp ( const std::string & str) -> std::chrono::system_clock::time_point
staticnodiscardprivate

Definition at line 559 of file mpps_repository.cpp.

560 {
561 return parse_datetime(str.c_str());
562}

◆ search_mpps()

auto kcenon::pacs::storage::mpps_repository::search_mpps ( const mpps_query & query) const -> Result<std::vector<mpps_record>>
nodiscard

Definition at line 885 of file mpps_repository.cpp.

886 {
887 std::vector<mpps_record> results;
888 std::string sql = R"(
889 SELECT mpps_pk, mpps_uid, status, start_datetime, end_datetime,
890 station_ae, station_name, modality, study_uid, accession_no,
891 scheduled_step_id, requested_proc_id, performed_series,
892 created_at, updated_at
893 FROM mpps
894 WHERE 1=1
895 )";
896 std::vector<std::string> params;
897
898 if (query.mpps_uid.has_value()) {
899 sql += " AND mpps_uid = ?";
900 params.push_back(*query.mpps_uid);
901 }
902 if (query.status.has_value()) {
903 sql += " AND status = ?";
904 params.push_back(*query.status);
905 }
906 if (query.station_ae.has_value()) {
907 sql += " AND station_ae = ?";
908 params.push_back(*query.station_ae);
909 }
910 if (query.modality.has_value()) {
911 sql += " AND modality = ?";
912 params.push_back(*query.modality);
913 }
914 if (query.study_uid.has_value()) {
915 sql += " AND study_uid = ?";
916 params.push_back(*query.study_uid);
917 }
918 if (query.accession_no.has_value()) {
919 sql += " AND accession_no = ?";
920 params.push_back(*query.accession_no);
921 }
922 if (query.start_date_from.has_value()) {
923 sql += " AND substr(start_datetime, 1, 8) >= ?";
924 params.push_back(*query.start_date_from);
925 }
926 if (query.start_date_to.has_value()) {
927 sql += " AND substr(start_datetime, 1, 8) <= ?";
928 params.push_back(*query.start_date_to);
929 }
930
931 sql += " ORDER BY start_datetime DESC";
932
933 if (query.limit > 0) {
934 sql += kcenon::pacs::compat::format(" LIMIT {}", query.limit);
935 }
936 if (query.offset > 0) {
937 sql += kcenon::pacs::compat::format(" OFFSET {}", query.offset);
938 }
939
940 sqlite3_stmt* stmt = nullptr;
941 auto rc = sqlite3_prepare_v2(db_, sql.c_str(), -1, &stmt, nullptr);
942 if (rc != SQLITE_OK) {
943 return make_error<std::vector<mpps_record>>(
944 rc,
945 kcenon::pacs::compat::format("Failed to prepare query: {}",
946 sqlite3_errmsg(db_)),
947 "storage");
948 }
949
950 for (size_t i = 0; i < params.size(); ++i) {
951 sqlite3_bind_text(stmt, static_cast<int>(i + 1), params[i].c_str(), -1,
952 SQLITE_TRANSIENT);
953 }
954
955 while (sqlite3_step(stmt) == SQLITE_ROW) {
956 results.push_back(parse_mpps_row(stmt));
957 }
958
959 sqlite3_finalize(stmt);
960 return ok(std::move(results));
961}
const atna_coded_value query
Query (110112)

◆ update_mpps() [1/2]

auto kcenon::pacs::storage::mpps_repository::update_mpps ( const mpps_record & record) -> VoidResult
nodiscard

Definition at line 744 of file mpps_repository.cpp.

744 {
745 if (record.mpps_uid.empty()) {
746 return make_error<std::monostate>(-1, "MPPS UID is required for update",
747 "storage");
748 }
749
750 return update_mpps(record.mpps_uid, record.status, record.end_datetime,
751 record.performed_series);
752}
auto update_mpps(std::string_view mpps_uid, std::string_view new_status, std::string_view end_datetime="", std::string_view performed_series="") -> VoidResult

◆ update_mpps() [2/2]

auto kcenon::pacs::storage::mpps_repository::update_mpps ( std::string_view mpps_uid,
std::string_view new_status,
std::string_view end_datetime = "",
std::string_view performed_series = "" ) -> VoidResult
nodiscard

Definition at line 667 of file mpps_repository.cpp.

671 {
672 if (new_status != "COMPLETED" && new_status != "DISCONTINUED" &&
673 new_status != "IN PROGRESS") {
674 return make_error<std::monostate>(
675 -1,
676 "Invalid status. Must be 'IN PROGRESS', 'COMPLETED', or "
677 "'DISCONTINUED'",
678 "storage");
679 }
680
681 auto current = find_mpps(mpps_uid);
682 if (!current.has_value()) {
683 return make_error<std::monostate>(-1, "MPPS not found", "storage");
684 }
685
686 if (current->status == "COMPLETED" || current->status == "DISCONTINUED") {
687 return make_error<std::monostate>(
688 -1,
689 kcenon::pacs::compat::format(
690 "Cannot update MPPS in final state '{}'. COMPLETED and "
691 "DISCONTINUED are final states.",
692 current->status),
693 "storage");
694 }
695
696 const char* sql = R"(
697 UPDATE mpps
698 SET status = ?,
699 end_datetime = CASE WHEN ? != '' THEN ? ELSE end_datetime END,
700 performed_series = CASE WHEN ? != '' THEN ? ELSE performed_series END,
701 updated_at = datetime('now')
702 WHERE mpps_uid = ?;
703 )";
704
705 sqlite3_stmt* stmt = nullptr;
706 auto rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, nullptr);
707 if (rc != SQLITE_OK) {
708 return make_error<std::monostate>(
709 rc,
710 kcenon::pacs::compat::format("Failed to prepare statement: {}",
711 sqlite3_errmsg(db_)),
712 "storage");
713 }
714
715 sqlite3_bind_text(stmt, 1, new_status.data(),
716 static_cast<int>(new_status.size()), SQLITE_TRANSIENT);
717 sqlite3_bind_text(stmt, 2, end_datetime.data(),
718 static_cast<int>(end_datetime.size()), SQLITE_TRANSIENT);
719 sqlite3_bind_text(stmt, 3, end_datetime.data(),
720 static_cast<int>(end_datetime.size()), SQLITE_TRANSIENT);
721 sqlite3_bind_text(stmt, 4, performed_series.data(),
722 static_cast<int>(performed_series.size()),
723 SQLITE_TRANSIENT);
724 sqlite3_bind_text(stmt, 5, performed_series.data(),
725 static_cast<int>(performed_series.size()),
726 SQLITE_TRANSIENT);
727 sqlite3_bind_text(stmt, 6, mpps_uid.data(),
728 static_cast<int>(mpps_uid.size()), SQLITE_TRANSIENT);
729
730 rc = sqlite3_step(stmt);
731 sqlite3_finalize(stmt);
732
733 if (rc != SQLITE_DONE) {
734 return make_error<std::monostate>(
735 rc,
736 kcenon::pacs::compat::format("Failed to update MPPS: {}",
737 sqlite3_errmsg(db_)),
738 "storage");
739 }
740
741 return ok();
742}
auto find_mpps(std::string_view mpps_uid) const -> std::optional< mpps_record >

Member Data Documentation

◆ db_

sqlite3* kcenon::pacs::storage::mpps_repository::db_ {nullptr}
private

Definition at line 143 of file mpps_repository.h.

143{nullptr};

Referenced by mpps_count().


The documentation for this class was generated from the following files: