summaryrefslogtreecommitdiff
path: root/lib/input/mysqlStmt.cpp
blob: 0a80258c38f185ee9b87fe22c49f9318bdb93027 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "mysqlStmt.h"
#include "mysqlBindings.h"
#include "mysqlConn.h"
#include "mysqlRecordSet.h"
#include <cstring>
#include <helpers.h>
#include <stdexcept>
#include <utility>
#include <vector>

namespace MyGrate::Input {
	MySQLPrepStmt::MySQLPrepStmt(const char * const q, MYSQL * c) : stmt {mysql_stmt_init(c), &mysql_stmt_close}
	{
		verify<MySQLErr>(!mysql_stmt_prepare(stmt.get(), q, strlen(q)), q, c);
	}

	void
	MySQLPrepStmt::execute(const std::span<const DbValue> vs)
	{
		Bindings b {vs};
		verify<std::logic_error>(!mysql_stmt_bind_param(stmt.get(), b.binds.data()), "Param count mismatch");
		verify<MySQLErr>(!mysql_stmt_execute(stmt.get()), "Prepared statement execute", stmt->mysql);
	}

	std::size_t
	MySQLPrepStmt::rows() const
	{
		return mysql_stmt_affected_rows(stmt.get());
	}

	RecordSetPtr
	MySQLPrepStmt::recordSet()
	{
		return std::make_unique<MySQLRecordSet>(std::move(stmt));
	}

	CursorPtr
	MySQLPrepStmt::cursor()
	{
		return std::make_unique<MySQLCursor>(std::move(stmt));
	}
}