Skip to content

Commit ac18368

Browse files
authored
Drop NTEventLogAppender and ODBCAppender support when logchar=unichar (#713)
1 parent 0046ba5 commit ac18368

6 files changed

Lines changed: 37 additions & 75 deletions

File tree

src/main/cpp/nteventlogappender.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <windows.h>
2020
#include <Heapapi.h>
2121
#include <log4cxx/nt/nteventlogappender.h>
22+
#if !LOG4CXX_LOGCHAR_IS_UNICHAR
2223
#include <log4cxx/spi/loggingevent.h>
2324
#include <log4cxx/helpers/loglog.h>
2425
#include <log4cxx/level.h>
@@ -222,9 +223,9 @@ void NTEventLogAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
222223
}
223224

224225
LogString oss;
225-
Pool tempPool;
226226
this->m_priv->layout->format(oss, event);
227-
wchar_t* msgs = Transcoder::wencode(oss, tempPool);
227+
auto msgs = oss.c_str();
228+
#if LOG4CXX_LOGCHAR_IS_WCHAR
228229
BOOL bSuccess = ::ReportEventW(
229230
priv->hEventLog,
230231
getEventType(event),
@@ -235,7 +236,20 @@ void NTEventLogAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
235236
0,
236237
(LPCWSTR*) &msgs,
237238
NULL);
238-
239+
#elif LOG4CXX_LOGCHAR_IS_UTF8
240+
BOOL bSuccess = ::ReportEventA(
241+
priv->hEventLog,
242+
getEventType(event),
243+
getEventCategory(event),
244+
0x1000,
245+
priv->pCurrentUserSID,
246+
1,
247+
0,
248+
(LPCSTR*)&msgs,
249+
NULL);
250+
#else
251+
#error NTEventLogAppender is not supported when logchar is unichar
252+
#endif
239253
if (!bSuccess)
240254
{
241255
LogLog::error(getErrorString(LOG4CXX_STR("ReportEvent")));
@@ -400,5 +414,6 @@ const LogString& NTEventLogAppender::getServer() const
400414
{
401415
return priv->server;
402416
}
417+
#endif // !LOG4CXX_LOGCHAR_IS_UNICHAR
403418

404419
#endif // WIN32

src/main/cpp/odbcappender.cpp

Lines changed: 12 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
#define LOG4CXX 1
4444
#endif
4545
#include <log4cxx/private/log4cxx_private.h>
46-
#if LOG4CXX_HAVE_ODBC
46+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
4747
#if defined(WIN32) || defined(_WIN32)
4848
#include <windows.h>
4949
#endif
@@ -88,7 +88,7 @@ const char* SQLException::formatMessage(short fHandleType,
8888
{
8989
std::string strReturn(prolog);
9090
strReturn.append(" - ");
91-
#if LOG4CXX_HAVE_ODBC
91+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
9292
SQLCHAR SqlState[6];
9393
SQLCHAR Msg[SQL_MAX_MESSAGE_LENGTH];
9494
SQLINTEGER NativeError;
@@ -220,7 +220,7 @@ bool ODBCAppender::requiresLayout() const
220220

221221
void ODBCAppender::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
222222
{
223-
#if !LOG4CXX_HAVE_ODBC
223+
#if !LOG4CXX_HAVE_ODBC || LOG4CXX_LOGCHAR_IS_UNICHAR
224224
LogLog::error(LOG4CXX_STR("Can not activate ODBCAppender unless compiled with ODBC support."));
225225
#else
226226
if (_priv->mappedName.empty())
@@ -262,7 +262,7 @@ void ODBCAppender::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
262262

263263
void ODBCAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
264264
{
265-
#if LOG4CXX_HAVE_ODBC
265+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
266266
_priv->buffer.push_back(event);
267267

268268
if (_priv->buffer.size() >= _priv->bufferSize)
@@ -292,7 +292,7 @@ void ODBCAppender::closeConnection(ODBCAppender::SQLHDBC /* con */)
292292

293293
ODBCAppender::SQLHDBC ODBCAppender::getConnection(LOG4CXX_NS::helpers::Pool& p)
294294
{
295-
#if LOG4CXX_HAVE_ODBC
295+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
296296
SQLRETURN ret;
297297

298298
if (_priv->env == SQL_NULL_HENV)
@@ -351,18 +351,7 @@ ODBCAppender::SQLHDBC ODBCAppender::getConnection(LOG4CXX_NS::helpers::Pool& p)
351351
, wPwd, SQL_NTS
352352
);
353353
#else
354-
SQLWCHAR* wURL, *wUser = nullptr, *wPwd = nullptr;
355-
encode(&wURL, _priv->databaseURL, p);
356-
if (!_priv->databaseUser.empty())
357-
encode(&wUser, _priv->databaseUser, p);
358-
if (!_priv->databasePassword.empty())
359-
encode(&wPwd, _priv->databasePassword, p);
360-
361-
ret = SQLConnectW( _priv->connection
362-
, wURL, SQL_NTS
363-
, wUser, SQL_NTS
364-
, wPwd, SQL_NTS
365-
);
354+
#error ODBCAppender is not supported when logchar is unichar
366355
#endif
367356

368357
if (ret < 0)
@@ -384,7 +373,7 @@ void ODBCAppender::close()
384373
{
385374
if (_priv->setClosed())
386375
{
387-
#if LOG4CXX_HAVE_ODBC
376+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
388377
if (!_priv->buffer.empty() && 0 == _priv->preparedStatement)
389378
{
390379
Pool p;
@@ -408,7 +397,7 @@ void ODBCAppender::ODBCAppenderPriv::close()
408397
e, ErrorCode::GENERIC_FAILURE);
409398
}
410399

411-
#if LOG4CXX_HAVE_ODBC
400+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
412401

413402
if (this->connection != SQL_NULL_HDBC)
414403
{
@@ -424,7 +413,7 @@ void ODBCAppender::ODBCAppenderPriv::close()
424413
#endif
425414
}
426415

427-
#if LOG4CXX_HAVE_ODBC
416+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
428417
void ODBCAppender::ODBCAppenderPriv::setPreparedStatement(SQLHDBC con, Pool& p)
429418
{
430419
auto ret = SQLAllocHandle( SQL_HANDLE_STMT, con, &this->preparedStatement);
@@ -438,9 +427,7 @@ void ODBCAppender::ODBCAppenderPriv::setPreparedStatement(SQLHDBC con, Pool& p)
438427
#elif LOG4CXX_LOGCHAR_IS_UTF8
439428
ret = SQLPrepareA(this->preparedStatement, (SQLCHAR*)this->sqlStatement.c_str(), SQL_NTS);
440429
#else
441-
SQLWCHAR* wsql;
442-
encode(&wsql, this->sqlStatement, p);
443-
ret = SQLPrepareW(this->preparedStatement, wsql, SQL_NTS);
430+
#error ODBCAppender is not supported when logchar is unichar
444431
#endif
445432
if (ret < 0)
446433
{
@@ -627,7 +614,7 @@ void ODBCAppender::ODBCAppenderPriv::setParameterValues(const spi::LoggingEventP
627614

628615
void ODBCAppender::flushBuffer(Pool& p)
629616
{
630-
#if LOG4CXX_HAVE_ODBC
617+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
631618
if (0 == _priv->preparedStatement)
632619
_priv->setPreparedStatement(getConnection(p), p);
633620
_priv->flushBuffer(p);
@@ -642,7 +629,7 @@ void ODBCAppender::ODBCAppenderPriv::flushBuffer(Pool& p)
642629
{
643630
if (this->parameterValue.empty())
644631
this->errorHandler->error(LOG4CXX_STR("ODBCAppender column mappings not defined"));
645-
#if LOG4CXX_HAVE_ODBC
632+
#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
646633
else try
647634
{
648635
this->setParameterValues(logEvent, p);
@@ -691,44 +678,6 @@ void ODBCAppender::setSql(const LogString& s)
691678
_priv->sqlStatement = s;
692679
}
693680

694-
#if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR || defined(WIN32) || defined(_WIN32)
695-
void ODBCAppender::encode(wchar_t** dest, const LogString& src, Pool& p)
696-
{
697-
*dest = Transcoder::wencode(src, p);
698-
}
699-
#endif
700-
701-
void ODBCAppender::encode(unsigned short** dest,
702-
const LogString& src, Pool& p)
703-
{
704-
// worst case double number of characters from UTF-8 or wchar_t
705-
*dest = (unsigned short*)
706-
p.palloc((src.size() + 1) * 2 * sizeof(unsigned short));
707-
unsigned short* current = *dest;
708-
709-
for (LogString::const_iterator i = src.begin();
710-
i != src.end();)
711-
{
712-
unsigned int sv = Transcoder::decode(src, i);
713-
714-
if (sv < 0x10000)
715-
{
716-
*current++ = (unsigned short) sv;
717-
}
718-
else
719-
{
720-
unsigned char u = (unsigned char) (sv >> 16);
721-
unsigned char w = (unsigned char) (u - 1);
722-
unsigned short hs = (0xD800 + ((w & 0xF) << 6) + ((sv & 0xFFFF) >> 10));
723-
unsigned short ls = (0xDC00 + (sv & 0x3FF));
724-
*current++ = (unsigned short) hs;
725-
*current++ = (unsigned short) ls;
726-
}
727-
}
728-
729-
*current = 0;
730-
}
731-
732681
const LogString& ODBCAppender::getSql() const
733682
{
734683
return _priv->sqlStatement;

src/main/cpp/transcoder.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ void Transcoder::encode(const LogString& src, std::wstring& dst)
461461
#endif
462462
}
463463

464+
#if LOG4CXX_ABI_VERSION <= 15
464465
wchar_t* Transcoder::wencode(const LogString& src, Pool& p)
465466
{
466467
#if LOG4CXX_LOGCHAR_IS_WCHAR
@@ -474,7 +475,7 @@ wchar_t* Transcoder::wencode(const LogString& src, Pool& p)
474475
std::memcpy(dst, tmp.data(), tmp.length() * sizeof(wchar_t));
475476
return dst;
476477
}
477-
478+
#endif
478479

479480
unsigned int Transcoder::decode(const std::wstring& in,
480481
std::wstring::const_iterator& iter)

src/main/include/log4cxx/db/odbcappender.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,6 @@ class LOG4CXX_EXPORT ODBCAppender : public AppenderSkeleton
268268
private:
269269
ODBCAppender(const ODBCAppender&);
270270
ODBCAppender& operator=(const ODBCAppender&);
271-
#if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR || defined(WIN32) || defined(_WIN32)
272-
static void encode(wchar_t** dest, const LogString& src,
273-
LOG4CXX_NS::helpers::Pool& p);
274-
#endif
275-
static void encode(unsigned short** dest, const LogString& src,
276-
LOG4CXX_NS::helpers::Pool& p);
277271

278272
protected:
279273
struct ODBCAppenderPriv;

src/main/include/log4cxx/helpers/transcoder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,10 @@ class LOG4CXX_EXPORT Transcoder
116116
* Append the equivalent of \c src onto \c dst.
117117
*/
118118
static void encode(const LogString& src, std::wstring& dst);
119+
#if LOG4CXX_ABI_VERSION <= 15
119120
/// A null-terminated equivalent of \c src.
120121
static wchar_t* wencode(const LogString& src, LOG4CXX_NS::helpers::Pool& p);
121-
122+
#endif
122123
/**
123124
* Increment \c iter past the next code point in \c str.
124125
* @pre \c iter is a valid, dereferenceable iterator.

src/test/cpp/nt/nteventlogappendertestcase.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#if defined(_WIN32) && !defined(_WIN32_WCE)
1919
#include <log4cxx/nt/nteventlogappender.h>
20+
#if !LOG4CXX_LOGCHAR_IS_UNICHAR
2021
#include "../appenderskeletontestcase.h"
2122
#include "windows.h"
2223
#include <log4cxx/logger.h>
@@ -109,4 +110,5 @@ class NTEventLogAppenderTestCase : public AppenderSkeletonTestCase
109110
};
110111

111112
LOGUNIT_TEST_SUITE_REGISTRATION(NTEventLogAppenderTestCase);
112-
#endif
113+
#endif // !LOG4CXX_LOGCHAR_IS_UNICHAR
114+
#endif // defined(WIN32) && !defined(_WIN32_WCE)

0 commit comments

Comments
 (0)