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