Skip to content

Commit ced361f

Browse files
committed
Store error message instead of error string
Resolves #187.
1 parent ba4f6b7 commit ced361f

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

hdr/sqlite_modern_cpp.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ namespace sqlite {
113113
sqlite3_stmt* tmp = nullptr;
114114
const char *remaining;
115115
hresult = sqlite3_prepare_v2(_db.get(), sql.data(), sql.length(), &tmp, &remaining);
116-
if(hresult != SQLITE_OK) errors::throw_sqlite_error(hresult, sql);
116+
if(hresult != SQLITE_OK) errors::throw_sqlite_error(hresult, sql, sqlite3_errmsg(_db.get()));
117117
if(!std::all_of(remaining, sql.data() + sql.size(), [](char ch) {return std::isspace(ch);}))
118118
throw errors::more_statements("Multiple semicolon separated statements are unsupported", sql);
119119
return tmp;
@@ -214,7 +214,7 @@ namespace sqlite {
214214
_binder = nullptr;
215215
break;
216216
default:
217-
exceptions::throw_sqlite_error(result, _binder->sql());
217+
exceptions::throw_sqlite_error(result, _binder->sql(), sqlite3_errmsg(_binder->_db.get()));
218218
}
219219
return *this;
220220
}
@@ -387,7 +387,7 @@ namespace sqlite {
387387
sqlite3* tmp = nullptr;
388388
auto ret = sqlite3_open_v2(db_name.data(), &tmp, static_cast<int>(config.flags), config.zVfs);
389389
_db = std::shared_ptr<sqlite3>(tmp, [=](sqlite3* ptr) { sqlite3_close_v2(ptr); }); // this will close the connection eventually when no longer needed.
390-
if(ret != SQLITE_OK) errors::throw_sqlite_error(_db ? sqlite3_extended_errcode(_db.get()) : ret);
390+
if(ret != SQLITE_OK) errors::throw_sqlite_error(_db ? sqlite3_extended_errcode(_db.get()) : ret, {}, sqlite3_errmsg(_db.get()));
391391
sqlite3_extended_result_codes(_db.get(), true);
392392
if(config.encoding == Encoding::UTF16)
393393
*this << R"(PRAGMA encoding = "UTF-16";)";
@@ -430,7 +430,7 @@ namespace sqlite {
430430
nullptr, nullptr, [](void* ptr){
431431
delete static_cast<decltype(funcPtr)>(ptr);
432432
}))
433-
errors::throw_sqlite_error(result);
433+
errors::throw_sqlite_error(result, {}, sqlite3_errmsg(_db.get()));
434434
}
435435

436436
template <typename StepFunction, typename FinalFunction>
@@ -446,7 +446,7 @@ namespace sqlite {
446446
[](void* ptr){
447447
delete static_cast<decltype(funcPtr)>(ptr);
448448
}))
449-
errors::throw_sqlite_error(result);
449+
errors::throw_sqlite_error(result, {}, sqlite3_errmsg(_db.get()));
450450
}
451451

452452
};
@@ -505,7 +505,7 @@ namespace sqlite {
505505
db._next_index(); --db._inx;
506506
int result = bind_col_in_db(db._stmt.get(), val.index, std::forward<T>(val.value));
507507
if(result != SQLITE_OK)
508-
exceptions::throw_sqlite_error(result, db.sql());
508+
exceptions::throw_sqlite_error(result, db.sql(), sqlite3_errmsg(db._db.get()));
509509
return db;
510510
}
511511

@@ -516,14 +516,14 @@ namespace sqlite {
516516
throw errors::unknown_binding("The given binding name is not valid for this statement", db.sql());
517517
int result = bind_col_in_db(db._stmt.get(), index, std::forward<T>(val.value));
518518
if(result != SQLITE_OK)
519-
exceptions::throw_sqlite_error(result, db.sql());
519+
exceptions::throw_sqlite_error(result, db.sql(), sqlite3_errmsg(db._db.get()));
520520
return db;
521521
}
522522

523523
template<typename T> database_binder &operator<<(database_binder& db, T&& val) {
524524
int result = bind_col_in_db(db._stmt.get(), db._next_index(), std::forward<T>(val));
525525
if(result != SQLITE_OK)
526-
exceptions::throw_sqlite_error(result, db.sql());
526+
exceptions::throw_sqlite_error(result, db.sql(), sqlite3_errmsg(db._db.get()));
527527
return db;
528528
}
529529
// Convert the rValue binder to a reference and call first op<<, its needed for the call that creates the binder (be carefull of recursion here!)

hdr/sqlite_modern_cpp/errors.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ namespace sqlite {
1010
class sqlite_exception: public std::runtime_error {
1111
public:
1212
sqlite_exception(const char* msg, str_ref sql, int code = -1): runtime_error(msg), code(code), sql(sql) {}
13-
sqlite_exception(int code, str_ref sql): runtime_error(sqlite3_errstr(code)), code(code), sql(sql) {}
13+
sqlite_exception(int code, str_ref sql, const char *msg = nullptr): runtime_error(msg ? msg : sqlite3_errstr(code)), code(code), sql(sql) {}
1414
int get_code() const {return code & 0xFF;}
1515
int get_extended_code() const {return code;}
1616
std::string get_sql() const {return sql;}
17+
const char *errstr() const {return code == -1 ? "Unknown error" : sqlite3_errstr(code);}
1718
private:
1819
int code;
1920
std::string sql;
@@ -41,7 +42,7 @@ namespace sqlite {
4142
class invalid_utf16: public sqlite_exception { using sqlite_exception::sqlite_exception; };
4243
class unknown_binding: public sqlite_exception { using sqlite_exception::sqlite_exception; };
4344

44-
static void throw_sqlite_error(const int& error_code, str_ref sql = "") {
45+
static void throw_sqlite_error(const int& error_code, str_ref sql = "", const char *errmsg = nullptr) {
4546
switch(error_code & 0xFF) {
4647
#define SQLITE_MODERN_CPP_ERROR_CODE(NAME,name,derived) \
4748
case SQLITE_ ## NAME: switch(error_code) { \
@@ -57,11 +58,11 @@ namespace sqlite {
5758
#endif
5859

5960
#define SQLITE_MODERN_CPP_ERROR_CODE_EXTENDED(BASE,SUB,base,sub) \
60-
case SQLITE_ ## BASE ## _ ## SUB: throw base ## _ ## sub(error_code, sql);
61+
case SQLITE_ ## BASE ## _ ## SUB: throw base ## _ ## sub(error_code, sql, errmsg);
6162
#include "lists/error_codes.h"
6263
#undef SQLITE_MODERN_CPP_ERROR_CODE_EXTENDED
6364
#undef SQLITE_MODERN_CPP_ERROR_CODE
64-
default: throw sqlite_exception(error_code, sql);
65+
default: throw sqlite_exception(error_code, sql, errmsg);
6566
}
6667
}
6768
}

0 commit comments

Comments
 (0)