mirror of
https://github.com/gabime/spdlog.git
synced 2024-12-26 18:41:35 +08:00
made the prepared statement re-usable and renamed .h to sqlite_sink
This commit is contained in:
parent
571e85d0f4
commit
d8d8dfd3e2
@ -8,28 +8,33 @@ namespace spdlog
|
|||||||
{
|
{
|
||||||
namespace sinks
|
namespace sinks
|
||||||
{
|
{
|
||||||
class database_logger_sink :
|
class sqlite_sink :
|
||||||
public sink
|
public sink
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit database_logger_sink(const std::string& databaseName)
|
explicit sqlite_sink(const std::string& databaseName)
|
||||||
{
|
{
|
||||||
if (sqlite3_open(databaseName.c_str(), &_database))
|
if (sqlite3_open(databaseName.c_str(), &_database))
|
||||||
throw spdlog_ex("Error opening database");
|
throw spdlog_ex("Error opening database");
|
||||||
|
|
||||||
|
if (sqlite3_prepare_v2(_database, "INSERT INTO Logs (TimeStamp,Level,Message,LoggerName,ThreadId) VALUES (?,?,?,?,?)", -1, &_query_stmt, nullptr) != SQLITE_OK)
|
||||||
|
throw spdlog_ex(sqlite3_errmsg(_database));
|
||||||
}
|
}
|
||||||
|
|
||||||
~database_logger_sink()
|
~sqlite_sink()
|
||||||
{
|
{
|
||||||
sqlite3_close(_database);
|
sqlite_sink::flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush() override
|
void flush() override
|
||||||
{
|
{
|
||||||
sqlite3_close(_database);
|
sqlite3_close(_database);
|
||||||
|
|
||||||
|
sqlite3_finalize(_query_stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_stmt * prepare_query(const details::log_msg& msg) const
|
void bind_to_statement(const details::log_msg& msg) const
|
||||||
{
|
{
|
||||||
auto time = std::chrono::system_clock::to_time_t(msg.time);
|
auto time = std::chrono::system_clock::to_time_t(msg.time);
|
||||||
|
|
||||||
@ -37,35 +42,31 @@ namespace spdlog
|
|||||||
|
|
||||||
ctime_s(time_str, sizeof(time_str), &time);
|
ctime_s(time_str, sizeof(time_str), &time);
|
||||||
|
|
||||||
sqlite3_stmt * query_stmt;
|
if (sqlite3_bind_text(_query_stmt, 1, time_str, -1, SQLITE_STATIC) != SQLITE_OK ||
|
||||||
|
sqlite3_bind_text(_query_stmt, 2, to_str(msg.level), -1, SQLITE_STATIC) != SQLITE_OK ||
|
||||||
if (sqlite3_prepare_v2(_database, "INSERT INTO Logs (TimeStamp,Level,Message,LoggerName,ThreadId) VALUES (?,?,?,?,?)", -1, &query_stmt, nullptr) != SQLITE_OK)
|
sqlite3_bind_text(_query_stmt, 3, msg.raw.c_str(), -1, nullptr) != SQLITE_OK ||
|
||||||
|
sqlite3_bind_text(_query_stmt, 4, msg.logger_name.c_str(), -1, SQLITE_STATIC) != SQLITE_OK ||
|
||||||
|
sqlite3_bind_int(_query_stmt, 5, msg.thread_id) != SQLITE_OK)
|
||||||
throw spdlog_ex(sqlite3_errmsg(_database));
|
throw spdlog_ex(sqlite3_errmsg(_database));
|
||||||
|
|
||||||
if (sqlite3_bind_text(query_stmt, 1, time_str, -1, SQLITE_STATIC) != SQLITE_OK ||
|
|
||||||
sqlite3_bind_text(query_stmt, 2, to_str(msg.level), -1, SQLITE_STATIC) != SQLITE_OK ||
|
|
||||||
sqlite3_bind_text(query_stmt, 3, msg.raw.c_str(), -1, nullptr) != SQLITE_OK ||
|
|
||||||
sqlite3_bind_text(query_stmt, 4, "'''''''''''", -1, SQLITE_STATIC) != SQLITE_OK ||
|
|
||||||
sqlite3_bind_int(query_stmt, 5, msg.thread_id) != SQLITE_OK)
|
|
||||||
throw spdlog_ex(sqlite3_errmsg(_database));
|
|
||||||
|
|
||||||
return query_stmt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void log(const details::log_msg& msg) override
|
void log(const details::log_msg& msg) override
|
||||||
{
|
{
|
||||||
auto query_stmt = prepare_query(msg);
|
bind_to_statement(msg);
|
||||||
|
|
||||||
if (sqlite3_step(query_stmt) != SQLITE_DONE)
|
if (sqlite3_step(_query_stmt) != SQLITE_DONE)
|
||||||
{
|
{
|
||||||
throw spdlog_ex(sqlite3_errmsg(_database));
|
throw spdlog_ex(sqlite3_errmsg(_database));
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_finalize(query_stmt);
|
sqlite3_reset(_query_stmt);
|
||||||
|
sqlite3_clear_bindings(_query_stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
sqlite3 *_database;
|
sqlite3 *_database;
|
||||||
|
|
||||||
|
sqlite3_stmt * _query_stmt;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user