mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-01 14:35:29 +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:
@@ -1502,7 +1502,11 @@ public:
|
|||||||
createInputContextBinding(option),
|
createInputContextBinding(option),
|
||||||
MySqlBinding::createNull(),
|
MySqlBinding::createNull(),
|
||||||
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;
|
boost::scoped_ptr<MySqlTransaction> transaction;
|
||||||
@@ -1527,15 +1531,10 @@ public:
|
|||||||
server_selector, "subnet specific option set",
|
server_selector, "subnet specific option set",
|
||||||
cascade_update);
|
cascade_update);
|
||||||
|
|
||||||
if (existing_option) {
|
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_SUBNET_ID,
|
||||||
in_bindings.push_back(MySqlBinding::createString(tag));
|
in_bindings) == 0) {
|
||||||
in_bindings.push_back(MySqlBinding::createInteger<uint32_t>(static_cast<uint32_t>(subnet_id)));
|
// Remove the 4 bindings used only in case of update.
|
||||||
in_bindings.push_back(MySqlBinding::createInteger<uint8_t>(option->option_->getType()));
|
in_bindings.resize(in_bindings.size() - 4);
|
||||||
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
|
|
||||||
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_SUBNET_ID,
|
|
||||||
in_bindings);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
insertOption4(server_selector, in_bindings);
|
insertOption4(server_selector, in_bindings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1599,7 +1598,11 @@ public:
|
|||||||
createInputContextBinding(option),
|
createInputContextBinding(option),
|
||||||
MySqlBinding::createNull(),
|
MySqlBinding::createNull(),
|
||||||
MySqlBinding::createInteger<uint64_t>(pool_id),
|
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_);
|
MySqlTransaction transaction(conn_);
|
||||||
@@ -1617,15 +1620,10 @@ public:
|
|||||||
server_selector, "pool specific option set",
|
server_selector, "pool specific option set",
|
||||||
cascade_update);
|
cascade_update);
|
||||||
|
|
||||||
if (existing_option) {
|
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_POOL_ID,
|
||||||
in_bindings.push_back(MySqlBinding::createString(tag));
|
in_bindings) == 0) {
|
||||||
in_bindings.push_back(MySqlBinding::createInteger<uint64_t>(pool_id));
|
// Remove the 4 bindings used only in case of update.
|
||||||
in_bindings.push_back(MySqlBinding::createInteger<uint8_t>(option->option_->getType()));
|
in_bindings.resize(in_bindings.size() - 4);
|
||||||
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
|
|
||||||
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::UPDATE_OPTION4_POOL_ID,
|
|
||||||
in_bindings);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
insertOption4(server_selector, in_bindings);
|
insertOption4(server_selector, in_bindings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1665,7 +1663,11 @@ public:
|
|||||||
createInputContextBinding(option),
|
createInputContextBinding(option),
|
||||||
MySqlBinding::createString(shared_network_name),
|
MySqlBinding::createString(shared_network_name),
|
||||||
MySqlBinding::createNull(),
|
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;
|
boost::scoped_ptr<MySqlTransaction> transaction;
|
||||||
@@ -1689,15 +1691,11 @@ public:
|
|||||||
server_selector, "shared network specific option set",
|
server_selector, "shared network specific option set",
|
||||||
cascade_update);
|
cascade_update);
|
||||||
|
|
||||||
if (existing_option) {
|
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv4Impl::
|
||||||
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::
|
|
||||||
UPDATE_OPTION4_SHARED_NETWORK,
|
UPDATE_OPTION4_SHARED_NETWORK,
|
||||||
in_bindings);
|
in_bindings) == 0) {
|
||||||
} else {
|
// Remove the 4 bindings used only in case of update.
|
||||||
|
in_bindings.resize(in_bindings.size() - 4);
|
||||||
insertOption4(server_selector, in_bindings);
|
insertOption4(server_selector, in_bindings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1715,7 +1715,11 @@ public:
|
|||||||
MySqlBinding::createNull(),
|
MySqlBinding::createNull(),
|
||||||
MySqlBinding::createNull(),
|
MySqlBinding::createNull(),
|
||||||
MySqlBinding::createTimestamp(option->getModificationTime()),
|
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;
|
boost::scoped_ptr<MySqlTransaction> transaction;
|
||||||
@@ -1740,15 +1744,10 @@ public:
|
|||||||
server_selector, "subnet specific option set",
|
server_selector, "subnet specific option set",
|
||||||
cascade_update);
|
cascade_update);
|
||||||
|
|
||||||
if (existing_option) {
|
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_SUBNET_ID,
|
||||||
in_bindings.push_back(MySqlBinding::createString(tag));
|
in_bindings) == 0) {
|
||||||
in_bindings.push_back(MySqlBinding::createInteger<uint32_t>(static_cast<uint32_t>(subnet_id)));
|
// Remove the 4 bindings used only in case of update.
|
||||||
in_bindings.push_back(MySqlBinding::createInteger<uint16_t>(option->option_->getType()));
|
in_bindings.resize(in_bindings.size() - 4);
|
||||||
in_bindings.push_back(MySqlBinding::condCreateString(option->space_name_));
|
|
||||||
conn_.updateDeleteQuery(MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_SUBNET_ID,
|
|
||||||
in_bindings);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
insertOption6(server_selector, in_bindings);
|
insertOption6(server_selector, in_bindings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1877,9 +1876,16 @@ public:
|
|||||||
in_bindings.push_back(MySqlBinding::createNull());
|
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_);
|
MySqlTransaction transaction(conn_);
|
||||||
|
|
||||||
const int index = (pool_type == Lease::TYPE_NA ?
|
int index = (pool_type == Lease::TYPE_NA ?
|
||||||
GET_OPTION6_POOL_ID_CODE_SPACE :
|
GET_OPTION6_POOL_ID_CODE_SPACE :
|
||||||
GET_OPTION6_PD_POOL_ID_CODE_SPACE);
|
GET_OPTION6_PD_POOL_ID_CODE_SPACE);
|
||||||
OptionDescriptorPtr existing_option =
|
OptionDescriptorPtr existing_option =
|
||||||
@@ -1899,17 +1905,12 @@ public:
|
|||||||
MySqlConfigBackendDHCPv6Impl::CREATE_AUDIT_REVISION,
|
MySqlConfigBackendDHCPv6Impl::CREATE_AUDIT_REVISION,
|
||||||
server_selector, msg, cascade_update);
|
server_selector, msg, cascade_update);
|
||||||
|
|
||||||
if (existing_option) {
|
index = (pool_type == Lease::TYPE_NA ?
|
||||||
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 ?
|
|
||||||
MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_POOL_ID :
|
MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_POOL_ID :
|
||||||
MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_PD_POOL_ID);
|
MySqlConfigBackendDHCPv6Impl::UPDATE_OPTION6_PD_POOL_ID);
|
||||||
conn_.updateDeleteQuery(index, in_bindings);
|
if (conn_.updateDeleteQuery(index, in_bindings) == 0) {
|
||||||
|
// Remove the 4 bindings used only in case of update.
|
||||||
} else {
|
in_bindings.resize(in_bindings.size() - 4);
|
||||||
insertOption6(server_selector, in_bindings);
|
insertOption6(server_selector, in_bindings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1950,7 +1951,11 @@ public:
|
|||||||
MySqlBinding::createString(shared_network_name),
|
MySqlBinding::createString(shared_network_name),
|
||||||
MySqlBinding::createNull(),
|
MySqlBinding::createNull(),
|
||||||
MySqlBinding::createTimestamp(option->getModificationTime()),
|
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;
|
boost::scoped_ptr<MySqlTransaction> transaction;
|
||||||
@@ -1974,15 +1979,11 @@ public:
|
|||||||
server_selector, "shared network specific option set",
|
server_selector, "shared network specific option set",
|
||||||
cascade_update);
|
cascade_update);
|
||||||
|
|
||||||
if (existing_option) {
|
if (conn_.updateDeleteQuery(MySqlConfigBackendDHCPv6Impl::
|
||||||
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::
|
|
||||||
UPDATE_OPTION6_SHARED_NETWORK,
|
UPDATE_OPTION6_SHARED_NETWORK,
|
||||||
in_bindings);
|
in_bindings) == 0) {
|
||||||
} else {
|
// Remove the 4 bindings used only in case of update.
|
||||||
|
in_bindings.resize(in_bindings.size() - 4);
|
||||||
insertOption6(server_selector, in_bindings);
|
insertOption6(server_selector, in_bindings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user