2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-30 21:45:37 +00:00

[#714,!409] Try to update an option followed by insert.

Previously we'd first fetch the option to check if it exists, then update
or insert but that would always trigger two queries. Now we're down to
one query if the option already exists.
This commit is contained in:
Marcin Siodelski
2019-07-03 14:14:26 +02:00
parent ed7befb616
commit c8a627d0ed
2 changed files with 59 additions and 60 deletions

View File

@@ -1502,7 +1502,11 @@ public:
createInputContextBinding(option),
MySqlBinding::createNull(),
MySqlBinding::createNull(),
MySqlBinding::createTimestamp(option->getModificationTime())
MySqlBinding::createTimestamp(option->getModificationTime()),
MySqlBinding::createString(tag),
MySqlBinding::createInteger<uint32_t>(static_cast<uint32_t>(subnet_id)),
MySqlBinding::createInteger<uint8_t>(option->option_->getType()),
MySqlBinding::condCreateString(option->space_name_)
};
boost::scoped_ptr<MySqlTransaction> transaction;
@@ -1527,15 +1531,10 @@ public:
server_selector, "subnet specific option set",
cascade_update);
if (existing_option) {
in_bindings.push_back(MySqlBinding::createString(tag));
in_bindings.push_back(MySqlBinding::createInteger<uint32_t>(static_cast<uint32_t>(subnet_id)));
in_bindings.push_back(MySqlBinding::createInteger<uint8_t>(option->option_->getType()));
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_SUBNET_ID,
in_bindings);
} else {
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_SUBNET_ID,
in_bindings) == 0) {
// Remove the 4 bindings used only in case of update.
in_bindings.resize(in_bindings.size() - 4);
insertOption4(server_selector, in_bindings);
}
@@ -1599,7 +1598,11 @@ public:
createInputContextBinding(option),
MySqlBinding::createNull(),
MySqlBinding::createInteger<uint64_t>(pool_id),
MySqlBinding::createTimestamp(option->getModificationTime())
MySqlBinding::createTimestamp(option->getModificationTime()),
MySqlBinding::createString(tag),
MySqlBinding::createInteger<uint64_t>(pool_id),
MySqlBinding::createInteger<uint8_t>(option->option_->getType()),
MySqlBinding::condCreateString(option->space_name_)
};
MySqlTransaction transaction(conn_);
@@ -1617,15 +1620,10 @@ public:
server_selector, "pool specific option set",
cascade_update);
if (existing_option) {
in_bindings.push_back(MySqlBinding::createString(tag));
in_bindings.push_back(MySqlBinding::createInteger<uint64_t>(pool_id));
in_bindings.push_back(MySqlBinding::createInteger<uint8_t>(option->option_->getType()));
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_POOL_ID,
in_bindings);
} else {
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_POOL_ID,
in_bindings) == 0) {
// Remove the 4 bindings used only in case of update.
in_bindings.resize(in_bindings.size() - 4);
insertOption4(server_selector, in_bindings);
}
@@ -1665,7 +1663,11 @@ public:
createInputContextBinding(option),
MySqlBinding::createString(shared_network_name),
MySqlBinding::createNull(),
MySqlBinding::createTimestamp(option->getModificationTime())
MySqlBinding::createTimestamp(option->getModificationTime()),
MySqlBinding::createString(tag),
MySqlBinding::createString(shared_network_name),
MySqlBinding::createInteger<uint8_t>(option->option_->getType()),
MySqlBinding::condCreateString(option->space_name_)
};
boost::scoped_ptr<MySqlTransaction> transaction;
@@ -1689,15 +1691,11 @@ public:
server_selector, "shared network specific option set",
cascade_update);
if (existing_option) {
in_bindings.push_back(MySqlBinding::createString(tag));
in_bindings.push_back(MySqlBinding::createString(shared_network_name));
in_bindings.push_back(MySqlBinding::createInteger<uint8_t>(option->option_->getType()));
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::
UPDATE_OPTION4_SHARED_NETWORK,
in_bindings);
} else {
in_bindings) == 0) {
// Remove the 4 bindings used only in case of update.
in_bindings.resize(in_bindings.size() - 4);
insertOption4(server_selector, in_bindings);
}

View File

@@ -1715,7 +1715,11 @@ public:
MySqlBinding::createNull(),
MySqlBinding::createNull(),
MySqlBinding::createTimestamp(option->getModificationTime()),
MySqlBinding::createNull()
MySqlBinding::createNull(),
MySqlBinding::createString(tag),
MySqlBinding::createInteger<uint32_t>(static_cast<uint32_t>(subnet_id)),
MySqlBinding::createInteger<uint16_t>(option->option_->getType()),
MySqlBinding::condCreateString(option->space_name_)
};
boost::scoped_ptr<MySqlTransaction> transaction;
@@ -1740,15 +1744,10 @@ public:
server_selector, "subnet specific option set",
cascade_update);
if (existing_option) {
in_bindings.push_back(MySqlBinding::createString(tag));
in_bindings.push_back(MySqlBinding::createInteger<uint32_t>(static_cast<uint32_t>(subnet_id)));
in_bindings.push_back(MySqlBinding::createInteger<uint16_t>(option->option_->getType()));
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_SUBNET_ID,
in_bindings);
} else {
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_SUBNET_ID,
in_bindings) == 0) {
// Remove the 4 bindings used only in case of update.
in_bindings.resize(in_bindings.size() - 4);
insertOption6(server_selector, in_bindings);
}
@@ -1877,11 +1876,18 @@ public:
in_bindings.push_back(MySqlBinding::createNull());
}
// Insert bindings used only during the update.
in_bindings.push_back(MySqlBinding::createString(tag));
in_bindings.push_back(MySqlBinding::createInteger<uint64_t>(pool_id));
in_bindings.push_back(MySqlBinding::createInteger<uint16_t>(option->option_->getType()));
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
MySqlTransaction transaction(conn_);
const int index = (pool_type == Lease::TYPE_NA ?
GET_OPTION6_POOL_ID_CODE_SPACE :
GET_OPTION6_PD_POOL_ID_CODE_SPACE);
int index = (pool_type == Lease::TYPE_NA ?
GET_OPTION6_POOL_ID_CODE_SPACE :
GET_OPTION6_PD_POOL_ID_CODE_SPACE);
OptionDescriptorPtr existing_option =
getOption(index, server_selector, pool_type, pool_id,
option->option_->getType(), option->space_name_);
@@ -1899,17 +1905,12 @@ public:
MySqlConfigBackendDHCPv6Impl::CREATE_AUDIT_REVISION,
server_selector, msg, cascade_update);
if (existing_option) {
in_bindings.push_back(MySqlBinding::createString(tag));
in_bindings.push_back(MySqlBinding::createInteger<uint64_t>(pool_id));
in_bindings.push_back(MySqlBinding::createInteger<uint16_t>(option->option_->getType()));
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
const int index = (pool_type == Lease::TYPE_NA ?
index = (pool_type == Lease::TYPE_NA ?
MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_POOL_ID :
MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_PD_POOL_ID);
conn_.updateDeleteQuery(index, in_bindings);
} else {
if (conn_.updateDeleteQuery(index, in_bindings) == 0) {
// Remove the 4 bindings used only in case of update.
in_bindings.resize(in_bindings.size() - 4);
insertOption6(server_selector, in_bindings);
}
@@ -1950,7 +1951,11 @@ public:
MySqlBinding::createString(shared_network_name),
MySqlBinding::createNull(),
MySqlBinding::createTimestamp(option->getModificationTime()),
MySqlBinding::createNull()
MySqlBinding::createNull(),
MySqlBinding::createString(tag),
MySqlBinding::createString(shared_network_name),
MySqlBinding::createInteger<uint16_t>(option->option_->getType()),
MySqlBinding::condCreateString(option->space_name_)
};
boost::scoped_ptr<MySqlTransaction> transaction;
@@ -1974,15 +1979,11 @@ public:
server_selector, "shared network specific option set",
cascade_update);
if (existing_option) {
in_bindings.push_back(MySqlBinding::createString(tag));
in_bindings.push_back(MySqlBinding::createString(shared_network_name));
in_bindings.push_back(MySqlBinding::createInteger<uint16_t>(option->option_->getType()));
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv6Impl::
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv6Impl::
UPDATE_OPTION6_SHARED_NETWORK,
in_bindings);
} else {
in_bindings) == 0) {
// Remove the 4 bindings used only in case of update.
in_bindings.resize(in_bindings.size() - 4);
insertOption6(server_selector, in_bindings);
}