1 // Copyright (C) 2018-2021 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef MYSQL_QUERY_MACROS_DHCP_H
8 #define MYSQL_QUERY_MACROS_DHCP_H
9 
10 /// @file mysql_query_macros_dhcp.h
11 /// Collection of common macros defining MySQL prepared statements used
12 /// to manage Kea DHCP configuration in the database.
13 ///
14 /// Some of the macros are DHCPv4 specific, other are DHCPv6 specific.
15 /// Some macros are common for both DHCP server types. The first
16 /// parameter @c table_prefix should be set to @c dhcp4 or @c dhcp6,
17 /// depending which DHCP server type it relates to. Provided value
18 /// is used as a prefix for MySQL table names. For example, if the
19 /// prefix is set to @c dhcp4, the table name referred to in the
20 /// query may be dhcp4_subnet etc. The second argument in the variadic
21 /// macro is a part of the WHERE clause in the MySQL query. The fixed
22 /// part of the WHERE clause is included in the macro.
23 
24 /// @todo Update queries to also fetch server tags to associate
25 /// returned configuration elements with particular servers.
26 
27 namespace isc {
28 namespace dhcp {
29 
30 namespace {
31 
32 #ifndef MYSQL_GET_GLOBAL_PARAMETER
33 #define MYSQL_GET_GLOBAL_PARAMETER(table_prefix, ...) \
34     "SELECT" \
35     "  g.id," \
36     "  g.name," \
37     "  g.value," \
38     "  g.parameter_type," \
39     "  g.modification_ts," \
40     "  s.tag " \
41     "FROM " #table_prefix "_global_parameter AS g " \
42     "INNER JOIN " #table_prefix "_global_parameter_server AS a " \
43     "  ON g.id = a.parameter_id " \
44     "INNER JOIN " #table_prefix "_server AS s " \
45     "  ON (a.server_id = s.id) " \
46     "WHERE (s.tag = ? OR s.id = 1) " #__VA_ARGS__ \
47     " ORDER BY g.id, s.id"
48 
49 #endif
50 
51 #ifndef MYSQL_GET_SUBNET4
52 #define MYSQL_GET_SUBNET4_COMMON(server_join, ...) \
53     "SELECT" \
54     "  s.subnet_id," \
55     "  s.subnet_prefix," \
56     "  s.4o6_interface," \
57     "  s.4o6_interface_id," \
58     "  s.4o6_subnet," \
59     "  s.boot_file_name," \
60     "  s.client_class," \
61     "  s.interface," \
62     "  s.match_client_id," \
63     "  s.modification_ts," \
64     "  s.next_server," \
65     "  s.rebind_timer," \
66     "  s.relay," \
67     "  s.renew_timer," \
68     "  s.require_client_classes," \
69     "  s.reservations_global," \
70     "  s.server_hostname," \
71     "  s.shared_network_name," \
72     "  s.user_context," \
73     "  s.valid_lifetime," \
74     "  p.id," \
75     "  p.start_address," \
76     "  p.end_address," \
77     "  p.subnet_id," \
78     "  p.modification_ts," \
79     "  x.option_id," \
80     "  x.code," \
81     "  x.value," \
82     "  x.formatted_value," \
83     "  x.space," \
84     "  x.persistent," \
85     "  x.dhcp4_subnet_id," \
86     "  x.scope_id," \
87     "  x.user_context," \
88     "  x.shared_network_name," \
89     "  x.pool_id," \
90     "  x.modification_ts," \
91     "  o.option_id," \
92     "  o.code," \
93     "  o.value," \
94     "  o.formatted_value," \
95     "  o.space," \
96     "  o.persistent," \
97     "  o.dhcp4_subnet_id," \
98     "  o.scope_id," \
99     "  o.user_context," \
100     "  o.shared_network_name," \
101     "  o.pool_id," \
102     "  o.modification_ts," \
103     "  s.calculate_tee_times," \
104     "  s.t1_percent," \
105     "  s.t2_percent," \
106     "  s.authoritative," \
107     "  s.min_valid_lifetime," \
108     "  s.max_valid_lifetime," \
109     "  p.client_class," \
110     "  p.require_client_classes," \
111     "  p.user_context," \
112     "  s.ddns_send_updates," \
113     "  s.ddns_override_no_update," \
114     "  s.ddns_override_client_update," \
115     "  s.ddns_replace_client_name," \
116     "  s.ddns_generated_prefix," \
117     "  s.ddns_qualifying_suffix," \
118     "  s.reservations_in_subnet," \
119     "  s.reservations_out_of_pool," \
120     "  s.cache_threshold," \
121     "  s.cache_max_age," \
122     "  srv.tag " \
123     "FROM dhcp4_subnet AS s " \
124     server_join \
125     "LEFT JOIN dhcp4_pool AS p ON s.subnet_id = p.subnet_id " \
126     "LEFT JOIN dhcp4_options AS x ON x.scope_id = 5 AND p.id = x.pool_id " \
127     "LEFT JOIN dhcp4_options AS o ON o.scope_id = 1 AND s.subnet_id = o.dhcp4_subnet_id " \
128     #__VA_ARGS__ \
129     " ORDER BY s.subnet_id, p.id, x.option_id, o.option_id"
130 
131 #define MYSQL_GET_SUBNET4_NO_TAG(...) \
132     MYSQL_GET_SUBNET4_COMMON( \
133     "INNER JOIN dhcp4_subnet_server AS a " \
134     "  ON s.subnet_id = a.subnet_id " \
135     "INNER JOIN dhcp4_server AS srv " \
136     "  ON (a.server_id = srv.id) ", \
137     __VA_ARGS__)
138 
139 #define MYSQL_GET_SUBNET4_ANY(...) \
140     MYSQL_GET_SUBNET4_COMMON( \
141     "LEFT JOIN dhcp4_subnet_server AS a "\
142     "  ON s.subnet_id = a.subnet_id " \
143     "LEFT JOIN dhcp4_server AS srv " \
144     "  ON a.server_id = srv.id ", \
145     __VA_ARGS__)
146 
147 #define MYSQL_GET_SUBNET4_UNASSIGNED(...) \
148     MYSQL_GET_SUBNET4_COMMON( \
149     "LEFT JOIN dhcp4_subnet_server AS a "\
150     "  ON s.subnet_id = a.subnet_id " \
151     "LEFT JOIN dhcp4_server AS srv " \
152     "  ON a.server_id = srv.id ", \
153     WHERE a.subnet_id IS NULL __VA_ARGS__)
154 
155 #endif
156 
157 #ifndef MYSQL_GET_SUBNET6
158 #define MYSQL_GET_SUBNET6_COMMON(server_join, ...) \
159     "SELECT" \
160     "  s.subnet_id," \
161     "  s.subnet_prefix," \
162     "  s.client_class," \
163     "  s.interface," \
164     "  s.modification_ts," \
165     "  s.preferred_lifetime," \
166     "  s.rapid_commit," \
167     "  s.rebind_timer," \
168     "  s.relay," \
169     "  s.renew_timer," \
170     "  s.require_client_classes," \
171     "  s.reservations_global," \
172     "  s.shared_network_name," \
173     "  s.user_context," \
174     "  s.valid_lifetime," \
175     "  p.id," \
176     "  p.start_address," \
177     "  p.end_address," \
178     "  p.subnet_id," \
179     "  p.modification_ts," \
180     "  d.id," \
181     "  d.prefix," \
182     "  d.prefix_length," \
183     "  d.delegated_prefix_length," \
184     "  d.subnet_id," \
185     "  d.modification_ts," \
186     "  x.option_id," \
187     "  x.code," \
188     "  x.value," \
189     "  x.formatted_value," \
190     "  x.space," \
191     "  x.persistent," \
192     "  x.dhcp6_subnet_id," \
193     "  x.scope_id," \
194     "  x.user_context," \
195     "  x.shared_network_name," \
196     "  x.pool_id," \
197     "  x.modification_ts," \
198     "  x.pd_pool_id," \
199     "  y.option_id," \
200     "  y.code," \
201     "  y.value," \
202     "  y.formatted_value," \
203     "  y.space," \
204     "  y.persistent," \
205     "  y.dhcp6_subnet_id," \
206     "  y.scope_id," \
207     "  y.user_context," \
208     "  y.shared_network_name," \
209     "  y.pool_id," \
210     "  y.modification_ts," \
211     "  y.pd_pool_id," \
212     "  o.option_id," \
213     "  o.code," \
214     "  o.value," \
215     "  o.formatted_value," \
216     "  o.space," \
217     "  o.persistent," \
218     "  o.dhcp6_subnet_id," \
219     "  o.scope_id," \
220     "  o.user_context," \
221     "  o.shared_network_name," \
222     "  o.pool_id," \
223     "  o.modification_ts," \
224     "  o.pd_pool_id, " \
225     "  s.calculate_tee_times," \
226     "  s.t1_percent," \
227     "  s.t2_percent," \
228     "  s.interface_id," \
229     "  s.min_preferred_lifetime," \
230     "  s.max_preferred_lifetime," \
231     "  s.min_valid_lifetime," \
232     "  s.max_valid_lifetime," \
233     "  p.client_class," \
234     "  p.require_client_classes," \
235     "  p.user_context," \
236     "  d.excluded_prefix," \
237     "  d.excluded_prefix_length," \
238     "  d.client_class," \
239     "  d.require_client_classes," \
240     "  d.user_context," \
241     "  s.ddns_send_updates," \
242     "  s.ddns_override_no_update," \
243     "  s.ddns_override_client_update," \
244     "  s.ddns_replace_client_name," \
245     "  s.ddns_generated_prefix," \
246     "  s.ddns_qualifying_suffix," \
247     "  s.reservations_in_subnet," \
248     "  s.reservations_out_of_pool," \
249     "  s.cache_threshold," \
250     "  s.cache_max_age," \
251     "  srv.tag " \
252     "FROM dhcp6_subnet AS s " \
253     server_join \
254     "LEFT JOIN dhcp6_pool AS p ON s.subnet_id = p.subnet_id " \
255     "LEFT JOIN dhcp6_pd_pool AS d ON s.subnet_id = d.subnet_id " \
256     "LEFT JOIN dhcp6_options AS x ON x.scope_id = 5 AND p.id = x.pool_id " \
257     "LEFT JOIN dhcp6_options AS y ON y.scope_id = 6 AND d.id = y.pd_pool_id " \
258     "LEFT JOIN dhcp6_options AS o ON o.scope_id = 1 AND s.subnet_id = o.dhcp6_subnet_id " \
259     #__VA_ARGS__                                                        \
260     " ORDER BY s.subnet_id, p.id, d.id, x.option_id, y.option_id, o.option_id"
261 
262 #define MYSQL_GET_SUBNET6_NO_TAG(...) \
263     MYSQL_GET_SUBNET6_COMMON( \
264     "INNER JOIN dhcp6_subnet_server AS a " \
265     "  ON s.subnet_id = a.subnet_id " \
266     "INNER JOIN dhcp6_server AS srv " \
267     "  ON (a.server_id = srv.id) ", \
268     __VA_ARGS__)
269 
270 #define MYSQL_GET_SUBNET6_ANY(...) \
271     MYSQL_GET_SUBNET6_COMMON( \
272     "LEFT JOIN dhcp6_subnet_server AS a "\
273     "  ON s.subnet_id = a.subnet_id " \
274     "LEFT JOIN dhcp6_server AS srv " \
275     "  ON a.server_id = srv.id ", \
276     __VA_ARGS__)
277 
278 #define MYSQL_GET_SUBNET6_UNASSIGNED(...) \
279     MYSQL_GET_SUBNET6_COMMON( \
280     "LEFT JOIN dhcp6_subnet_server AS a "\
281     "  ON s.subnet_id = a.subnet_id " \
282     "LEFT JOIN dhcp6_server AS srv " \
283     "  ON a.server_id = srv.id ", \
284     WHERE a.subnet_id IS NULL __VA_ARGS__)
285 
286 #endif
287 
288 #ifndef MYSQL_GET_POOL4_COMMON
289 #define MYSQL_GET_POOL4_COMMON(server_join, ...) \
290       "SELECT" \
291       "  p.id," \
292       "  p.start_address," \
293       "  p.end_address," \
294       "  p.subnet_id," \
295       "  p.client_class," \
296       "  p.require_client_classes," \
297       "  p.user_context," \
298       "  p.modification_ts," \
299       "  x.option_id," \
300       "  x.code," \
301       "  x.value," \
302       "  x.formatted_value," \
303       "  x.space," \
304       "  x.persistent," \
305       "  x.dhcp4_subnet_id," \
306       "  x.scope_id," \
307       "  x.user_context," \
308       "  x.shared_network_name," \
309       "  x.pool_id," \
310       "  x.modification_ts " \
311       "FROM dhcp4_pool AS p " \
312       server_join \
313       "LEFT JOIN dhcp4_options AS x ON x.scope_id = 5 AND p.id = x.pool_id " \
314       #__VA_ARGS__ \
315       " ORDER BY p.id, x.option_id"
316 
317 #define MYSQL_GET_POOL4_RANGE_WITH_TAG(...) \
318     MYSQL_GET_POOL4_COMMON( \
319        "INNER JOIN dhcp4_subnet_server AS s ON p.subnet_id = s.subnet_id " \
320        "INNER JOIN dhcp4_server AS srv " \
321        " ON (s.server_id = srv.id) OR (s.server_id = 1) ", \
322        __VA_ARGS__)
323 
324 #define MYSQL_GET_POOL4_RANGE_NO_TAG(...) \
325     MYSQL_GET_POOL4_COMMON("", __VA_ARGS__)
326 #endif
327 
328 #ifndef MYSQL_GET_POOL6_COMMON
329 #define MYSQL_GET_POOL6_COMMON(server_join, ...) \
330     "SELECT" \
331     "  p.id," \
332     "  p.start_address," \
333     "  p.end_address," \
334     "  p.subnet_id," \
335     "  p.client_class," \
336     "  p.require_client_classes," \
337     "  p.user_context," \
338     "  p.modification_ts," \
339     "  x.option_id," \
340     "  x.code," \
341     "  x.value," \
342     "  x.formatted_value," \
343     "  x.space," \
344     "  x.persistent," \
345     "  x.dhcp6_subnet_id," \
346     "  x.scope_id," \
347     "  x.user_context," \
348     "  x.shared_network_name," \
349     "  x.pool_id," \
350     "  x.modification_ts," \
351     "  x.pd_pool_id " \
352     "FROM dhcp6_pool AS p " \
353     server_join \
354     "LEFT JOIN dhcp6_options AS x ON x.scope_id = 5 AND p.id = x.pool_id " \
355     #__VA_ARGS__ \
356     " ORDER BY p.id, x.option_id"
357 
358 #define MYSQL_GET_POOL6_RANGE_WITH_TAG(...) \
359     MYSQL_GET_POOL6_COMMON( \
360     "INNER JOIN dhcp6_subnet_server AS s ON p.subnet_id = s.subnet_id " \
361     "INNER JOIN dhcp6_server AS srv " \
362     " ON (s.server_id = srv.id) OR (s.server_id = 1) ", \
363     __VA_ARGS__)
364 
365 #define MYSQL_GET_POOL6_RANGE_NO_TAG(...) \
366     MYSQL_GET_POOL6_COMMON("", __VA_ARGS__)
367 #endif
368 
369 #ifndef MYSQL_GET_PD_POOL_COMMON
370 #define MYSQL_GET_PD_POOL_COMMON(server_join, ...) \
371     "SELECT" \
372     "  p.id," \
373     "  p.prefix," \
374     "  p.prefix_length," \
375     "  p.delegated_prefix_length," \
376     "  p.subnet_id," \
377     "  p.excluded_prefix," \
378     "  p.excluded_prefix_length," \
379     "  p.client_class," \
380     "  p.require_client_classes," \
381     "  p.user_context," \
382     "  p.modification_ts," \
383     "  x.option_id," \
384     "  x.code," \
385     "  x.value," \
386     "  x.formatted_value," \
387     "  x.space," \
388     "  x.persistent," \
389     "  x.dhcp6_subnet_id," \
390     "  x.scope_id," \
391     "  x.user_context," \
392     "  x.shared_network_name," \
393     "  x.pool_id," \
394     "  x.modification_ts," \
395     "  x.pd_pool_id " \
396     "FROM dhcp6_pd_pool AS p " \
397     server_join \
398     "LEFT JOIN dhcp6_options AS x ON x.scope_id = 6 AND p.id = x.pd_pool_id " \
399     #__VA_ARGS__ \
400     " ORDER BY p.id, x.option_id" \
401 
402 #define MYSQL_GET_PD_POOL_WITH_TAG(...) \
403     MYSQL_GET_PD_POOL_COMMON( \
404     "INNER JOIN dhcp6_subnet_server AS s ON p.subnet_id = s.subnet_id " \
405     "INNER JOIN dhcp6_server AS srv " \
406     " ON (s.server_id = srv.id) OR (s.server_id = 1) ", \
407     __VA_ARGS__)
408 
409 #define MYSQL_GET_PD_POOL_NO_TAG(...) \
410     MYSQL_GET_PD_POOL_COMMON("", __VA_ARGS__)
411 #endif
412 
413 #ifndef MYSQL_GET_SHARED_NETWORK4
414 #define MYSQL_GET_SHARED_NETWORK4_COMMON(server_join, ...) \
415     "SELECT" \
416     "  n.id," \
417     "  n.name," \
418     "  n.client_class," \
419     "  n.interface," \
420     "  n.match_client_id," \
421     "  n.modification_ts," \
422     "  n.rebind_timer," \
423     "  n.relay," \
424     "  n.renew_timer," \
425     "  n.require_client_classes," \
426     "  n.reservations_global," \
427     "  n.user_context," \
428     "  n.valid_lifetime," \
429     "  o.option_id," \
430     "  o.code," \
431     "  o.value," \
432     "  o.formatted_value," \
433     "  o.space," \
434     "  o.persistent," \
435     "  o.dhcp4_subnet_id," \
436     "  o.scope_id," \
437     "  o.user_context," \
438     "  o.shared_network_name," \
439     "  o.pool_id," \
440     "  o.modification_ts," \
441     "  n.calculate_tee_times," \
442     "  n.t1_percent," \
443     "  n.t2_percent," \
444     "  n.authoritative," \
445     "  n.boot_file_name," \
446     "  n.next_server," \
447     "  n.server_hostname," \
448     "  n.min_valid_lifetime," \
449     "  n.max_valid_lifetime," \
450     "  n.ddns_send_updates," \
451     "  n.ddns_override_no_update," \
452     "  n.ddns_override_client_update," \
453     "  n.ddns_replace_client_name," \
454     "  n.ddns_generated_prefix," \
455     "  n.ddns_qualifying_suffix," \
456     "  n.reservations_in_subnet," \
457     "  n.reservations_out_of_pool," \
458     "  n.cache_threshold," \
459     "  n.cache_max_age," \
460     "  s.tag " \
461     "FROM dhcp4_shared_network AS n " \
462     server_join \
463     "LEFT JOIN dhcp4_options AS o ON o.scope_id = 4 AND n.name = o.shared_network_name " \
464     #__VA_ARGS__ \
465     " ORDER BY n.id, s.id, o.option_id"
466 
467 #define MYSQL_GET_SHARED_NETWORK4_NO_TAG(...) \
468     MYSQL_GET_SHARED_NETWORK4_COMMON( \
469     "INNER JOIN dhcp4_shared_network_server AS a " \
470     "  ON n.id = a.shared_network_id " \
471     "INNER JOIN dhcp4_server AS s " \
472     "  ON (a.server_id = s.id) ", \
473     __VA_ARGS__)
474 
475 #define MYSQL_GET_SHARED_NETWORK4_ANY(...) \
476     MYSQL_GET_SHARED_NETWORK4_COMMON( \
477     "LEFT JOIN dhcp4_shared_network_server AS a " \
478     "  ON n.id = a.shared_network_id " \
479     "LEFT JOIN dhcp4_server AS s " \
480     "  ON a.server_id = s.id ", \
481     __VA_ARGS__)
482 
483 #define MYSQL_GET_SHARED_NETWORK4_UNASSIGNED(...) \
484     MYSQL_GET_SHARED_NETWORK4_COMMON( \
485     "LEFT JOIN dhcp4_shared_network_server AS a " \
486     "  ON n.id = a.shared_network_id " \
487     "LEFT JOIN dhcp4_server AS s " \
488     "  ON a.server_id = s.id ", \
489     WHERE a.shared_network_id IS NULL __VA_ARGS__)
490 
491 #endif
492 
493 #ifndef MYSQL_GET_SHARED_NETWORK6
494 #define MYSQL_GET_SHARED_NETWORK6_COMMON(server_join, ...) \
495     "SELECT" \
496     "  n.id," \
497     "  n.name," \
498     "  n.client_class," \
499     "  n.interface," \
500     "  n.modification_ts," \
501     "  n.preferred_lifetime," \
502     "  n.rapid_commit," \
503     "  n.rebind_timer," \
504     "  n.relay," \
505     "  n.renew_timer," \
506     "  n.require_client_classes," \
507     "  n.reservations_global," \
508     "  n.user_context," \
509     "  n.valid_lifetime," \
510     "  o.option_id," \
511     "  o.code," \
512     "  o.value," \
513     "  o.formatted_value," \
514     "  o.space," \
515     "  o.persistent," \
516     "  o.dhcp6_subnet_id," \
517     "  o.scope_id," \
518     "  o.user_context," \
519     "  o.shared_network_name," \
520     "  o.pool_id," \
521     "  o.modification_ts," \
522     "  o.pd_pool_id, " \
523     "  n.calculate_tee_times," \
524     "  n.t1_percent," \
525     "  n.t2_percent," \
526     "  n.interface_id," \
527     "  n.min_preferred_lifetime," \
528     "  n.max_preferred_lifetime," \
529     "  n.min_valid_lifetime," \
530     "  n.max_valid_lifetime," \
531     "  n.ddns_send_updates," \
532     "  n.ddns_override_no_update," \
533     "  n.ddns_override_client_update," \
534     "  n.ddns_replace_client_name," \
535     "  n.ddns_generated_prefix," \
536     "  n.ddns_qualifying_suffix," \
537     "  n.reservations_in_subnet," \
538     "  n.reservations_out_of_pool," \
539     "  n.cache_threshold," \
540     "  n.cache_max_age," \
541     "  s.tag " \
542     "FROM dhcp6_shared_network AS n " \
543     server_join \
544     "LEFT JOIN dhcp6_options AS o ON o.scope_id = 4 AND n.name = o.shared_network_name " \
545     #__VA_ARGS__ \
546     " ORDER BY n.id, s.id, o.option_id"
547 
548 #define MYSQL_GET_SHARED_NETWORK6_NO_TAG(...) \
549     MYSQL_GET_SHARED_NETWORK6_COMMON( \
550     "INNER JOIN dhcp6_shared_network_server AS a " \
551     "  ON n.id = a.shared_network_id " \
552     "INNER JOIN dhcp6_server AS s " \
553     "  ON (a.server_id = s.id) ", \
554     __VA_ARGS__)
555 
556 #define MYSQL_GET_SHARED_NETWORK6_ANY(...) \
557     MYSQL_GET_SHARED_NETWORK6_COMMON( \
558     "LEFT JOIN dhcp6_shared_network_server AS a " \
559     "  ON n.id = a.shared_network_id " \
560     "LEFT JOIN dhcp6_server AS s " \
561     "  ON a.server_id = s.id ", \
562     __VA_ARGS__)
563 
564 #define MYSQL_GET_SHARED_NETWORK6_UNASSIGNED(...) \
565     MYSQL_GET_SHARED_NETWORK6_COMMON( \
566     "LEFT JOIN dhcp6_shared_network_server AS a " \
567     "  ON n.id = a.shared_network_id " \
568     "LEFT JOIN dhcp6_server AS s " \
569     "  ON a.server_id = s.id ", \
570     WHERE a.shared_network_id IS NULL __VA_ARGS__)
571 
572 #endif
573 
574 #ifndef MYSQL_GET_OPTION_DEF
575 #define MYSQL_GET_OPTION_DEF(table_prefix, ...) \
576     "SELECT" \
577     "  d.id," \
578     "  d.code," \
579     "  d.name," \
580     "  d.space," \
581     "  d.type," \
582     "  d.modification_ts," \
583     "  d.is_array," \
584     "  d.encapsulate," \
585     "  d.record_types," \
586     "  d.user_context," \
587     "  s.tag " \
588     "FROM " #table_prefix "_option_def AS d " \
589     "INNER JOIN " #table_prefix "_option_def_server AS a" \
590     "  ON d.id = a.option_def_id " \
591     "INNER JOIN " #table_prefix "_server AS s " \
592     "  ON a.server_id = s.id " \
593     "WHERE (s.tag = ? OR s.id = 1) " #__VA_ARGS__ \
594     " ORDER BY d.id"
595 #endif
596 
597 #ifndef MYSQL_GET_OPTION_COMMON
598 #define MYSQL_GET_OPTION_COMMON(table_prefix, pd_pool_id, ...) \
599     "SELECT" \
600     "  o.option_id," \
601     "  o.code," \
602     "  o.value," \
603     "  o.formatted_value," \
604     "  o.space," \
605     "  o.persistent," \
606     "  o." #table_prefix "_subnet_id," \
607     "  o.scope_id," \
608     "  o.user_context," \
609     "  o.shared_network_name," \
610     "  o.pool_id," \
611     "  o.modification_ts," \
612     "  s.tag " \
613     pd_pool_id \
614     "FROM " #table_prefix "_options AS o " \
615     "INNER JOIN " #table_prefix "_options_server AS a" \
616     "  ON o.option_id = a.option_id " \
617     "INNER JOIN " #table_prefix "_server AS s" \
618     "  ON a.server_id = s.id " \
619     "WHERE (s.tag = ? OR s.id = 1) " #__VA_ARGS__ \
620     " ORDER BY o.option_id, s.id"
621 
622 #define MYSQL_GET_OPTION4(...) \
623     MYSQL_GET_OPTION_COMMON(dhcp4, "", __VA_ARGS__)
624 #define MYSQL_GET_OPTION6(...) \
625     MYSQL_GET_OPTION_COMMON(dhcp6, ", o.pd_pool_id ", __VA_ARGS__)
626 #endif
627 
628 #ifndef MYSQL_GET_AUDIT_ENTRIES_TIME
629 #define MYSQL_GET_AUDIT_ENTRIES_TIME(table_prefix) \
630     "SELECT" \
631     "  a.id," \
632     "  a.object_type," \
633     "  a.object_id," \
634     "  a.modification_type," \
635     "  r.modification_ts," \
636     "  r.id, " \
637     "  r.log_message " \
638     "FROM " #table_prefix "_audit AS a " \
639     "INNER JOIN " #table_prefix "_audit_revision AS r " \
640     "  ON a.revision_id = r.id " \
641     "INNER JOIN " #table_prefix "_server AS s" \
642     "  ON r.server_id = s.id " \
643     "WHERE (s.tag = ? OR s.id = 1) AND ((r.modification_ts, r.id)  > (?, ?))" \
644     " ORDER BY r.modification_ts, r.id"
645 #endif
646 
647 #ifndef MYSQL_GET_SERVERS_COMMON
648 #define MYSQL_GET_SERVERS_COMMON(table_prefix, ...) \
649     "SELECT" \
650     "  s.id," \
651     "  s.tag," \
652     "  s.description," \
653     "  s.modification_ts " \
654     "FROM " #table_prefix "_server AS s " \
655     "WHERE s.id > 1 " \
656     __VA_ARGS__ \
657     "ORDER BY s.id"
658 #define MYSQL_GET_ALL_SERVERS(table_prefix) \
659     MYSQL_GET_SERVERS_COMMON(table_prefix, "")
660 #define MYSQL_GET_SERVER(table_prefix) \
661     MYSQL_GET_SERVERS_COMMON(table_prefix, "AND s.tag = ? ")
662 #endif
663 
664 #ifndef MYSQL_GET_CLIENT_CLASS4_COMMON
665 #define MYSQL_GET_CLIENT_CLASS4_COMMON(server_join, ...) \
666     "SELECT " \
667     "  c.id," \
668     "  c.name," \
669     "  c.test," \
670     "  c.next_server," \
671     "  c.server_hostname," \
672     "  c.boot_file_name," \
673     "  c.only_if_required," \
674     "  c.valid_lifetime," \
675     "  c.min_valid_lifetime," \
676     "  c.max_valid_lifetime," \
677     "  c.depend_on_known_directly," \
678     "  o.depend_on_known_indirectly, " \
679     "  c.modification_ts," \
680     "  d.id," \
681     "  d.code," \
682     "  d.name," \
683     "  d.space," \
684     "  d.type," \
685     "  d.modification_ts," \
686     "  d.is_array," \
687     "  d.encapsulate," \
688     "  d.record_types," \
689     "  d.user_context," \
690     "  x.option_id," \
691     "  x.code," \
692     "  x.value," \
693     "  x.formatted_value," \
694     "  x.space," \
695     "  x.persistent," \
696     "  x.dhcp4_subnet_id," \
697     "  x.scope_id," \
698     "  x.user_context," \
699     "  x.shared_network_name," \
700     "  x.pool_id," \
701     "  x.modification_ts," \
702     "  s.tag " \
703     "FROM dhcp4_client_class AS c " \
704     "INNER JOIN dhcp4_client_class_order AS o " \
705     "  ON c.id = o.class_id " \
706     server_join \
707     "LEFT JOIN dhcp4_option_def AS d ON c.id = d.class_id " \
708     "LEFT JOIN dhcp4_options AS x ON x.scope_id = 2 AND c.name = x.dhcp_client_class " \
709     #__VA_ARGS__ \
710     "  ORDER BY o.order_index, d.id, x.option_id"
711 
712 #define MYSQL_GET_CLIENT_CLASS4_WITH_TAG(...) \
713     MYSQL_GET_CLIENT_CLASS4_COMMON( \
714     "INNER JOIN dhcp4_client_class_server AS a " \
715     "  ON c.id = a.class_id " \
716     "INNER JOIN dhcp4_server AS s " \
717     "  ON a.server_id = s.id ", \
718     __VA_ARGS__)
719 
720 #define MYSQL_GET_CLIENT_CLASS4_UNASSIGNED(...) \
721     MYSQL_GET_CLIENT_CLASS4_COMMON( \
722     "LEFT JOIN dhcp4_client_class_server AS a " \
723     "  ON c.id = a.class_id " \
724     "LEFT JOIN dhcp4_server AS s " \
725     "  ON a.server_id = s.id ", \
726     WHERE a.class_id IS NULL __VA_ARGS__)
727 
728 #endif
729 
730 #ifndef MYSQL_GET_CLIENT_CLASS6_COMMON
731 #define MYSQL_GET_CLIENT_CLASS6_COMMON(server_join, ...) \
732     "SELECT " \
733     "  c.id," \
734     "  c.name," \
735     "  c.test," \
736     "  c.only_if_required," \
737     "  c.valid_lifetime," \
738     "  c.min_valid_lifetime," \
739     "  c.max_valid_lifetime," \
740     "  c.depend_on_known_directly," \
741     "  o.depend_on_known_indirectly, " \
742     "  c.modification_ts," \
743     "  d.id," \
744     "  d.code," \
745     "  d.name," \
746     "  d.space," \
747     "  d.type," \
748     "  d.modification_ts," \
749     "  d.is_array," \
750     "  d.encapsulate," \
751     "  d.record_types," \
752     "  d.user_context," \
753     "  x.option_id," \
754     "  x.code," \
755     "  x.value," \
756     "  x.formatted_value," \
757     "  x.space," \
758     "  x.persistent," \
759     "  x.dhcp6_subnet_id," \
760     "  x.scope_id," \
761     "  x.user_context," \
762     "  x.shared_network_name," \
763     "  x.pool_id," \
764     "  x.modification_ts," \
765     "  s.tag, " \
766     "  c.preferred_lifetime," \
767     "  c.min_preferred_lifetime, " \
768     "  c.max_preferred_lifetime " \
769     "FROM dhcp6_client_class AS c " \
770     "INNER JOIN dhcp6_client_class_order AS o " \
771     "  ON c.id = o.class_id " \
772     server_join \
773     "LEFT JOIN dhcp6_option_def AS d ON c.id = d.class_id " \
774     "LEFT JOIN dhcp6_options AS x ON x.scope_id = 2 AND c.name = x.dhcp_client_class " \
775     #__VA_ARGS__ \
776     "  ORDER BY o.order_index, d.id, x.option_id"
777 
778 #define MYSQL_GET_CLIENT_CLASS6_WITH_TAG(...) \
779     MYSQL_GET_CLIENT_CLASS6_COMMON( \
780     "INNER JOIN dhcp6_client_class_server AS a " \
781     "  ON c.id = a.class_id " \
782     "INNER JOIN dhcp6_server AS s " \
783     "  ON a.server_id = s.id ", \
784     __VA_ARGS__)
785 
786 #define MYSQL_GET_CLIENT_CLASS6_UNASSIGNED(...) \
787     MYSQL_GET_CLIENT_CLASS6_COMMON( \
788     "LEFT JOIN dhcp6_client_class_server AS a " \
789     "  ON c.id = a.class_id " \
790     "LEFT JOIN dhcp6_server AS s " \
791     "  ON a.server_id = s.id ", \
792     WHERE a.class_id IS NULL __VA_ARGS__)
793 
794 #endif
795 
796 #ifndef MYSQL_INSERT_GLOBAL_PARAMETER
797 #define MYSQL_INSERT_GLOBAL_PARAMETER(table_prefix) \
798     "INSERT INTO " #table_prefix "_global_parameter(" \
799     "  name," \
800     "  value," \
801     "  parameter_type," \
802     "  modification_ts" \
803     ") VALUES (?, ?, ?, ?)"
804 #endif
805 
806 #ifndef MYSQL_INSERT_GLOBAL_PARAMETER_SERVER
807 #define MYSQL_INSERT_GLOBAL_PARAMETER_SERVER(table_prefix) \
808     "INSERT INTO " #table_prefix "_global_parameter_server(" \
809     "  parameter_id," \
810     "  modification_ts," \
811     "  server_id" \
812     ") VALUES (?, ?, (SELECT id FROM " #table_prefix "_server WHERE tag = ?))"
813 #endif
814 
815 #ifndef MYSQL_INSERT_SUBNET_SERVER
816 #define MYSQL_INSERT_SUBNET_SERVER(table_prefix) \
817     "INSERT INTO " #table_prefix "_subnet_server(" \
818     "  subnet_id," \
819     "  modification_ts," \
820     "  server_id" \
821     ") VALUES (?, ?, (SELECT id FROM " #table_prefix "_server WHERE tag = ?))"
822 #endif
823 
824 #ifndef MYSQL_INSERT_POOL
825 #define MYSQL_INSERT_POOL(table_prefix) \
826     "INSERT INTO " #table_prefix "_pool(" \
827     "  start_address," \
828     "  end_address," \
829     "  subnet_id," \
830     "  client_class," \
831     "  require_client_classes," \
832     "  user_context," \
833     "  modification_ts" \
834     ") VALUES (?, ?, ?, ?, ?, ?, ?)"
835 #endif
836 
837 #ifndef MYSQL_INSERT_PD_POOL
838 #define MYSQL_INSERT_PD_POOL() \
839     "INSERT INTO dhcp6_pd_pool(" \
840     "  prefix," \
841     "  prefix_length," \
842     "  delegated_prefix_length," \
843     "  subnet_id," \
844     "  excluded_prefix," \
845     "  excluded_prefix_length," \
846     "  client_class," \
847     "  require_client_classes," \
848     "  user_context," \
849     "  modification_ts" \
850     ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
851 #endif
852 
853 #ifndef MYSQL_INSERT_SHARED_NETWORK_SERVER
854 #define MYSQL_INSERT_SHARED_NETWORK_SERVER(table_prefix) \
855     "INSERT INTO " #table_prefix "_shared_network_server(" \
856     "  shared_network_id," \
857     "  modification_ts," \
858     "  server_id" \
859     ") VALUES (" \
860     "    (SELECT id FROM " #table_prefix "_shared_network WHERE name = ?), ?," \
861     "    (SELECT id FROM " #table_prefix "_server WHERE tag = ?)" \
862     ")"
863 #endif
864 
865 #ifndef MYSQL_INSERT_OPTION_DEF
866 #define MYSQL_INSERT_OPTION_DEF(table_prefix) \
867     "INSERT INTO " #table_prefix "_option_def (" \
868     "  code," \
869     "  name," \
870     "  space," \
871     "  type," \
872     "  modification_ts," \
873     "  is_array," \
874     "  encapsulate," \
875     "  record_types," \
876     "  user_context," \
877     "  class_id" \
878     ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
879 #endif
880 
881 #ifndef MYSQL_INSERT_OPTION_DEF_CLIENT_CLASS
882 #define MYSQL_INSERT_OPTION_DEF_CLIENT_CLASS(table_prefix) \
883     "INSERT INTO " #table_prefix "_option_def (" \
884     "  code," \
885     "  name," \
886     "  space," \
887     "  type," \
888     "  modification_ts," \
889     "  is_array," \
890     "  encapsulate," \
891     "  record_types," \
892     "  user_context," \
893     "  class_id" \
894     ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, (SELECT id FROM " #table_prefix "_client_class WHERE name = ?))"
895 #endif
896 
897 #ifndef MYSQL_INSERT_OPTION_DEF_SERVER
898 #define MYSQL_INSERT_OPTION_DEF_SERVER(table_prefix) \
899     "INSERT INTO " #table_prefix "_option_def_server(" \
900     "  option_def_id," \
901     "  modification_ts," \
902     "  server_id" \
903     ") VALUES (?, ?, (SELECT id FROM " #table_prefix "_server WHERE tag = ?))"
904 #endif
905 
906 #ifndef MYSQL_INSERT_OPTION_COMMON
907 #define MYSQL_INSERT_OPTION_COMMON(table_prefix, pd_pool_id, last) \
908     "INSERT INTO " #table_prefix "_options (" \
909     "  code," \
910     "  value," \
911     "  formatted_value," \
912     "  space," \
913     "  persistent," \
914     "  dhcp_client_class," \
915     " " #table_prefix "_subnet_id," \
916     "  scope_id," \
917     "  user_context," \
918     "  shared_network_name," \
919     "  pool_id," \
920     "  modification_ts" \
921     pd_pool_id \
922     ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?" last ")"
923 
924 #define MYSQL_INSERT_OPTION4() \
925     MYSQL_INSERT_OPTION_COMMON(dhcp4, "", "")
926 #define MYSQL_INSERT_OPTION6() \
927     MYSQL_INSERT_OPTION_COMMON(dhcp6, ", pd_pool_id ", ", ?")
928 #endif
929 
930 #ifndef MYSQL_INSERT_OPTION_SERVER
931 #define MYSQL_INSERT_OPTION_SERVER(table_prefix) \
932     "INSERT INTO " #table_prefix "_options_server (" \
933     "  option_id," \
934     "  modification_ts," \
935     "  server_id" \
936     ") VALUES (?, ?, (SELECT id FROM " #table_prefix "_server WHERE tag = ?))"
937 #endif
938 
939 #ifndef MYSQL_INSERT_CLIENT_CLASS_SERVER
940 #define MYSQL_INSERT_CLIENT_CLASS_SERVER(table_prefix) \
941     "INSERT INTO " #table_prefix "_client_class_server (" \
942     "  class_id," \
943     "  modification_ts," \
944     "  server_id" \
945     ") VALUES ((SELECT id FROM " #table_prefix "_client_class WHERE name = ?), ?, (SELECT id FROM " #table_prefix "_server WHERE tag = ?))"
946 #endif
947 
948 #ifndef MYSQL_INSERT_CLIENT_CLASS_DEPENDENCY
949 #define MYSQL_INSERT_CLIENT_CLASS_DEPENDENCY(table_prefix) \
950     "INSERT INTO " #table_prefix "_client_class_dependency (" \
951     "  class_id," \
952     "  dependency_id" \
953     ") VALUES ((SELECT id FROM " #table_prefix "_client_class WHERE name = ?), (SELECT id FROM " #table_prefix "_client_class WHERE name = ?))"
954 #endif
955 
956 #ifndef MYSQL_INSERT_SERVER
957 #define MYSQL_INSERT_SERVER(table_prefix) \
958     "INSERT INTO " #table_prefix "_server (" \
959     "  tag," \
960     "  description," \
961     "  modification_ts" \
962     ") VALUES (?, ?, ?)"
963 #endif
964 
965 #ifndef MYSQL_UPDATE_GLOBAL_PARAMETER
966 #define MYSQL_UPDATE_GLOBAL_PARAMETER(table_prefix) \
967     "UPDATE " #table_prefix "_global_parameter AS g " \
968     "INNER JOIN " #table_prefix "_global_parameter_server AS a" \
969     "  ON g.id = a.parameter_id " \
970     "INNER JOIN " #table_prefix "_server AS s" \
971     "  ON a.server_id = s.id " \
972     "SET" \
973     "  g.name = ?," \
974     "  g.value = ?," \
975     "  g.parameter_type = ?," \
976     "  g.modification_ts = ? " \
977     "WHERE s.tag = ? AND g.name = ?"
978 #endif
979 
980 #ifndef MYSQL_UPDATE_OPTION_DEF
981 #define MYSQL_UPDATE_OPTION_DEF(table_prefix) \
982     "UPDATE " #table_prefix "_option_def AS d " \
983     "INNER JOIN " #table_prefix "_option_def_server AS a" \
984     "  ON d.id = a.option_def_id " \
985     "INNER JOIN " #table_prefix "_server AS s" \
986     "  ON a.server_id = s.id " \
987     "SET" \
988     "  d.code = ?," \
989     "  d.name = ?," \
990     "  d.space = ?," \
991     "  d.type = ?," \
992     "  d.modification_ts = ?," \
993     "  d.is_array = ?," \
994     "  d.encapsulate = ?," \
995     "  d.record_types = ?," \
996     "  d.user_context = ?, " \
997     "  d.class_id = ? " \
998     "WHERE s.tag = ? AND d.code = ? AND d.space = ?"
999 #endif
1000 
1001 #ifndef MYSQL_UPDATE_OPTION_DEF_CLIENT_CLASS
1002 #define MYSQL_UPDATE_OPTION_DEF_CLIENT_CLASS(table_prefix) \
1003     "UPDATE " #table_prefix "_option_def AS d " \
1004     "INNER JOIN " #table_prefix "_option_def_server AS a" \
1005     "  ON d.id = a.option_def_id " \
1006     "INNER JOIN " #table_prefix "_server AS s" \
1007     "  ON a.server_id = s.id " \
1008     "SET" \
1009     "  d.code = ?," \
1010     "  d.name = ?," \
1011     "  d.space = ?," \
1012     "  d.type = ?," \
1013     "  d.modification_ts = ?," \
1014     "  d.is_array = ?," \
1015     "  d.encapsulate = ?," \
1016     "  d.record_types = ?," \
1017     "  d.user_context = ? " \
1018     "WHERE d.class_id = (SELECT id FROM dhcp4_client_class WHERE name = ?) " \
1019     "  AND s.tag = ? AND d.code = ? AND d.space = ?"
1020 #endif
1021 
1022 #ifndef MYSQL_UPDATE_OPTION_COMMON
1023 #define MYSQL_UPDATE_OPTION_COMMON(table_prefix, server_join, pd_pool_id, ...) \
1024     "UPDATE " #table_prefix "_options AS o " \
1025     server_join \
1026     "SET" \
1027     "  o.code = ?," \
1028     "  o.value = ?," \
1029     "  o.formatted_value = ?," \
1030     "  o.space = ?," \
1031     "  o.persistent = ?," \
1032     "  o.dhcp_client_class = ?," \
1033     "  o." #table_prefix "_subnet_id = ?," \
1034     "  o.scope_id = ?," \
1035     "  o.user_context = ?," \
1036     "  o.shared_network_name = ?," \
1037     "  o.pool_id = ?," \
1038     "  o.modification_ts = ? " \
1039     pd_pool_id \
1040     "WHERE " #__VA_ARGS__
1041 
1042 #define MYSQL_UPDATE_OPTION4_WITH_TAG(...) \
1043     MYSQL_UPDATE_OPTION_COMMON(dhcp4, \
1044     "INNER JOIN dhcp4_options_server AS a" \
1045     "  ON o.option_id = a.option_id " \
1046     "INNER JOIN dhcp4_server AS s" \
1047     "  ON a.server_id = s.id ", \
1048     "", s.tag = ? __VA_ARGS__)
1049 
1050 #define MYSQL_UPDATE_OPTION4_NO_TAG(...) \
1051     MYSQL_UPDATE_OPTION_COMMON(dhcp4, "", "", __VA_ARGS__)
1052 
1053 #define MYSQL_UPDATE_OPTION6_WITH_TAG(...) \
1054     MYSQL_UPDATE_OPTION_COMMON(dhcp6, \
1055     "INNER JOIN dhcp6_options_server AS a" \
1056     "  ON o.option_id = a.option_id " \
1057     "INNER JOIN dhcp6_server AS s" \
1058     "  ON a.server_id = s.id ", \
1059     ", o.pd_pool_id = ? ", s.tag = ? __VA_ARGS__)
1060 
1061 #define MYSQL_UPDATE_OPTION6_NO_TAG(...) \
1062     MYSQL_UPDATE_OPTION_COMMON(dhcp6, "", ", o.pd_pool_id = ? ", __VA_ARGS__)
1063 #endif
1064 
1065 #ifndef MYSQL_UPDATE_CLIENT_CLASS4
1066 #define MYSQL_UPDATE_CLIENT_CLASS4(follow_class_name_set) \
1067     "UPDATE dhcp4_client_class SET" \
1068     "  name = ?," \
1069     "  test = ?," \
1070     "  next_server = ?," \
1071     "  server_hostname = ?," \
1072     "  boot_file_name = ?," \
1073     "  only_if_required = ?," \
1074     "  valid_lifetime = ?," \
1075     "  min_valid_lifetime = ?," \
1076     "  max_valid_lifetime = ?," \
1077     "  depend_on_known_directly = ?," \
1078     follow_class_name_set \
1079     "  modification_ts = ? " \
1080     "WHERE name = ?"
1081 #endif
1082 
1083 #ifndef MYSQL_UPDATE_CLIENT_CLASS6
1084 #define MYSQL_UPDATE_CLIENT_CLASS6(follow_class_name_set) \
1085     "UPDATE dhcp6_client_class SET" \
1086     "  name = ?," \
1087     "  test = ?," \
1088     "  only_if_required = ?," \
1089     "  valid_lifetime = ?," \
1090     "  min_valid_lifetime = ?," \
1091     "  max_valid_lifetime = ?," \
1092     "  depend_on_known_directly = ?," \
1093     follow_class_name_set \
1094     "  modification_ts = ?, " \
1095     "  preferred_lifetime = ?, " \
1096     "  min_preferred_lifetime = ?, " \
1097     "  max_preferred_lifetime = ? " \
1098     "WHERE name = ?"
1099 #endif
1100 
1101 #ifndef MYSQL_UPDATE_SERVER
1102 #define MYSQL_UPDATE_SERVER(table_prefix) \
1103     "UPDATE " #table_prefix "_server " \
1104     "SET" \
1105     "  tag = ?," \
1106     "  description = ?," \
1107     "  modification_ts = ? " \
1108     "WHERE tag = ?"
1109 #endif
1110 
1111 #ifndef MYSQL_DELETE_GLOBAL_PARAMETER
1112 #define MYSQL_DELETE_GLOBAL_PARAMETER(table_prefix, ...) \
1113     "DELETE g FROM " #table_prefix "_global_parameter AS g " \
1114     "INNER JOIN " #table_prefix "_global_parameter_server AS a " \
1115     "  ON g.id = a.parameter_id " \
1116     "INNER JOIN " #table_prefix "_server AS s" \
1117     "  ON (a.server_id = s.id) " \
1118     "WHERE s.tag = ? " #__VA_ARGS__
1119 #endif
1120 
1121 #ifndef MYSQL_DELETE_GLOBAL_PARAMETER_UNASSIGNED
1122 #define MYSQL_DELETE_GLOBAL_PARAMETER_UNASSIGNED(table_prefix, ...) \
1123     "DELETE g FROM " #table_prefix "_global_parameter AS g " \
1124     "LEFT JOIN " #table_prefix "_global_parameter_server AS a " \
1125     "  ON g.id = a.parameter_id " \
1126     "WHERE a.parameter_id IS NULL " #__VA_ARGS__
1127 #endif
1128 
1129 #ifndef MYSQL_DELETE_SUBNET
1130 #define MYSQL_DELETE_SUBNET_COMMON(table_prefix, ...) \
1131     "DELETE s FROM " #table_prefix "_subnet AS s " \
1132     "INNER JOIN " #table_prefix "_subnet_server AS a " \
1133     "  ON s.subnet_id = a.subnet_id " \
1134     "INNER JOIN " #table_prefix "_server AS srv" \
1135     "  ON a.server_id = srv.id " \
1136     #__VA_ARGS__
1137 
1138 #define MYSQL_DELETE_SUBNET_WITH_TAG(table_prefix, ...) \
1139     MYSQL_DELETE_SUBNET_COMMON(table_prefix, WHERE srv.tag = ? __VA_ARGS__)
1140 
1141 #define MYSQL_DELETE_SUBNET_ANY(table_prefix, ...) \
1142     "DELETE s FROM " #table_prefix "_subnet AS s " \
1143     #__VA_ARGS__
1144 
1145 #define MYSQL_DELETE_SUBNET_UNASSIGNED(table_prefix, ...) \
1146     "DELETE s FROM " #table_prefix "_subnet AS s " \
1147     "LEFT JOIN " #table_prefix "_subnet_server AS a" \
1148     "  ON s.subnet_id = a.subnet_id " \
1149     "WHERE a.subnet_id IS NULL " #__VA_ARGS__
1150 
1151 #endif
1152 
1153 #ifndef MYSQL_DELETE_SUBNET_SERVER
1154 #define MYSQL_DELETE_SUBNET_SERVER(table_prefix) \
1155     "DELETE FROM " #table_prefix "_subnet_server " \
1156     "WHERE subnet_id = ?"
1157 #endif
1158 
1159 #ifndef MYSQL_DELETE_POOLS
1160 #define MYSQL_DELETE_POOLS(table_prefix) \
1161     "DELETE FROM " #table_prefix "_pool " \
1162     "WHERE subnet_id = ? OR subnet_id = " \
1163     "(SELECT subnet_id FROM " #table_prefix "_subnet" \
1164     "    WHERE subnet_prefix = ?)"
1165 #endif
1166 
1167 #ifndef MYSQL_DELETE_PD_POOLS
1168 #define MYSQL_DELETE_PD_POOLS() \
1169     "DELETE FROM dhcp6_pd_pool " \
1170     "WHERE subnet_id = ? OR subnet_id = " \
1171     "(SELECT subnet_id FROM dhcp6_subnet" \
1172     "    WHERE subnet_prefix = ?)"
1173 #endif
1174 
1175 #ifndef MYSQL_DELETE_SHARED_NETWORK_COMMON
1176 #define MYSQL_DELETE_SHARED_NETWORK_COMMON(table_prefix, ...) \
1177     "DELETE n FROM " #table_prefix "_shared_network AS n " \
1178     "INNER JOIN " #table_prefix "_shared_network_server AS a" \
1179     "  ON n.id = a.shared_network_id " \
1180     "INNER JOIN " #table_prefix "_server AS s" \
1181     "  ON a.server_id = s.id " \
1182     #__VA_ARGS__
1183 
1184 #define MYSQL_DELETE_SHARED_NETWORK_WITH_TAG(table_prefix, ...) \
1185     MYSQL_DELETE_SHARED_NETWORK_COMMON(table_prefix, WHERE s.tag = ? __VA_ARGS__)
1186 
1187 #define MYSQL_DELETE_SHARED_NETWORK_ANY(table_prefix, ...) \
1188     "DELETE n FROM " #table_prefix "_shared_network AS n " \
1189     #__VA_ARGS__
1190 
1191 #define MYSQL_DELETE_SHARED_NETWORK_UNASSIGNED(table_prefix, ...) \
1192     "DELETE n FROM " #table_prefix "_shared_network AS n " \
1193     "LEFT JOIN " #table_prefix "_shared_network_server AS a" \
1194     "  ON n.id = a.shared_network_id " \
1195     "WHERE a.shared_network_id IS NULL " #__VA_ARGS__
1196 
1197 #endif
1198 
1199 #ifndef MYSQL_DELETE_SHARED_NETWORK_SERVER
1200 #define MYSQL_DELETE_SHARED_NETWORK_SERVER(table_prefix) \
1201     "DELETE FROM " #table_prefix "_shared_network_server " \
1202     "WHERE shared_network_id = " \
1203     "(SELECT id FROM " #table_prefix "_shared_network WHERE name = ?)"
1204 #endif
1205 
1206 #ifndef MYSQL_DELETE_OPTION_DEF
1207 #define MYSQL_DELETE_OPTION_DEF(table_prefix, ...) \
1208     "DELETE d FROM " #table_prefix "_option_def AS d " \
1209     "INNER JOIN " #table_prefix "_option_def_server AS a" \
1210     "  ON d.id = a.option_def_id " \
1211     "INNER JOIN " #table_prefix "_server AS s" \
1212     "  ON a.server_id = s.id " \
1213     "WHERE s.tag = ? " #__VA_ARGS__
1214 #endif
1215 
1216 #ifndef MYSQL_DELETE_OPTION_DEF_UNASSIGNED
1217 #define MYSQL_DELETE_OPTION_DEF_UNASSIGNED(table_prefix, ...) \
1218     "DELETE d FROM " #table_prefix "_option_def AS d " \
1219     "LEFT JOIN " #table_prefix "_option_def_server AS a " \
1220     "  ON d.id = a.option_def_id " \
1221     "WHERE a.option_def_id IS NULL " #__VA_ARGS__
1222 #endif
1223 
1224 #ifndef MYSQL_DELETE_OPTION_DEFS_CLIENT_CLASS
1225 #define MYSQL_DELETE_OPTION_DEFS_CLIENT_CLASS(table_prefix) \
1226     "DELETE FROM " #table_prefix "_option_def " \
1227     "WHERE class_id = (SELECT id FROM " #table_prefix "_client_class WHERE name = ?)"
1228 #endif
1229 
1230 #ifndef MYSQL_DELETE_OPTION_WITH_TAG
1231 #define MYSQL_DELETE_OPTION_WITH_TAG(table_prefix, ...) \
1232     "DELETE o FROM " #table_prefix "_options AS o " \
1233     "INNER JOIN " #table_prefix "_options_server AS a" \
1234     "  ON o.option_id = a.option_id " \
1235     "INNER JOIN " #table_prefix "_server AS s" \
1236     "  ON a.server_id = s.id " \
1237     "WHERE s.tag = ? " #__VA_ARGS__
1238 #endif
1239 
1240 #ifndef MYSQL_DELETE_OPTION_NO_TAG
1241 #define MYSQL_DELETE_OPTION_NO_TAG(table_prefix, ...) \
1242     "DELETE o FROM " #table_prefix "_options AS o " \
1243     #__VA_ARGS__
1244 #endif
1245 
1246 #ifndef MYSQL_DELETE_OPTION_SUBNET_ID_PREFIX
1247 #define MYSQL_DELETE_OPTION_SUBNET_ID_PREFIX(table_prefix) \
1248     "DELETE o FROM " #table_prefix "_options AS o " \
1249     "INNER JOIN " #table_prefix "_subnet AS s " \
1250     "  ON s.subnet_id = o." #table_prefix "_subnet_id " \
1251     "WHERE o.scope_id = 1 AND (s.subnet_id = ? OR s.subnet_prefix = ?)"
1252 #endif
1253 
1254 #ifndef MYSQL_DELETE_OPTION_UNASSIGNED
1255 #define MYSQL_DELETE_OPTION_UNASSIGNED(table_prefix, ...) \
1256     "DELETE o FROM " #table_prefix "_options AS o " \
1257     "LEFT JOIN " #table_prefix "_options_server AS a " \
1258     "  ON o.option_id = a.option_id " \
1259     "WHERE a.option_id IS NULL " #__VA_ARGS__
1260 #endif
1261 
1262 #ifndef MYSQL_DELETE_OPTION_POOL_RANGE
1263 #define MYSQL_DELETE_OPTION_POOL_RANGE(table_prefix, ...) \
1264     "DELETE o FROM " #table_prefix "_options AS o " \
1265     "WHERE " #__VA_ARGS__ \
1266     "  AND o.pool_id = " \
1267     "  (SELECT id FROM " #table_prefix "_pool" \
1268     "   WHERE start_address = ? AND end_address = ?)"
1269 #endif
1270 
1271 #ifndef MYSQL_DELETE_OPTION_PD_POOL
1272 #define MYSQL_DELETE_OPTION_PD_POOL(...) \
1273     "DELETE o FROM dhcp6_options AS o " \
1274     "WHERE " #__VA_ARGS__ \
1275     "  AND o.pd_pool_id = " \
1276     "  (SELECT id FROM dhcp6_pd_pool" \
1277     "   WHERE prefix = ? AND prefix_length = ?)"
1278 #endif
1279 
1280 #ifndef MYSQL_DELETE_CLIENT_CLASS_DEPENDENCY
1281 #define MYSQL_DELETE_CLIENT_CLASS_DEPENDENCY(table_prefix) \
1282     "DELETE FROM " #table_prefix "_client_class_dependency " \
1283     "WHERE class_id = (SELECT id FROM " #table_prefix "_client_class WHERE name = ?)"
1284 #endif
1285 
1286 #ifndef MYSQL_DELETE_CLIENT_CLASS_SERVER
1287 #define MYSQL_DELETE_CLIENT_CLASS_SERVER(table_prefix) \
1288     "DELETE FROM " #table_prefix "_client_class_server " \
1289     "WHERE class_id = " \
1290     "(SELECT id FROM " #table_prefix "_client_class WHERE name = ?)"
1291 #endif
1292 
1293 #ifndef MYSQL_DELETE_CLIENT_CLASS_COMMON
1294 #define MYSQL_DELETE_CLIENT_CLASS_COMMON(table_prefix, ...) \
1295     "DELETE c FROM " #table_prefix "_client_class AS c " \
1296     "INNER JOIN " #table_prefix "_client_class_server AS a" \
1297     "  ON c.id = a.class_id " \
1298     "INNER JOIN " #table_prefix "_server AS s" \
1299     "  ON a.server_id = s.id " \
1300     #__VA_ARGS__
1301 
1302 #define MYSQL_DELETE_CLIENT_CLASS_WITH_TAG(table_prefix, ...) \
1303     MYSQL_DELETE_CLIENT_CLASS_COMMON(table_prefix, WHERE s.tag = ? __VA_ARGS__)
1304 
1305 #define MYSQL_DELETE_CLIENT_CLASS_ANY(table_prefix, ...) \
1306     MYSQL_DELETE_CLIENT_CLASS_COMMON(table_prefix, __VA_ARGS__)
1307 
1308 #define MYSQL_DELETE_CLIENT_CLASS_UNASSIGNED(table_prefix, ...) \
1309     "DELETE c FROM " #table_prefix "_client_class AS c " \
1310     "LEFT JOIN " #table_prefix "_client_class_server AS a" \
1311     "  ON c.id = a.class_id " \
1312     "WHERE a.class_id IS NULL " #__VA_ARGS__
1313 
1314 #endif
1315 
1316 #ifndef MYSQL_DELETE_SERVER
1317 #define MYSQL_DELETE_SERVER(table_prefix) \
1318     "DELETE FROM " #table_prefix "_server " \
1319     "WHERE tag = ?"
1320 #endif
1321 
1322 #ifndef MYSQL_DELETE_ALL_SERVERS
1323 #define MYSQL_DELETE_ALL_SERVERS(table_prefix) \
1324     "DELETE FROM " #table_prefix "_server " \
1325     "WHERE id > 1"
1326 #endif
1327 
1328 } // end of anonymous namespace
1329 
1330 } // end of namespace isc::dhcp
1331 } // end of namespace isc
1332 
1333 #endif
1334