Mercurial > hg > orthanc-databases
annotate Framework/PostgreSQL/PostgreSQLParameters.cpp @ 370:d2b5d9c92214 pg-transactions
PG: test feature: configurable transaction isolation level
author | Alain Mazy <am@osimis.io> |
---|---|
date | Wed, 22 Feb 2023 16:52:04 +0100 |
parents | 16aac0287485 |
children | 15bfd9a76f8d |
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 | |
359
16aac0287485
copyright upgraded to 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
16aac0287485
copyright upgraded to 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
0 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
9 * modify it under the terms of the GNU Affero General Public License | |
10 * as published by the Free Software Foundation, either version 3 of | |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Affero General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Affero General Public License | |
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 **/ | |
21 | |
22 | |
23 #include "PostgreSQLParameters.h" | |
24 | |
152 | 25 #include <Logging.h> |
26 #include <OrthancException.h> | |
0 | 27 |
28 #include <boost/lexical_cast.hpp> | |
29 | |
30 | |
31 namespace OrthancDatabases | |
32 { | |
33 void PostgreSQLParameters::Reset() | |
34 { | |
35 host_ = "localhost"; | |
36 port_ = 5432; | |
37 username_ = ""; | |
38 password_ = ""; | |
39 database_.clear(); | |
40 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
|
41 ssl_ = false; |
0 | 42 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
|
43 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
|
44 connectionRetryInterval_ = 5; |
370
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
45 readWriteTransactionStatement_ = "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE"; |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
46 readOnlyTransactionStatement_ = "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY"; |
0 | 47 } |
48 | |
49 | |
50 PostgreSQLParameters::PostgreSQLParameters() | |
51 { | |
52 Reset(); | |
53 } | |
54 | |
55 | |
56 PostgreSQLParameters::PostgreSQLParameters(const OrthancPlugins::OrthancConfiguration& configuration) | |
57 { | |
58 Reset(); | |
59 | |
60 std::string s; | |
61 | |
62 if (configuration.LookupStringValue(s, "ConnectionUri")) | |
63 { | |
64 SetConnectionUri(s); | |
65 } | |
66 else | |
67 { | |
68 if (configuration.LookupStringValue(s, "Host")) | |
69 { | |
70 SetHost(s); | |
71 } | |
72 | |
73 unsigned int port; | |
74 if (configuration.LookupUnsignedIntegerValue(port, "Port")) | |
75 { | |
76 SetPortNumber(port); | |
77 } | |
78 | |
79 if (configuration.LookupStringValue(s, "Database")) | |
80 { | |
81 SetDatabase(s); | |
82 } | |
83 | |
84 if (configuration.LookupStringValue(s, "Username")) | |
85 { | |
86 SetUsername(s); | |
87 } | |
88 | |
89 if (configuration.LookupStringValue(s, "Password")) | |
90 { | |
91 SetPassword(s); | |
92 } | |
80
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
93 |
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
94 ssl_ = configuration.GetBooleanValue("EnableSsl", false); |
0 | 95 } |
96 | |
97 lock_ = configuration.GetBooleanValue("Lock", true); // Use locking by default | |
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
|
98 |
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 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
|
100 connectionRetryInterval_ = configuration.GetUnsignedIntegerValue("ConnectionRetryInterval", 5); |
370
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
101 |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
102 if (configuration.LookupStringValue(s, "ReadWriteTransactionStatement")) |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
103 { |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
104 SetReadWriteTransactionStatement(s); |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
105 } |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
106 |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
107 if (configuration.LookupStringValue(s, "ReadOnlyTransactionStatement")) |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
108 { |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
109 SetReadOnlyTransactionStatement(s); |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
110 } |
d2b5d9c92214
PG: test feature: configurable transaction isolation level
Alain Mazy <am@osimis.io>
parents:
359
diff
changeset
|
111 |
0 | 112 } |
113 | |
114 | |
115 void PostgreSQLParameters::SetConnectionUri(const std::string& uri) | |
116 { | |
117 uri_ = uri; | |
118 } | |
119 | |
120 | |
121 std::string PostgreSQLParameters::GetConnectionUri() const | |
122 { | |
123 if (uri_.empty()) | |
124 { | |
125 std::string actualUri = "postgresql://"; | |
126 | |
127 if (!username_.empty()) | |
128 { | |
129 actualUri += username_; | |
130 | |
131 if (!password_.empty()) | |
132 { | |
133 actualUri += ":" + password_; | |
134 } | |
135 | |
136 actualUri += "@" + host_; | |
137 } | |
138 else | |
139 { | |
140 actualUri += host_; | |
141 } | |
142 | |
143 if (port_ > 0) | |
144 { | |
145 actualUri += ":" + boost::lexical_cast<std::string>(port_); | |
146 } | |
147 | |
148 actualUri += "/" + database_; | |
149 | |
150 return actualUri; | |
151 } | |
152 else | |
153 { | |
154 return uri_; | |
155 } | |
156 } | |
157 | |
158 | |
159 void PostgreSQLParameters::SetHost(const std::string& host) | |
160 { | |
161 uri_.clear(); | |
162 host_ = host; | |
163 } | |
164 | |
165 void PostgreSQLParameters::SetPortNumber(unsigned int port) | |
166 { | |
252 | 167 if (port == 0 || |
0 | 168 port >= 65535) |
169 { | |
170 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
171 } | |
172 | |
173 uri_.clear(); | |
174 port_ = port; | |
175 } | |
176 | |
177 void PostgreSQLParameters::SetUsername(const std::string& username) | |
178 { | |
179 uri_.clear(); | |
180 username_ = username; | |
181 } | |
182 | |
183 void PostgreSQLParameters::SetPassword(const std::string& password) | |
184 { | |
185 uri_.clear(); | |
186 password_ = password; | |
187 } | |
188 | |
189 void PostgreSQLParameters::SetDatabase(const std::string& database) | |
190 { | |
191 uri_.clear(); | |
192 database_ = database; | |
193 } | |
194 | |
195 void PostgreSQLParameters::Format(std::string& target) const | |
196 { | |
197 if (uri_.empty()) | |
198 { | |
80
16df1a6ea452
Fix issue 105 (Unable to connect to PostgreSQL database using SSL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
67
diff
changeset
|
199 // 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
|
200 // 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
|
201 // 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
|
202 // 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
|
203 target = std::string(ssl_ ? "sslmode=require" : "sslmode=disable") + |
0 | 204 " user=" + username_ + |
205 " host=" + host_ + | |
206 " port=" + boost::lexical_cast<std::string>(port_); | |
207 | |
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
|
208 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
|
209 { |
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
|
210 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
|
211 } |
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
|
212 |
0 | 213 if (database_.size() > 0) |
214 { | |
215 target += " dbname=" + database_; | |
216 } | |
217 } | |
218 else | |
219 { | |
220 target = uri_; | |
221 } | |
222 } | |
223 } |