22 #ifndef DBALLE_DB_MYSQL_INTERNALS_H
23 #define DBALLE_DB_MYSQL_INTERNALS_H
26 #include <dballe/db/sql.h>
32 struct MySQLStatement;
46 error_mysql(
const std::string& dbmsg,
const std::string& msg);
49 wreport::ErrorCode code()
const throw () {
return wreport::WR_ERR_ODBC; }
51 virtual const char* what()
const throw () {
return msg.c_str(); }
53 static void throwf(MYSQL* db,
const char* fmt, ...) WREPORT_THROWF_ATTRS(2, 3);
62 bool has_passwd =
false;
64 bool has_dbname =
false;
67 std::string unix_socket;
71 void parse_url(
const std::string& url);
73 std::string to_url()
const;
78 MYSQL_RES* res =
nullptr;
79 MYSQL_ROW row =
nullptr;
81 Row(MYSQL_RES* res, MYSQL_ROW row) : res(res), row(row) {}
83 operator bool()
const {
return row !=
nullptr; }
84 operator MYSQL_ROW() {
return row; }
85 operator const MYSQL_ROW()
const {
return row; }
87 int as_int(
unsigned col)
const {
return strtol(row[col], 0, 10); }
88 unsigned as_unsigned(
unsigned col)
const {
return strtoul(row[col], 0, 10); }
89 const char* as_cstring(
unsigned col)
const {
return row[col]; }
90 std::string as_string(
unsigned col)
const {
return std::string(row[col], mysql_fetch_lengths(res)[col]); }
92 bool isnull(
unsigned col)
const {
return row[col] ==
nullptr; }
97 MYSQL_RES* res =
nullptr;
100 Result(MYSQL_RES* res) : res(res) {}
101 ~
Result() {
if (res) mysql_free_result(res); }
107 if (
this == &o)
return *
this;
108 if (res) mysql_free_result(res);
114 operator bool()
const {
return res !=
nullptr; }
116 operator MYSQL_RES*() {
return res; }
117 operator const MYSQL_RES*()
const {
return res; }
119 unsigned rowcount()
const {
return mysql_num_rows(res); }
120 unsigned colcount()
const {
return mysql_num_fields(res); }
154 void init_after_connect();
167 operator MYSQL*() {
return db; }
170 void open_url(
const std::string& url);
174 std::string
escape(
const char* str);
176 std::string
escape(
const std::string& str);
184 void exec_no_data(
const char* query);
186 void exec_no_data(
const std::string& query);
192 void exec_use(
const char* query, std::function<
void(
const mysql::Row&)> dest);
194 void exec_use(
const std::string& query, std::function<
void(
const mysql::Row&)> dest);
196 std::unique_ptr<Transaction>
transaction()
override;
199 bool has_table(
const std::string& name)
override;
206 std::string
get_setting(
const std::string& key)
override;
213 void set_setting(
const std::string& key,
const std::string& value)
override;
235 void wrap_sqlite3_exec(
const std::string& query);
237 void wrap_sqlite3_exec_nothrow(
const std::string& query) noexcept;
242 struct MySQLStatement
245 MySQLConnection& conn;
246 sqlite3_stmt *stm =
nullptr;
248 MySQLStatement(MySQLConnection& conn,
const std::string& query);
249 MySQLStatement(
const MySQLStatement&) =
delete;
250 MySQLStatement(
const MySQLStatement&&) =
delete;
252 MySQLStatement& operator=(
const MySQLStatement&) =
delete;
261 template<
typename... Args>
void bind(
const Args& ...args)
263 bindn<
sizeof...(args)>(args...);
266 void bind_null_val(
int idx);
267 void bind_val(
int idx,
int val);
268 void bind_val(
int idx,
unsigned val);
269 void bind_val(
int idx,
unsigned short val);
270 void bind_val(
int idx,
const Datetime& val);
271 void bind_val(
int idx,
const char* val);
272 void bind_val(
int idx,
const std::string& val);
283 void execute(std::function<
void()> on_row);
289 void execute_one(std::function<
void()> on_row);
292 int column_int(
int col) {
return sqlite3_column_int(stm, col); }
295 sqlite3_int64 column_int64(
int col) {
return sqlite3_column_int64(stm, col); }
298 double column_double(
int col) {
return sqlite3_column_double(stm, col); }
301 const char* column_string(
int col) {
return (
const char*)sqlite3_column_text(stm, col); }
304 Datetime column_datetime(
int col);
307 bool column_isnull(
int col) {
return sqlite3_column_type(stm, col) == SQLITE_NULL; }
309 void wrap_sqlite3_reset();
310 void wrap_sqlite3_reset_nothrow() noexcept;
315 [[noreturn]]
void reset_and_throw(const std::
string& errmsg);
317 operator sqlite3_stmt*() {
return stm; }
322 int exec_direct(
const char* query);
324 int exec_direct(
const char* query,
int qlen);
327 int execute_and_close();
329 int exec_direct_and_close(
const char* query);
331 int exec_direct_and_close(
const char* query,
int qlen);
339 bool fetch_expecting_one();
341 void close_cursor_if_needed();
343 size_t select_rowcount();
350 template<
size_t total>
void bindn() {}
352 template<
size_t total,
typename ...Args,
typename T>
void bindn(
const T& first,
const Args& ...args)
354 bind_val(total -
sizeof...(args), first);
355 bindn<total>(args...);
error_mysql(MYSQL *db, const std::string &msg)
Copy informations from the ODBC diagnostic record to the dba error report.
void drop_settings() override
Drop the settings table.
Definition: mysql/internals.h:58
Database connection.
Definition: mysql/internals.h:145
Report a MySQL error.
Definition: mysql/internals.h:37
int get_last_insert_id()
Return LAST_INSERT_ID or LAST_INSER_ROWID or whatever is appropriate for the current database...
Base exception for database errors.
Definition: db/defs.h:54
Copyright (C) 2008–2010 ARPA-SIM urpsim@smr.arpa.emr.it
Definition: cmdline.h:17
void drop_table_if_exists(const char *name)
Delete a table in the database if it exists, otherwise do nothing.
Functions used to connect to DB-All.e and insert, query and delete data.
Row expect_one_result()
Check that the function returned only one row, and return that row.
Row fetch()
Fetch one row.
Definition: mysql/internals.h:134
std::string escape(const char *str)
Escape a C string.
Definition: mysql/internals.h:76
Result(Result &&o)
Implement move.
Definition: mysql/internals.h:104
Date and time.
Definition: types.h:147
std::unique_ptr< Transaction > transaction() override
Begin a transaction.
void set_setting(const std::string &key, const std::string &value) override
Set a value in the settings table.
void exec_no_data_nothrow(const char *query) noexcept
Run a query throwing no exceptions, warning on stderr if it is not successful or if it gives a nonemp...
bool has_table(const std::string &name) override
Check if the database contains a table.
MYSQL * db
Database connection.
Definition: mysql/internals.h:149
Definition: mysql/internals.h:95
std::string get_setting(const std::string &key) override
Get a value from the settings table.