// SPDX-FileCopyrightText: 2023 Yury Gubich // SPDX-License-Identifier: GPL-3.0-or-later #include "statement.h" #include static uint64_t TIME_LENGTH = sizeof(MYSQL_TIME); MySQL::Statement::Statement(MYSQL* connection, const char* statement): stmt(mysql_stmt_init(connection)), param(), lengths() { int result = mysql_stmt_prepare(stmt.get(), statement, strlen(statement)); if (result != 0) throw std::runtime_error(std::string("Error preparing statement: ") + mysql_stmt_error(stmt.get())); } void MySQL::Statement::bind(void* value, enum_field_types type) { MYSQL_BIND& result = param.emplace_back(); std::memset(&result, 0, sizeof(result)); result.buffer_type = type; result.buffer = value; switch (type) { case MYSQL_TYPE_STRING: case MYSQL_TYPE_VAR_STRING: result.length = &lengths.emplace_back(strlen(static_cast(value))); break; case MYSQL_TYPE_DATE: result.length = &TIME_LENGTH; break; default: lengths.pop_back(); throw std::runtime_error("Type: " + std::to_string(type) + " is not yet supported in bind"); break; } } void MySQL::Statement::execute() { int result = mysql_stmt_bind_param(stmt.get(), param.data()); if (result != 0) throw std::runtime_error(std::string("Error binding statement: ") + mysql_stmt_error(stmt.get())); result = mysql_stmt_execute(stmt.get()); if (result != 0) throw std::runtime_error(std::string("Error executing statement: ") + mysql_stmt_error(stmt.get())); }