Commit 571e85d0 authored by PedroRod's avatar PedroRod

changed ctrs,variables,argsguments to match code style of spdlog, also removed…

changed ctrs,variables,argsguments to match code style of spdlog, also removed columns mapping since there is no clean way of set column name dynamically on a prepared statement and changed query to use prepared statements
parent a7011baa
#pragma once #pragma once
#include <spdlog\sinks\sink.h> #include "spdlog\sinks\sink.h"
#include <spdlog/details/log_msg.h> #include "spdlog/details/log_msg.h"
#include <spdlog/common.h> #include "spdlog/common.h"
#include <vector>
#include <sqlite3.h> #include <sqlite3.h>
struct Column namespace spdlog
{ {
enum TableColumn namespace sinks
{ {
TimeStamp, class database_logger_sink :
Level, public sink
Message,
LoggerName,
ThreadId
};
Column(std::string columnName, TableColumn columnMap)
{ {
ColumnName = columnName; public:
ColumnMap = columnMap;
}
std::string ColumnName;
TableColumn ColumnMap;
std::string Value;
};
struct database_schema
{
std::string TableName;
std::vector<Column> Columns;
database_schema(const std::string& tableName, const std::vector<Column>& columns) explicit database_logger_sink(const std::string& databaseName)
{ {
TableName = tableName; if (sqlite3_open(databaseName.c_str(), &_database))
Columns = columns; throw spdlog_ex("Error opening database");
} }
database_schema() ~database_logger_sink()
{
TableName = "Logs";
Columns =
{ {
Column("TimeStamp", Column::TimeStamp), sqlite3_close(_database);
Column("Level", Column::Level),
Column("Message", Column::Message),
Column("LoggerName", Column::LoggerName),
Column("ThreadId", Column::ThreadId)
};
} }
};
namespace spdlog
{
namespace sinks
{
class database_logger_sink :
public sink
{
public:
void flush() override void flush() override
{ {
sqlite3_close(_database); sqlite3_close(_database);
} }
void log(const details::log_msg& msg) override sqlite3_stmt * prepare_query(const details::log_msg& msg) const
{
for (auto& column : _schema.Columns)
{
switch (column.ColumnMap)
{
case Column::TimeStamp:
{ {
auto time = std::chrono::system_clock::to_time_t(msg.time); auto time = std::chrono::system_clock::to_time_t(msg.time);
char str[26];
ctime_s(str, sizeof(str), &time);
column.Value = str;
break;
}
case Column::Level: char time_str[26];
{
column.Value = level::to_str(msg.level);
break;
}
case Column::Message:
{
column.Value = msg.raw.str();
break;
}
case Column::LoggerName:
{
column.Value = msg.logger_name;
break;
}
case Column::ThreadId:
{
column.Value = std::to_string(msg.thread_id);
break;
}
}
}
auto query = fmt::format("INSERT INTO {0} ({1},{3},{5},{7},{9}) VALUES ('{2}','{4}','{6}','{8}',{10})", ctime_s(time_str, sizeof(time_str), &time);
_schema.TableName,
_schema.Columns[0].ColumnName,
_schema.Columns[0].Value,
_schema.Columns[1].ColumnName,
_schema.Columns[1].Value,
_schema.Columns[2].ColumnName,
_schema.Columns[2].Value,
_schema.Columns[3].ColumnName,
_schema.Columns[3].Value,
_schema.Columns[4].ColumnName,
_schema.Columns[4].Value);
char *errorMessage = nullptr; sqlite3_stmt * query_stmt;
if (sqlite3_exec(_database, query.c_str(), nullptr, nullptr, &errorMessage) != SQLITE_OK) 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));
throw spdlog_ex(errorMessage);
}
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;
} }
explicit database_logger_sink(const std::string& databaseName) void log(const details::log_msg& msg) override
{ {
if (sqlite3_open(databaseName.c_str(), &_database)) auto query_stmt = prepare_query(msg);
throw spdlog_ex("Error opening database");
}
explicit database_logger_sink(const std::string& databaseName, const database_schema& databaseSchema) if (sqlite3_step(query_stmt) != SQLITE_DONE)
{ {
_schema = databaseSchema; throw spdlog_ex(sqlite3_errmsg(_database));
if (sqlite3_open(databaseName.c_str(), &_database))
throw spdlog_ex("Error opening database");
} }
~database_logger_sink() sqlite3_finalize(query_stmt);
{
sqlite3_close(_database);
} }
private: private:
database_schema _schema;
sqlite3 *_database; sqlite3 *_database;
}; };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment