Mercurial > hg > orthanc-databases
annotate Framework/PostgreSQL/PostgreSQLParameters.cpp @ 161:2ccde9c7311b optimized-routes
added new optimized REST routes. this is a temporary work to try to speed up some routes (used by LRO). This way, we avoid another app to access the Orthanc DB and we skip the plugin SDK update for a very specific route
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Fri, 10 Jul 2020 13:26:47 +0200 |
parents | 063aa53b5917 |
children |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
140
4cd7e45b671e
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
80
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #include "PostgreSQLParameters.h" | |
23 | |
152 | 24 #include <Logging.h> |
25 #include <OrthancException.h> | |
0 | 26 |
27 #include <boost/lexical_cast.hpp> | |
28 | |
29 | |
30 namespace OrthancDatabases | |
31 { | |
32 void PostgreSQLParameters::Reset() | |
33 { | |
34 host_ = "localhost"; | |
35 port_ = 5432; | |
36 username_ = ""; | |
37 password_ = ""; | |
38 database_.clear(); | |
39 uri_.clear(); | |
80
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
40 ssl_ = false; |
0 | 41 lock_ = true; |
141
0b3e9ee53c46
Added 'MaximumConnectionRetries' & 'ConnectionRetryInterval' to configure the retries when connecting to the DB at startup
Alain Mazy <alain@mazy.be>
parents:
140
diff
changeset
|
42 maxConnectionRetries_ = 10; |
0b3e9ee53c46
Added 'MaximumConnectionRetries' & 'ConnectionRetryInterval' to configure the retries when connecting to the DB at startup
Alain Mazy <alain@mazy.be>
parents:
140
diff
changeset
|
43 connectionRetryInterval_ = 5; |
161
2ccde9c7311b
added new optimized REST routes. this is a temporary work to try to speed up some routes (used by LRO). This way, we avoid another app to access the Orthanc DB and we skip the plugin SDK update for a very specific route
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
44 enabledOptimizedRoutes_ = false; |
0 | 45 } |
46 | |
47 | |
48 PostgreSQLParameters::PostgreSQLParameters() | |
49 { | |
50 Reset(); | |
51 } | |
52 | |
53 | |
54 PostgreSQLParameters::PostgreSQLParameters(const OrthancPlugins::OrthancConfiguration& configuration) | |
55 { | |
56 Reset(); | |
57 | |
58 std::string s; | |
59 | |
60 if (configuration.LookupStringValue(s, "ConnectionUri")) | |
61 { | |
62 SetConnectionUri(s); | |
63 } | |
64 else | |
65 { | |
66 if (configuration.LookupStringValue(s, "Host")) | |
67 { | |
68 SetHost(s); | |
69 } | |
70 | |
71 unsigned int port; | |
72 if (configuration.LookupUnsignedIntegerValue(port, "Port")) | |
73 { | |
74 SetPortNumber(port); | |
75 } | |
76 | |
77 if (configuration.LookupStringValue(s, "Database")) | |
78 { | |
79 SetDatabase(s); | |
80 } | |
81 | |
82 if (configuration.LookupStringValue(s, "Username")) | |
83 { | |
84 SetUsername(s); | |
85 } | |
86 | |
87 if (configuration.LookupStringValue(s, "Password")) | |
88 { | |
89 SetPassword(s); | |
90 } | |
80
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
91 |
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
92 ssl_ = configuration.GetBooleanValue("EnableSsl", false); |
0 | 93 } |
94 | |
95 lock_ = configuration.GetBooleanValue("Lock", true); // Use locking by default | |
161
2ccde9c7311b
added new optimized REST routes. this is a temporary work to try to speed up some routes (used by LRO). This way, we avoid another app to access the Orthanc DB and we skip the plugin SDK update for a very specific route
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
96 enabledOptimizedRoutes_ = configuration.GetBooleanValue("EnableOptimizedRoutes", false); |
141
0b3e9ee53c46
Added 'MaximumConnectionRetries' & 'ConnectionRetryInterval' to configure the retries when connecting to the DB at startup
Alain Mazy <alain@mazy.be>
parents:
140
diff
changeset
|
97 |
0b3e9ee53c46
Added 'MaximumConnectionRetries' & 'ConnectionRetryInterval' to configure the retries when connecting to the DB at startup
Alain Mazy <alain@mazy.be>
parents:
140
diff
changeset
|
98 maxConnectionRetries_ = configuration.GetUnsignedIntegerValue("MaximumConnectionRetries", 10); |
0b3e9ee53c46
Added 'MaximumConnectionRetries' & 'ConnectionRetryInterval' to configure the retries when connecting to the DB at startup
Alain Mazy <alain@mazy.be>
parents:
140
diff
changeset
|
99 connectionRetryInterval_ = configuration.GetUnsignedIntegerValue("ConnectionRetryInterval", 5); |
0 | 100 } |
101 | |
102 | |
103 void PostgreSQLParameters::SetConnectionUri(const std::string& uri) | |
104 { | |
105 uri_ = uri; | |
106 } | |
107 | |
108 | |
109 std::string PostgreSQLParameters::GetConnectionUri() const | |
110 { | |
111 if (uri_.empty()) | |
112 { | |
113 std::string actualUri = "postgresql://"; | |
114 | |
115 if (!username_.empty()) | |
116 { | |
117 actualUri += username_; | |
118 | |
119 if (!password_.empty()) | |
120 { | |
121 actualUri += ":" + password_; | |
122 } | |
123 | |
124 actualUri += "@" + host_; | |
125 } | |
126 else | |
127 { | |
128 actualUri += host_; | |
129 } | |
130 | |
131 if (port_ > 0) | |
132 { | |
133 actualUri += ":" + boost::lexical_cast<std::string>(port_); | |
134 } | |
135 | |
136 actualUri += "/" + database_; | |
137 | |
138 return actualUri; | |
139 } | |
140 else | |
141 { | |
142 return uri_; | |
143 } | |
144 } | |
145 | |
146 | |
147 void PostgreSQLParameters::SetHost(const std::string& host) | |
148 { | |
149 uri_.clear(); | |
150 host_ = host; | |
151 } | |
152 | |
153 void PostgreSQLParameters::SetPortNumber(unsigned int port) | |
154 { | |
155 if (port <= 0 || | |
156 port >= 65535) | |
157 { | |
158 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
159 } | |
160 | |
161 uri_.clear(); | |
162 port_ = port; | |
163 } | |
164 | |
165 void PostgreSQLParameters::SetUsername(const std::string& username) | |
166 { | |
167 uri_.clear(); | |
168 username_ = username; | |
169 } | |
170 | |
171 void PostgreSQLParameters::SetPassword(const std::string& password) | |
172 { | |
173 uri_.clear(); | |
174 password_ = password; | |
175 } | |
176 | |
177 void PostgreSQLParameters::SetDatabase(const std::string& database) | |
178 { | |
179 uri_.clear(); | |
180 database_ = database; | |
181 } | |
182 | |
183 void PostgreSQLParameters::Format(std::string& target) const | |
184 { | |
185 if (uri_.empty()) | |
186 { | |
80
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
187 // Note about SSL: "require" means that "I want my data to be |
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
188 // encrypted, and I accept the overhead. I trust that the |
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
189 // network will make sure I always connect to the server I want." |
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
190 // https://www.postgresql.org/docs/current/libpq-ssl.html |
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
191 target = std::string(ssl_ ? "sslmode=require" : "sslmode=disable") + |
0 | 192 " user=" + username_ + |
193 " host=" + host_ + | |
194 " port=" + boost::lexical_cast<std::string>(port_); | |
195 | |
10
3686ba3f9cdb
don't include password in connection string if it is empty; it's seems its not supported by some pg drivers
am@osimis.io
parents:
0
diff
changeset
|
196 if (!password_.empty()) |
3686ba3f9cdb
don't include password in connection string if it is empty; it's seems its not supported by some pg drivers
am@osimis.io
parents:
0
diff
changeset
|
197 { |
3686ba3f9cdb
don't include password in connection string if it is empty; it's seems its not supported by some pg drivers
am@osimis.io
parents:
0
diff
changeset
|
198 target += " password=" + password_; |
3686ba3f9cdb
don't include password in connection string if it is empty; it's seems its not supported by some pg drivers
am@osimis.io
parents:
0
diff
changeset
|
199 } |
3686ba3f9cdb
don't include password in connection string if it is empty; it's seems its not supported by some pg drivers
am@osimis.io
parents:
0
diff
changeset
|
200 |
0 | 201 if (database_.size() > 0) |
202 { | |
203 target += " dbname=" + database_; | |
204 } | |
205 } | |
206 else | |
207 { | |
208 target = uri_; | |
209 } | |
210 } | |
211 } |