Skip to content

Commit

Permalink
Merge pull request #207 from c-jimenez/fix/database_access
Browse files Browse the repository at this point in the history
[database] Reset queries after exec() to ensure that no database page is locked after query execution
  • Loading branch information
c-jimenez authored Jun 11, 2024
2 parents d553904 + 6e0bd4a commit 489426a
Show file tree
Hide file tree
Showing 11 changed files with 27 additions and 38 deletions.
6 changes: 3 additions & 3 deletions examples/security_centralsystem/ChargePointDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,14 @@ bool ChargePointDatabase::addChargePoint(const std::string& identifier,

if (m_insert_query)
{
m_insert_query->reset();
m_insert_query->bind(0, identifier);
m_insert_query->bind(1, serial_number);
m_insert_query->bind(2, vendor);
m_insert_query->bind(3, model);
m_insert_query->bind(4, security_profile);
m_insert_query->bind(5, authent_key);
ret = m_insert_query->exec();
m_insert_query->reset();
}

return ret;
Expand All @@ -74,7 +74,6 @@ bool ChargePointDatabase::getChargePoint(const std::string& identifier,

if (m_find_query)
{
m_find_query->reset();
m_find_query->bind(0, identifier);
if (m_find_query->exec() && m_find_query->hasRows())
{
Expand All @@ -83,6 +82,7 @@ bool ChargePointDatabase::getChargePoint(const std::string& identifier,
authent_key = m_find_query->getString(5);
ret = true;
}
m_find_query->reset();
}

return ret;
Expand All @@ -95,10 +95,10 @@ bool ChargePointDatabase::setChargePointProfile(const std::string& identifier, u

if (m_update_profile_query)
{
m_update_profile_query->reset();
m_update_profile_query->bind(0, security_profile);
m_update_profile_query->bind(1, identifier);
ret = m_update_profile_query->exec();
m_update_profile_query->reset();
}

return ret;
Expand Down
2 changes: 1 addition & 1 deletion src/chargepoint/authent/AuthentCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,9 @@ bool AuthentCache::check(const std::string& id_tag, ocpp::types::IdTagInfo& tag_
// Entry is no more valid, delete entry
if (m_delete_query)
{
m_delete_query->reset();
m_delete_query->bind(0, id_tag);
m_delete_query->exec();
m_delete_query->reset();
}
ret = false;
}
Expand Down
6 changes: 3 additions & 3 deletions src/chargepoint/connector/Connectors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,6 @@ bool Connectors::loadConnector(Connector& connector)

if (m_find_query)
{
m_find_query->reset();
m_find_query->bind(0, connector.id);
ret = m_find_query->exec();
if (ret)
Expand Down Expand Up @@ -272,6 +271,7 @@ bool Connectors::loadConnector(Connector& connector)
{
LOG_ERROR << "Could not search for connector " << connector.id << " : " << m_find_query->lastError();
}
m_find_query->reset();
}

return ret;
Expand All @@ -284,7 +284,6 @@ bool Connectors::saveConnector(const Connector& connector)

if (m_update_query)
{
m_update_query->reset();
m_update_query->bind(0u, static_cast<int>(connector.status));
m_update_query->bind(1u, static_cast<int>(connector.last_notified_status));
m_update_query->bind(2u, connector.transaction_id);
Expand All @@ -306,6 +305,7 @@ bool Connectors::saveConnector(const Connector& connector)
{
LOG_ERROR << "Could not update connector " << connector.id << " : " << m_update_query->lastError();
}
m_update_query->reset();
}

return ret;
Expand All @@ -318,7 +318,6 @@ bool Connectors::createConnector(const Connector& connector)

if (m_insert_query)
{
m_insert_query->reset();
m_insert_query->bind(0u, connector.id);
m_insert_query->bind(1u, static_cast<int>(connector.status));
m_insert_query->bind(2u, static_cast<int>(connector.last_notified_status));
Expand All @@ -340,6 +339,7 @@ bool Connectors::createConnector(const Connector& connector)
{
LOG_ERROR << "Could not create connector " << connector.id << " : " << m_insert_query->lastError();
}
m_insert_query->reset();
}

return ret;
Expand Down
11 changes: 6 additions & 5 deletions src/chargepoint/metervalues/MeterValuesManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ void MeterValuesManager::getTxStopMeterValues(unsigned int connector_id, std::ve
{
// Get data from database
meter_values.clear();
m_find_query->reset();
m_find_query->bind(0, connector->transaction_id);
if (m_find_query->exec() && m_find_query->hasRows())
{
Expand All @@ -175,12 +174,14 @@ void MeterValuesManager::getTxStopMeterValues(unsigned int connector_id, std::ve
meter_values.pop_back();
}
} while (m_find_query->next());
m_find_query->reset();

// Clear data from database
m_delete_query->reset();
m_delete_query->bind(0, connector->transaction_id);
m_delete_query->exec();
m_delete_query->reset();
}
m_find_query->reset();
}
}

Expand Down Expand Up @@ -335,10 +336,10 @@ void MeterValuesManager::processClockAligned(void)
std::string meter_value_str = serialize(meter_value);

// Store into database
m_insert_query->reset();
m_insert_query->bind(0u, connector->transaction_id);
m_insert_query->bind(1u, meter_value_str);
m_insert_query->exec();
m_insert_query->reset();
}
}
}
Expand Down Expand Up @@ -385,10 +386,10 @@ void MeterValuesManager::processSampled(unsigned int connector_id)
std::string meter_value_str = serialize(meter_value);

// Store into database
m_insert_query->reset();
m_insert_query->bind(0u, connector->transaction_id);
m_insert_query->bind(1u, meter_value_str);
m_insert_query->exec();
m_insert_query->reset();
}
}
}
Expand Down Expand Up @@ -573,9 +574,9 @@ void MeterValuesManager::initDatabaseTable()
if (!found && m_delete_query)
{
LOG_INFO << "Cleaning meter values associated to not ongoing transaction : " << transaction_id;
m_delete_query->reset();
m_delete_query->bind(0, transaction_id);
m_delete_query->exec();
m_delete_query->reset();
}
} while (query->next());
}
Expand Down
4 changes: 2 additions & 2 deletions src/chargepoint/requestfifo/RequestFifo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,12 @@ void RequestFifo::push(unsigned int connector_id, const std::string& action, con
m_fifo.emplace(m_id, connector_id, action, request);
if (m_insert_query)
{
m_insert_query->reset();
m_insert_query->bind(0, m_id);
m_insert_query->bind(1, connector_id);
m_insert_query->bind(2, action);
m_insert_query->bind(3, request);
m_insert_query->exec();
m_insert_query->reset();
}

// Prepare for next entry
Expand Down Expand Up @@ -105,9 +105,9 @@ void RequestFifo::pop()
m_fifo.pop();
if (m_delete_query)
{
m_delete_query->reset();
m_delete_query->bind(0, id);
m_delete_query->exec();
m_delete_query->reset();
}
}

Expand Down
6 changes: 0 additions & 6 deletions src/chargepoint/security/CaCertificatesDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ ocpp::types::DeleteCertificateStatusEnumType CaCertificatesDatabase::deleteCerti
if (!in_use)
{
// Delete the requested certificate
m_delete_query->reset();
m_delete_query->bind(0, id);
if (m_delete_query->exec())
{
Expand Down Expand Up @@ -144,7 +143,6 @@ void CaCertificatesDatabase::getCertificateList(ocpp::types::CertificateUseEnumT
if (m_list_query)
{
// List certificates
m_list_query->reset();
m_list_query->bind(0, static_cast<unsigned int>(type));
m_list_query->bind(1, static_cast<int64_t>(std::numeric_limits<std::time_t>::max()));
m_list_query->bind(2, 0);
Expand Down Expand Up @@ -175,7 +173,6 @@ std::string CaCertificatesDatabase::getCertificateListPem(ocpp::types::Certifica
if (m_list_query)
{
// List certificates
m_list_query->reset();
m_list_query->bind(0, static_cast<unsigned int>(type));
m_list_query->bind(1, static_cast<int64_t>(DateTime::now().timestamp()));
m_list_query->bind(2, static_cast<int64_t>(DateTime::now().timestamp()));
Expand Down Expand Up @@ -215,7 +212,6 @@ unsigned int CaCertificatesDatabase::getCertificateCount(ocpp::types::Certificat
validity_from = std::numeric_limits<std::time_t>::max();
validity_to = 0;
}
m_count_query->reset();
m_count_query->bind(0, static_cast<unsigned int>(type));
m_count_query->bind(1, static_cast<int64_t>(validity_from));
m_count_query->bind(2, static_cast<int64_t>(validity_to));
Expand Down Expand Up @@ -247,7 +243,6 @@ bool CaCertificatesDatabase::addCertificate(ocpp::types::CertificateUseEnumType
if (!findCertificate(hash_data, id, in_use))
{
// Add certificate
m_insert_query->reset();
m_insert_query->bind(0, static_cast<unsigned int>(type));
m_insert_query->bind(1, static_cast<int64_t>(certificate.validityFrom()));
m_insert_query->bind(2, static_cast<int64_t>(certificate.validityTo()));
Expand Down Expand Up @@ -284,7 +279,6 @@ bool CaCertificatesDatabase::findCertificate(const ocpp::types::CertificateHashD
if (m_find_query)
{
// Look for the requested certificate
m_find_query->reset();
m_find_query->bind(0, certificate.issuerNameHash);
m_find_query->bind(1, certificate.issuerKeyHash);
m_find_query->bind(2, certificate.serialNumber);
Expand Down
8 changes: 1 addition & 7 deletions src/chargepoint/security/CpCertificatesDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,10 @@ void CpCertificatesDatabase::saveCertificateRequest(const ocpp::x509::Certificat
if (m_delete_csr_query && m_insert_csr_query)
{
// Delete any existing request
m_delete_csr_query->reset();
m_delete_csr_query->exec();
m_delete_csr_query->reset();

// Insert new request
m_insert_csr_query->reset();
m_insert_csr_query->bind(0, certificate_request.pem());
m_insert_csr_query->bind(1, private_key.privatePem());
if (!m_insert_csr_query->exec())
Expand All @@ -113,7 +112,6 @@ void CpCertificatesDatabase::saveCertificateRequest(const ocpp::x509::Certificat
}

// Reset all queries
m_delete_csr_query->reset();
m_insert_csr_query->reset();
}
}
Expand All @@ -126,7 +124,6 @@ std::string CpCertificatesDatabase::getCertificateRequest(unsigned int& id)
if (m_find_csr_query)
{
// Look for the certificate request
m_find_csr_query->reset();
if (m_find_csr_query->exec())
{
// Read data
Expand All @@ -149,7 +146,6 @@ bool CpCertificatesDatabase::installCertificate(unsigned int request_id, const o
if (m_update_csr_to_cert_query)
{
// Install certificate
m_update_csr_to_cert_query->reset();
m_update_csr_to_cert_query->bind(0, static_cast<int64_t>(certificate.validityFrom()));
m_update_csr_to_cert_query->bind(1, static_cast<int64_t>(certificate.validityTo()));
m_update_csr_to_cert_query->bind(2, certificate.pem());
Expand Down Expand Up @@ -178,7 +174,6 @@ bool CpCertificatesDatabase::isValidCertificateInstalled()
if (m_list_query)
{
// Find valid certificates
m_list_query->reset();
m_list_query->bind(0, static_cast<int64_t>(DateTime::now().timestamp()));
m_list_query->bind(1, static_cast<int64_t>(DateTime::now().timestamp()));
ret = (m_list_query->exec() && m_list_query->hasRows());
Expand All @@ -198,7 +193,6 @@ std::string CpCertificatesDatabase::getChargePointCertificate(std::string& priva
if (m_list_query)
{
// Find valid certificates
m_list_query->reset();
m_list_query->bind(0, static_cast<int64_t>(DateTime::now().timestamp()));
m_list_query->bind(1, static_cast<int64_t>(DateTime::now().timestamp()));
if (m_list_query->exec() && m_list_query->hasRows())
Expand Down
4 changes: 2 additions & 2 deletions src/chargepoint/security/SecurityLogsDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ bool SecurityLogsDatabase::log(const std::string& type, const std::string& messa

if (m_insert_query)
{
m_insert_query->reset();
m_insert_query->bind(0, static_cast<int64_t>(timestamp));
m_insert_query->bind(1, type);
m_insert_query->bind(2, message);
Expand All @@ -57,6 +56,7 @@ bool SecurityLogsDatabase::log(const std::string& type, const std::string& messa
{
LOG_ERROR << "Unable to store security log : " << m_insert_query->lastError();
}
m_insert_query->reset();
}

return ret;
Expand All @@ -69,12 +69,12 @@ bool SecurityLogsDatabase::clear()

if (m_clear_query)
{
m_clear_query->reset();
ret = m_clear_query->exec();
if (!ret)
{
LOG_ERROR << "Unable to clear security logs : " << m_clear_query->lastError();
}
m_clear_query->reset();
}

return ret;
Expand Down
8 changes: 4 additions & 4 deletions src/chargepoint/smartcharging/ProfileDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ bool ProfileDatabase::clear(ocpp::types::Optional<int>
// Erase from database
if (m_delete_query)
{
m_delete_query->reset();
m_delete_query->bind(0, id);
m_delete_query->exec();
m_delete_query->reset();
}
ret = true;
break;
Expand Down Expand Up @@ -157,9 +157,9 @@ bool ProfileDatabase::clear(ocpp::types::Optional<int>
// Erase in database
if (m_delete_query)
{
m_delete_query->reset();
m_delete_query->bind(0, iter->second.chargingProfileId);
m_delete_query->exec();
m_delete_query->reset();
}

// Erase in list
Expand Down Expand Up @@ -212,9 +212,9 @@ bool ProfileDatabase::install(unsigned int connector_id, const ocpp::types::Char
// Erase existing profile
if (m_delete_query)
{
m_delete_query->reset();
m_delete_query->bind(0, iter_profile->second.chargingProfileId);
m_delete_query->exec();
m_delete_query->reset();
}
profiles_list->erase(iter_profile);
}
Expand All @@ -233,11 +233,11 @@ bool ProfileDatabase::install(unsigned int connector_id, const ocpp::types::Char
std::string profile_str = serialize(profile);

// Insert
m_insert_query->reset();
m_insert_query->bind(0, profile.chargingProfileId);
m_insert_query->bind(1, connector_id);
m_insert_query->bind(2, profile_str);
m_insert_query->exec();
m_insert_query->reset();
}

ret = true;
Expand Down
Loading

0 comments on commit 489426a

Please sign in to comment.