1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
5 * Ceph - scalable distributed file system
7 * Copyright (C) 2022 Red Hat, Inc.
9 * This is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License version 2.1, as published by the Free Software
12 * Foundation. See file COPYING.
18 #include <initializer_list>
20 namespace rgw::dbstore::config::schema
{
23 // human-readable description to help with debugging migration errors
24 const char* description
= nullptr;
25 // series of sql statements to apply the schema migration
26 const char* up
= nullptr;
27 // series of sql statements to undo the schema migration
28 const char* down
= nullptr;
31 static constexpr std::initializer_list
<Migration
> migrations
{{
32 .description
= "create the initial ConfigStore tables",
34 CREATE TABLE IF NOT EXISTS Realms (
35 ID TEXT PRIMARY KEY NOT NULL,
36 Name TEXT UNIQUE NOT NULL,
38 Epoch INTEGER DEFAULT 0,
39 VersionNumber INTEGER,
42 CREATE TABLE IF NOT EXISTS Periods (
44 Epoch INTEGER DEFAULT 0,
45 RealmID TEXT NOT NULL REFERENCES Realms (ID),
47 PRIMARY KEY (ID, Epoch)
49 CREATE TABLE IF NOT EXISTS PeriodConfigs (
50 RealmID TEXT PRIMARY KEY NOT NULL REFERENCES Realms (ID),
53 CREATE TABLE IF NOT EXISTS ZoneGroups (
54 ID TEXT PRIMARY KEY NOT NULL,
55 Name TEXT UNIQUE NOT NULL,
56 RealmID TEXT NOT NULL REFERENCES Realms (ID),
58 VersionNumber INTEGER,
61 CREATE TABLE IF NOT EXISTS Zones (
62 ID TEXT PRIMARY KEY NOT NULL,
63 Name TEXT UNIQUE NOT NULL,
64 RealmID TEXT NOT NULL REFERENCES Realms (ID),
66 VersionNumber INTEGER,
69 CREATE TABLE IF NOT EXISTS DefaultRealms (
71 Empty TEXT PRIMARY KEY
73 CREATE TABLE IF NOT EXISTS DefaultZoneGroups (
75 RealmID TEXT PRIMARY KEY REFERENCES Realms (ID)
77 CREATE TABLE IF NOT EXISTS DefaultZones (
79 RealmID TEXT PRIMARY KEY REFERENCES Realms (ID)
83 DROP TABLE IF EXISTS Realms;
84 DROP TABLE IF EXISTS Periods;
85 DROP TABLE IF EXISTS PeriodConfigs;
86 DROP TABLE IF EXISTS ZoneGroups;
87 DROP TABLE IF EXISTS Zones;
88 DROP TABLE IF EXISTS DefaultRealms;
89 DROP TABLE IF EXISTS DefaultZoneGroups;
90 DROP TABLE IF EXISTS DefaultZones;
98 static constexpr const char* default_realm_insert1
=
99 "INSERT INTO DefaultRealms (ID, Empty) VALUES ({}, '')";
101 static constexpr const char* default_realm_upsert1
=
102 R
"(INSERT INTO DefaultRealms (ID, Empty) VALUES ({0}, '')
103 ON CONFLICT(Empty) DO UPDATE SET ID = {0})";
105 static constexpr const char* default_realm_select0
=
106 "SELECT ID FROM DefaultRealms LIMIT 1";
108 static constexpr const char* default_realm_delete0
=
109 "DELETE FROM DefaultRealms";
114 static constexpr const char* realm_update5
=
115 "UPDATE Realms SET CurrentPeriod = {1}, Epoch = {2}, VersionNumber = {3} + 1 \
116 WHERE ID = {0} AND VersionNumber = {3} AND VersionTag = {4}";
118 static constexpr const char* realm_rename4
=
119 "UPDATE Realms SET Name = {1}, VersionNumber = {2} + 1 \
120 WHERE ID = {0} AND VersionNumber = {2} AND VersionTag = {3}";
122 static constexpr const char* realm_delete3
=
123 "DELETE FROM Realms WHERE ID = {} AND VersionNumber = {} AND VersionTag = {}";
125 static constexpr const char* realm_insert4
=
126 "INSERT INTO Realms (ID, Name, VersionNumber, VersionTag) \
127 VALUES ({}, {}, {}, {})";
129 static constexpr const char* realm_upsert4
=
130 "INSERT INTO Realms (ID, Name, VersionNumber, VersionTag) \
131 VALUES ({0}, {1}, {2}, {3}) \
132 ON CONFLICT(ID) DO UPDATE SET Name = {1}, \
133 VersionNumber = {2}, VersionTag = {3}";
135 static constexpr const char* realm_select_id1
=
136 "SELECT * FROM Realms WHERE ID = {} LIMIT 1";
138 static constexpr const char* realm_select_name1
=
139 "SELECT * FROM Realms WHERE Name = {} LIMIT 1";
141 static constexpr const char* realm_select_default0
=
142 "SELECT r.* FROM Realms r \
143 INNER JOIN DefaultRealms d \
144 ON d.ID = r.ID LIMIT 1";
146 static constexpr const char* realm_select_names2
=
147 "SELECT Name FROM Realms WHERE Name > {} \
148 ORDER BY Name ASC LIMIT {}";
153 static constexpr const char* period_insert4
=
154 "INSERT INTO Periods (ID, Epoch, RealmID, Data) \
155 VALUES ({}, {}, {}, {})";
157 static constexpr const char* period_upsert4
=
158 "INSERT INTO Periods (ID, Epoch, RealmID, Data) \
159 VALUES ({0}, {1}, {2}, {3}) \
160 ON CONFLICT DO UPDATE SET RealmID = {2}, Data = {3}";
162 static constexpr const char* period_select_epoch2
=
163 "SELECT * FROM Periods WHERE ID = {} AND Epoch = {} LIMIT 1";
165 static constexpr const char* period_select_latest1
=
166 "SELECT * FROM Periods WHERE ID = {} ORDER BY Epoch DESC LIMIT 1";
168 static constexpr const char* period_delete1
=
169 "DELETE FROM Periods WHERE ID = {}";
171 static constexpr const char* period_select_ids2
=
172 "SELECT ID FROM Periods WHERE ID > {} ORDER BY ID ASC LIMIT {}";
177 static constexpr const char* default_zonegroup_insert2
=
178 "INSERT INTO DefaultZoneGroups (RealmID, ID) VALUES ({}, {})";
180 static constexpr const char* default_zonegroup_upsert2
=
181 "INSERT INTO DefaultZoneGroups (RealmID, ID) \
183 ON CONFLICT(RealmID) DO UPDATE SET ID = {1}";
185 static constexpr const char* default_zonegroup_select1
=
186 "SELECT ID FROM DefaultZoneGroups WHERE RealmID = {}";
188 static constexpr const char* default_zonegroup_delete1
=
189 "DELETE FROM DefaultZoneGroups WHERE RealmID = {}";
194 static constexpr const char* zonegroup_update5
=
195 "UPDATE ZoneGroups SET RealmID = {1}, Data = {2}, VersionNumber = {3} + 1 \
196 WHERE ID = {0} AND VersionNumber = {3} AND VersionTag = {4}";
198 static constexpr const char* zonegroup_rename4
=
199 "UPDATE ZoneGroups SET Name = {1}, VersionNumber = {2} + 1 \
200 WHERE ID = {0} AND VersionNumber = {2} AND VersionTag = {3}";
202 static constexpr const char* zonegroup_delete3
=
203 "DELETE FROM ZoneGroups WHERE ID = {} \
204 AND VersionNumber = {} AND VersionTag = {}";
206 static constexpr const char* zonegroup_insert6
=
207 "INSERT INTO ZoneGroups (ID, Name, RealmID, Data, VersionNumber, VersionTag) \
208 VALUES ({}, {}, {}, {}, {}, {})";
210 static constexpr const char* zonegroup_upsert6
=
211 "INSERT INTO ZoneGroups (ID, Name, RealmID, Data, VersionNumber, VersionTag) \
212 VALUES ({0}, {1}, {2}, {3}, {4}, {5}) \
213 ON CONFLICT (ID) DO UPDATE SET Name = {1}, RealmID = {2}, \
214 Data = {3}, VersionNumber = {4}, VersionTag = {5}";
216 static constexpr const char* zonegroup_select_id1
=
217 "SELECT * FROM ZoneGroups WHERE ID = {} LIMIT 1";
219 static constexpr const char* zonegroup_select_name1
=
220 "SELECT * FROM ZoneGroups WHERE Name = {} LIMIT 1";
222 static constexpr const char* zonegroup_select_default0
=
223 "SELECT z.* FROM ZoneGroups z \
224 INNER JOIN DefaultZoneGroups d \
225 ON d.ID = z.ID LIMIT 1";
227 static constexpr const char* zonegroup_select_names2
=
228 "SELECT Name FROM ZoneGroups WHERE Name > {} \
229 ORDER BY Name ASC LIMIT {}";
234 static constexpr const char* default_zone_insert2
=
235 "INSERT INTO DefaultZones (RealmID, ID) VALUES ({}, {})";
237 static constexpr const char* default_zone_upsert2
=
238 "INSERT INTO DefaultZones (RealmID, ID) VALUES ({0}, {1}) \
239 ON CONFLICT(RealmID) DO UPDATE SET ID = {1}";
241 static constexpr const char* default_zone_select1
=
242 "SELECT ID FROM DefaultZones WHERE RealmID = {}";
244 static constexpr const char* default_zone_delete1
=
245 "DELETE FROM DefaultZones WHERE RealmID = {}";
250 static constexpr const char* zone_update5
=
251 "UPDATE Zones SET RealmID = {1}, Data = {2}, VersionNumber = {3} + 1 \
252 WHERE ID = {0} AND VersionNumber = {3} AND VersionTag = {4}";
254 static constexpr const char* zone_rename4
=
255 "UPDATE Zones SET Name = {1}, VersionNumber = {2} + 1 \
256 WHERE ID = {0} AND VersionNumber = {2} AND VersionTag = {3}";
258 static constexpr const char* zone_delete3
=
259 "DELETE FROM Zones WHERE ID = {} AND VersionNumber = {} AND VersionTag = {}";
261 static constexpr const char* zone_insert6
=
262 "INSERT INTO Zones (ID, Name, RealmID, Data, VersionNumber, VersionTag) \
263 VALUES ({}, {}, {}, {}, {}, {})";
265 static constexpr const char* zone_upsert6
=
266 "INSERT INTO Zones (ID, Name, RealmID, Data, VersionNumber, VersionTag) \
267 VALUES ({0}, {1}, {2}, {3}, {4}, {5}) \
268 ON CONFLICT (ID) DO UPDATE SET Name = {1}, RealmID = {2}, \
269 Data = {3}, VersionNumber = {4}, VersionTag = {5}";
271 static constexpr const char* zone_select_id1
=
272 "SELECT * FROM Zones WHERE ID = {} LIMIT 1";
274 static constexpr const char* zone_select_name1
=
275 "SELECT * FROM Zones WHERE Name = {} LIMIT 1";
277 static constexpr const char* zone_select_default0
=
278 "SELECT z.* FROM Zones z \
279 INNER JOIN DefaultZones d \
280 ON d.ID = z.ID LIMIT 1";
282 static constexpr const char* zone_select_names2
=
283 "SELECT Name FROM Zones WHERE Name > {} \
284 ORDER BY Name ASC LIMIT {}";
289 static constexpr const char* period_config_insert2
=
290 "INSERT INTO PeriodConfigs (RealmID, Data) VALUES ({}, {})";
292 static constexpr const char* period_config_upsert2
=
293 "INSERT INTO PeriodConfigs (RealmID, Data) VALUES ({0}, {1}) \
294 ON CONFLICT (RealmID) DO UPDATE SET Data = {1}";
296 static constexpr const char* period_config_select1
=
297 "SELECT Data FROM PeriodConfigs WHERE RealmID = {} LIMIT 1";
299 } // namespace rgw::dbstore::config::schema