1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

C++20 fixes

This commit is contained in:
Leonid Fedorov
2022-02-01 15:54:05 +00:00
parent 0ee5203262
commit 65252df4f6
36 changed files with 22433 additions and 310 deletions

92
utils/loggingcpp/format.h Normal file
View File

@ -0,0 +1,92 @@
/*
Copyright (c) 2021 MariaDB Corporation
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
*/
#pragma once
#include <boost/any.hpp>
#include <cstdint>
#include <regex>
#include <stdexcept>
#include <string>
namespace logging
{
template <class T, class Iter>
void formatOne(std::string& errMsg, Iter iter, uint32_t position)
{
T arg = boost::any_cast<T>(*iter);
std::string token = std::string("%") + std::to_string(position) + std::string("%");
size_t index = 0;
while (true)
{
index = errMsg.find(token, index);
if (index == std::string::npos)
break;
if constexpr (std::is_same_v<T, std::string>)
{
errMsg.replace(index, token.length(), arg);
}
else
{
errMsg.replace(index, token.length(), std::to_string(arg));
}
index += token.length();
}
}
template <class T>
void formatMany(std::string& errMsg, const T& args)
{
auto iter = args.begin();
auto end = args.end();
uint32_t position = 1;
while (iter != end)
{
if (iter->type() == typeid(long))
{
formatOne<long>(errMsg, iter, position);
}
else if (iter->type() == typeid(uint64_t))
{
formatOne<uint64_t>(errMsg, iter, position);
}
else if (iter->type() == typeid(double))
{
formatOne<double>(errMsg, iter, position);
}
else if (iter->type() == typeid(std::string))
{
formatOne<std::string>(errMsg, iter, position);
}
else
{
throw std::logic_error("logggin::format: unexpected type in argslist");
}
++iter;
++position;
}
static std::regex restToken("%[0-9]%");
errMsg = std::regex_replace(errMsg, restToken, "");
}
} // namespace logging

View File

@ -29,7 +29,6 @@
#include <fstream>
using namespace std;
#include <boost/format.hpp>
#include <boost/tokenizer.hpp>
#include <boost/thread.hpp>
using namespace boost;
@ -43,6 +42,8 @@ using namespace config;
#include "installdir.h"
#include "format.h"
namespace logging
{
IDBErrorInfo* IDBErrorInfo::fInstance = 0;
@ -156,43 +157,7 @@ string IDBErrorInfo::logError(const logging::LOG_TYPE logLevel, const logging::L
void IDBErrorInfo::format(string& errMsg, const Message::Args& args)
{
Message::Args::AnyVec::const_iterator iter = args.args().begin();
Message::Args::AnyVec::const_iterator end = args.args().end();
boost::format fmt(errMsg);
fmt.exceptions(boost::io::no_error_bits);
while (iter != end)
{
if (iter->type() == typeid(long))
{
long l = any_cast<long>(*iter);
fmt % l;
}
else if (iter->type() == typeid(uint64_t))
{
uint64_t u64 = any_cast<uint64_t>(*iter);
fmt % u64;
}
else if (iter->type() == typeid(double))
{
double d = any_cast<double>(*iter);
fmt % d;
}
else if (iter->type() == typeid(string))
{
string s = any_cast<string>(*iter);
fmt % s;
}
else
{
throw logic_error("IDBErrorInfo::format: unexpected type in argslist");
}
++iter;
}
errMsg = fmt.str();
formatMany(errMsg, args.args());
}
/* static */

View File

@ -29,7 +29,7 @@
#include <fstream>
using namespace std;
#include <boost/format.hpp>
#include <boost/tokenizer.hpp>
#include <boost/thread.hpp>
using namespace boost;
@ -41,6 +41,7 @@ using namespace config;
#include "installdir.h"
#include "format.h"
namespace
{
boost::mutex mx;
@ -143,43 +144,7 @@ void Message::Args::reset()
void Message::format(const Args& args)
{
Args::AnyVec::const_iterator iter = args.args().begin();
Args::AnyVec::const_iterator end = args.args().end();
boost::format fmt(fMsg);
fmt.exceptions(boost::io::no_error_bits);
while (iter != end)
{
if (iter->type() == typeid(long))
{
long l = any_cast<long>(*iter);
fmt % l;
}
else if (iter->type() == typeid(uint64_t))
{
uint64_t u64 = any_cast<uint64_t>(*iter);
fmt % u64;
}
else if (iter->type() == typeid(double))
{
double d = any_cast<double>(*iter);
fmt % d;
}
else if (iter->type() == typeid(string))
{
string s = any_cast<string>(*iter);
fmt % s;
}
else
{
throw logic_error("Message::format: unexpected type in argslist");
}
++iter;
}
fMsg = fmt.str();
formatMany(fMsg, args.args());
}
/* static */