// 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() { 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, bool usigned) { 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.buffer_length = strlen(static_cast(value)); break; case MYSQL_TYPE_DATE: result.buffer_length = TIME_LENGTH; break; case MYSQL_TYPE_LONG: case MYSQL_TYPE_LONGLONG: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_TINY: result.is_unsigned = usigned; break; default: 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())); }