Mercurial > hg > orthanc-databases
annotate Framework/MySQL/MySQLParameters.cpp @ 580:35d2df9572b1 find-refactoring tip
count-resources
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Tue, 15 Oct 2024 15:52:39 +0200 |
parents | 54d518dcd74a |
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 | |
507
54d518dcd74a
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
459
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
54d518dcd74a
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
459
diff
changeset
|
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium |
459
ecd0b719cff5
update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
389
diff
changeset
|
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
0 | 8 * |
9 * This program is free software: you can redistribute it and/or | |
10 * modify it under the terms of the GNU Affero General Public License | |
11 * as published by the Free Software Foundation, either version 3 of | |
12 * the License, or (at your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, but | |
15 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Affero General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Affero General Public License | |
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 **/ | |
22 | |
23 | |
24 #include "MySQLParameters.h" | |
25 | |
61 | 26 #include "MySQLDatabase.h" |
27 | |
152 | 28 #include <Logging.h> |
29 #include <OrthancException.h> | |
0 | 30 |
31 namespace OrthancDatabases | |
32 { | |
33 void MySQLParameters::Reset() | |
34 { | |
35 host_ = "localhost"; | |
36 username_.clear(); | |
37 password_.clear(); | |
38 database_.clear(); | |
39 port_ = 3306; | |
46
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
40 |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
41 #if defined(_WIN32) |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
42 unixSocket_.clear(); |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
43 #else |
0 | 44 unixSocket_ = "/var/run/mysqld/mysqld.sock"; |
46
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
45 #endif |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
46 |
0 | 47 lock_ = true; |
48 } | |
49 | |
50 | |
186 | 51 MySQLParameters::MySQLParameters() : |
52 ssl_(false), | |
53 verifySslServerCertificates_(true), | |
54 maxConnectionRetries_(10), | |
55 connectionRetryInterval_(5) | |
0 | 56 { |
57 Reset(); | |
58 } | |
59 | |
60 | |
186 | 61 MySQLParameters::MySQLParameters(const OrthancPlugins::OrthancConfiguration& pluginConfiguration, |
62 const OrthancPlugins::OrthancConfiguration& orthancConfiguration) | |
0 | 63 { |
64 Reset(); | |
65 | |
66 std::string s; | |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
67 if (pluginConfiguration.LookupStringValue(s, "Host")) |
0 | 68 { |
69 SetHost(s); | |
70 } | |
71 | |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
72 if (pluginConfiguration.LookupStringValue(s, "Username")) |
0 | 73 { |
74 SetUsername(s); | |
75 } | |
76 | |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
77 if (pluginConfiguration.LookupStringValue(s, "Password")) |
0 | 78 { |
79 SetPassword(s); | |
80 } | |
81 | |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
82 if (pluginConfiguration.LookupStringValue(s, "Database")) |
0 | 83 { |
84 SetDatabase(s); | |
85 } | |
86 | |
87 unsigned int port; | |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
88 if (pluginConfiguration.LookupUnsignedIntegerValue(port, "Port")) |
0 | 89 { |
90 SetPort(port); | |
91 } | |
92 | |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
93 if (pluginConfiguration.LookupStringValue(s, "UnixSocket")) |
0 | 94 { |
95 SetUnixSocket(s); | |
96 } | |
97 | |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
98 lock_ = pluginConfiguration.GetBooleanValue("Lock", true); // Use locking by default |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
99 |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
100 ssl_ = pluginConfiguration.GetBooleanValue("EnableSsl", false); |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
101 verifySslServerCertificates_ = pluginConfiguration.GetBooleanValue("SslVerifyServerCertificates", true); |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
102 |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
103 const std::string defaultCaCertificates = orthancConfiguration.GetStringValue("HttpsCACertificates", ""); |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
104 sslCaCertificates_ = pluginConfiguration.GetStringValue("SslCACertificates", defaultCaCertificates); |
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
|
105 |
163
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
106 if (ssl_ && verifySslServerCertificates_ && sslCaCertificates_.empty()) |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
107 { |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
108 LOG(ERROR) << "MySQL: No SslCACertificates defined, unable to check SSL Server certificates"; |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
109 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
110 } |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
111 |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
112 maxConnectionRetries_ = pluginConfiguration.GetUnsignedIntegerValue("MaximumConnectionRetries", 10); |
4d32c9c8d6c0
Added support for TLS connections
Alain Mazy <alain@mazy.be>
parents:
152
diff
changeset
|
113 connectionRetryInterval_ = pluginConfiguration.GetUnsignedIntegerValue("ConnectionRetryInterval", 5); |
0 | 114 } |
115 | |
116 | |
117 void MySQLParameters::SetHost(const std::string& host) | |
118 { | |
119 host_ = host; | |
120 } | |
121 | |
122 | |
123 void MySQLParameters::SetUsername(const std::string& username) | |
124 { | |
125 username_ = username; | |
126 } | |
127 | |
128 | |
129 void MySQLParameters::SetPassword(const std::string& password) | |
130 { | |
131 password_ = password; | |
132 } | |
133 | |
134 | |
135 void MySQLParameters::SetDatabase(const std::string& database) | |
136 { | |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
137 if (database.empty()) |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
138 { |
46
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
139 LOG(ERROR) << "MySQL: Empty database name"; |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
140 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
141 } |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
142 |
61 | 143 if (!MySQLDatabase::IsValidDatabaseIdentifier(database)) |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
144 { |
61 | 145 LOG(ERROR) << "MySQL: Only alphanumeric characters are allowed in a " |
146 << "database name: \"" << database << "\""; | |
147 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
148 } |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
149 |
0 | 150 database_ = database; |
151 } | |
152 | |
153 | |
154 void MySQLParameters::SetPort(unsigned int port) | |
155 { | |
156 if (port >= 65535) | |
157 { | |
158 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
159 } | |
160 else | |
161 { | |
162 port_ = port; | |
163 } | |
164 } | |
165 | |
166 | |
167 void MySQLParameters::SetUnixSocket(const std::string& socket) | |
168 { | |
46
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
169 #if defined(_WIN32) |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
170 if (!socket.empty()) |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
171 { |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
172 LOG(WARNING) << "MySQL: Setting an UNIX socket on Windows has no effect"; |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
173 } |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
174 #endif |
6a574d810b98
Compatibility with MySQL 8.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
175 |
0 | 176 unixSocket_ = socket; |
177 } | |
22
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
178 |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
179 |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
180 void MySQLParameters::Format(Json::Value& target) const |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
181 { |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
182 target = Json::objectValue; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
183 target["Host"] = host_; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
184 target["Username"] = username_; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
185 target["Password"] = password_; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
186 target["Database"] = database_; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
187 target["Port"] = port_; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
188 target["UnixSocket"] = unixSocket_; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
189 target["Lock"] = lock_; |
1e9bad493475
prevent running unit tests on a non-existing db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
190 } |
0 | 191 } |