Skip to content

Commit

Permalink
adding default transaction id of -1 when instantiating transactions. …
Browse files Browse the repository at this point in the history
…transaction_id is therefore not optional anymore in TransactionEntry strcut

Signed-off-by: pietfried <[email protected]>
  • Loading branch information
Pietfried committed Dec 13, 2022
1 parent 8572810 commit f0c71d0
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 32 deletions.
12 changes: 7 additions & 5 deletions include/ocpp1_6/database_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ class DatabaseHandler {

// transactions
/// \brief Inserts a transaction with the given parameter to the TRANSACTIONS table.
void insert_transaction(const std::string& session_id, int32_t connector, const std::string& id_tag_start,
const std::string& time_start, int32_t meter_start, boost::optional<int32_t> reservation_id);
void insert_transaction(const std::string& session_id, const int32_t transaction_id, const int32_t connector,
const std::string& id_tag_start, const std::string& time_start, const int32_t meter_start,
const boost::optional<int32_t> reservation_id);

/// \brief Updates the given parameters for the transaction with the given \p session_id in the TRANSACTIONS table.
void update_transaction(const std::string& session_id, int32_t transaction_id,
boost::optional<CiString20Type> parent_id_tag = boost::none);
Expand All @@ -65,11 +67,11 @@ class DatabaseHandler {

// connector availability
/// \brief Inserts or updates the given \p availability_type of the given \p connector to the CONNECTORS table.
void insert_or_update_connector_availability(int32_t connector, const AvailabilityType &availability_type);
void insert_or_update_connector_availability(int32_t connector, const AvailabilityType& availability_type);

/// \brief Inserts or updates the given \p availability_type of the given \p connectors to the CONNECTORS table.
void insert_or_update_connector_availability(const std::vector<int32_t> &connectors,
const AvailabilityType &availability_type);
void insert_or_update_connector_availability(const std::vector<int32_t>& connectors,
const AvailabilityType& availability_type);

/// \brief Returns the AvailabilityType of the given \p connector of the CONNECTORS table.
AvailabilityType get_connector_availability(int32_t connector);
Expand Down
2 changes: 1 addition & 1 deletion include/ocpp1_6/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,8 @@ struct TransactionEntry {
std::string id_tag_start;
std::string time_start;
int32_t meter_start;
int32_t transaction_id;
boost::optional<int32_t> reservation_id = boost::none;
boost::optional<int32_t> transaction_id = boost::none;
boost::optional<std::string> parent_id_tag = boost::none;
boost::optional<int32_t> meter_stop = boost::none;
boost::optional<std::string> time_end = boost::none;
Expand Down
6 changes: 3 additions & 3 deletions lib/ocpp1_6/charge_point.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,8 @@ void ChargePoint::stop_pending_transactions() {
StopTransactionRequest req;
req.meterStop = transaction_entry.meter_start; // FIXME(piet): Get latest meter value here
req.timestamp = DateTime();
req.transactionId = transaction_entry.transaction_id.value();
req.reason = Reason::PowerLoss;
req.transactionId = transaction_entry.transaction_id;

auto message_id = this->message_queue->createMessageId();
Call<StopTransactionRequest> call(req, message_id);
Expand Down Expand Up @@ -2527,8 +2527,8 @@ void ChargePoint::on_transaction_started(const int32_t& connector, const std::st
transaction->add_meter_value(meter_value);
}

this->database_handler->insert_transaction(session_id, connector, id_token, timestamp.to_rfc3339(), meter_start,
reservation_id);
this->database_handler->insert_transaction(session_id, transaction->get_transaction_id(), connector, id_token,
timestamp.to_rfc3339(), meter_start, reservation_id);
this->transaction_handler->add_transaction(transaction);
this->start_transaction(transaction);
}
Expand Down
53 changes: 30 additions & 23 deletions lib/ocpp1_6/database_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,27 +94,31 @@ bool DatabaseHandler::clear_table(const std::string& table_name) {
}

// transactions
void DatabaseHandler::insert_transaction(const std::string& session_id, int32_t connector,
const std::string& id_tag_start, const std::string& time_start,
int32_t meter_start, boost::optional<int32_t> reservation_id) {
std::string sql = "INSERT INTO TRANSACTIONS (ID, CONNECTOR, ID_TAG_START, TIME_START, METER_START, RESERVATION_ID) VALUES "
"(@session_id, @connector, @id_tag_start, @time_start, @meter_start, @reservation_id)";
void DatabaseHandler::insert_transaction(const std::string& session_id, const int32_t transaction_id,
const int32_t connector, const std::string& id_tag_start,
const std::string& time_start, const int32_t meter_start,
const boost::optional<int32_t> reservation_id) {
std::string sql =
"INSERT INTO TRANSACTIONS (ID, TRANSACTION_ID, CONNECTOR, ID_TAG_START, TIME_START, METER_START, "
"RESERVATION_ID) VALUES "
"(@session_id, @transaction_id, @connector, @id_tag_start, @time_start, @meter_start, @reservation_id)";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(this->db, sql.c_str(), sql.size(), &stmt, NULL) != SQLITE_OK) {
EVLOG_error << "Could not prepare insert statement" << std::endl;
throw std::runtime_error("Database access error");
}

sqlite3_bind_text(stmt, 1, session_id.c_str(), session_id.length(), NULL);
sqlite3_bind_int(stmt, 2, connector);
sqlite3_bind_text(stmt, 3, id_tag_start.c_str(), id_tag_start.length(), NULL);
sqlite3_bind_text(stmt, 4, time_start.c_str(), time_start.length(), NULL);
sqlite3_bind_int(stmt, 5, meter_start);
sqlite3_bind_int(stmt, 2, transaction_id);
sqlite3_bind_int(stmt, 3, connector);
sqlite3_bind_text(stmt, 4, id_tag_start.c_str(), id_tag_start.length(), NULL);
sqlite3_bind_text(stmt, 5, time_start.c_str(), time_start.length(), NULL);
sqlite3_bind_int(stmt, 6, meter_start);

if (reservation_id) {
sqlite3_bind_int(stmt, 6, reservation_id.value());
sqlite3_bind_int(stmt, 7, reservation_id.value());
} else {
sqlite3_bind_null(stmt, 6);
sqlite3_bind_null(stmt, 7);
}

if (sqlite3_step(stmt) != SQLITE_DONE) {
Expand Down Expand Up @@ -198,7 +202,7 @@ std::vector<TransactionEntry> DatabaseHandler::get_transactions(bool filter_inco
std::vector<TransactionEntry> transactions;

std::string sql = "SELECT * FROM TRANSACTIONS";

if (filter_incomplete) {
sql += " WHERE METER_STOP IS NULL OR TIME_END IS NULL";
}
Expand All @@ -211,9 +215,7 @@ std::vector<TransactionEntry> DatabaseHandler::get_transactions(bool filter_inco
while (sqlite3_step(stmt) != SQLITE_DONE) {
TransactionEntry transaction_entry;
transaction_entry.session_id = std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0)));
if (sqlite3_column_type(stmt, 1) != SQLITE_NULL) {
transaction_entry.transaction_id = sqlite3_column_int(stmt, 1);
}
transaction_entry.transaction_id = sqlite3_column_int(stmt, 1);
transaction_entry.connector = sqlite3_column_int(stmt, 2);
transaction_entry.id_tag_start = std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 3)));
transaction_entry.time_start = std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 4)));
Expand All @@ -223,19 +225,23 @@ std::vector<TransactionEntry> DatabaseHandler::get_transactions(bool filter_inco
transaction_entry.reservation_id.emplace(sqlite3_column_int(stmt, 6));
}
if (sqlite3_column_type(stmt, 7) != SQLITE_NULL) {
transaction_entry.parent_id_tag.emplace(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 7))));
transaction_entry.parent_id_tag.emplace(
std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 7))));
}
if (sqlite3_column_type(stmt, 8) != SQLITE_NULL) {
transaction_entry.id_tag_end.emplace(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 8))));
transaction_entry.id_tag_end.emplace(
std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 8))));
}
if (sqlite3_column_type(stmt, 9) != SQLITE_NULL) {
transaction_entry.time_end.emplace(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 9))));
transaction_entry.time_end.emplace(
std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 9))));
}
if (sqlite3_column_type(stmt, 10) != SQLITE_NULL) {
transaction_entry.meter_stop.emplace(sqlite3_column_int(stmt, 10));
}
if (sqlite3_column_type(stmt, 11) != SQLITE_NULL) {
transaction_entry.stop_reason.emplace(std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 11))));
transaction_entry.stop_reason.emplace(
std::string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 11))));
}
if (sqlite3_column_type(stmt, 12) != SQLITE_NULL) {
transaction_entry.reservation_id.emplace(sqlite3_column_int(stmt, 12));
Expand All @@ -247,7 +253,7 @@ std::vector<TransactionEntry> DatabaseHandler::get_transactions(bool filter_inco
EVLOG_error << "Error selecting from table" << std::endl;
throw std::runtime_error("db access error");
}

return transactions;
}

Expand Down Expand Up @@ -349,7 +355,8 @@ bool DatabaseHandler::clear_authorization_cache() {
return this->clear_table("AUTH_CACHE");
}

void DatabaseHandler::insert_or_update_connector_availability(int32_t connector, const AvailabilityType &availability_type) {
void DatabaseHandler::insert_or_update_connector_availability(int32_t connector,
const AvailabilityType& availability_type) {
std::string sql = "INSERT OR REPLACE INTO CONNECTORS (ID, AVAILABILITY) VALUES (@id, @availability)";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(this->db, sql.c_str(), sql.size(), &stmt, NULL) != SQLITE_OK) {
Expand All @@ -372,8 +379,8 @@ void DatabaseHandler::insert_or_update_connector_availability(int32_t connector,
}

// connector availability
void DatabaseHandler::insert_or_update_connector_availability(const std::vector<int32_t> &connectors,
const AvailabilityType &availability_type) {
void DatabaseHandler::insert_or_update_connector_availability(const std::vector<int32_t>& connectors,
const AvailabilityType& availability_type) {
for (const auto connector : connectors) {
this->insert_or_update_connector_availability(connector, availability_type);
}
Expand Down

0 comments on commit f0c71d0

Please sign in to comment.