This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/master by this push:
     new ac18368a Drop NTEventLogAppender and ODBCAppender support when 
logchar=unichar (#713)
ac18368a is described below

commit ac18368a1888e4fdd8998e34be43289f13657e27
Author: Stephen Webb <[email protected]>
AuthorDate: Tue Jun 9 12:59:18 2026 +1000

    Drop NTEventLogAppender and ODBCAppender support when logchar=unichar (#713)
---
 src/main/cpp/nteventlogappender.cpp            | 21 ++++++--
 src/main/cpp/odbcappender.cpp                  | 75 +++++---------------------
 src/main/cpp/transcoder.cpp                    |  3 +-
 src/main/include/log4cxx/db/odbcappender.h     |  6 ---
 src/main/include/log4cxx/helpers/transcoder.h  |  3 +-
 src/test/cpp/nt/nteventlogappendertestcase.cpp |  4 +-
 6 files changed, 37 insertions(+), 75 deletions(-)

diff --git a/src/main/cpp/nteventlogappender.cpp 
b/src/main/cpp/nteventlogappender.cpp
index fec9447a..33ca9680 100644
--- a/src/main/cpp/nteventlogappender.cpp
+++ b/src/main/cpp/nteventlogappender.cpp
@@ -19,6 +19,7 @@
 #include <windows.h>
 #include <Heapapi.h>
 #include <log4cxx/nt/nteventlogappender.h>
+#if !LOG4CXX_LOGCHAR_IS_UNICHAR
 #include <log4cxx/spi/loggingevent.h>
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/level.h>
@@ -222,9 +223,9 @@ void NTEventLogAppender::append( 
LOG4CXX_APPEND_FORMAL_PARAMETERS )
        }
 
        LogString oss;
-       Pool tempPool;
        this->m_priv->layout->format(oss, event);
-       wchar_t* msgs = Transcoder::wencode(oss, tempPool);
+       auto msgs = oss.c_str();
+#if LOG4CXX_LOGCHAR_IS_WCHAR
        BOOL bSuccess = ::ReportEventW(
                        priv->hEventLog,
                        getEventType(event),
@@ -235,7 +236,20 @@ void NTEventLogAppender::append( 
LOG4CXX_APPEND_FORMAL_PARAMETERS )
                        0,
                        (LPCWSTR*) &msgs,
                        NULL);
-
+#elif LOG4CXX_LOGCHAR_IS_UTF8
+       BOOL bSuccess = ::ReportEventA(
+                       priv->hEventLog,
+                       getEventType(event),
+                       getEventCategory(event),
+                       0x1000,
+                       priv->pCurrentUserSID,
+                       1,
+                       0,
+                       (LPCSTR*)&msgs,
+                       NULL);
+#else
+       #error NTEventLogAppender is not supported when logchar is unichar
+#endif
        if (!bSuccess)
        {
                LogLog::error(getErrorString(LOG4CXX_STR("ReportEvent")));
@@ -400,5 +414,6 @@ const LogString& NTEventLogAppender::getServer() const
 {
        return priv->server;
 }
+#endif // !LOG4CXX_LOGCHAR_IS_UNICHAR
 
 #endif // WIN32
diff --git a/src/main/cpp/odbcappender.cpp b/src/main/cpp/odbcappender.cpp
index b9e9650d..22fd07cc 100644
--- a/src/main/cpp/odbcappender.cpp
+++ b/src/main/cpp/odbcappender.cpp
@@ -43,7 +43,7 @@
        #define LOG4CXX 1
 #endif
 #include <log4cxx/private/log4cxx_private.h>
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
        #if defined(WIN32) || defined(_WIN32)
                #include <windows.h>
        #endif
@@ -88,7 +88,7 @@ const char* SQLException::formatMessage(short fHandleType,
 {
        std::string strReturn(prolog);
        strReturn.append(" - ");
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
        SQLCHAR       SqlState[6];
        SQLCHAR       Msg[SQL_MAX_MESSAGE_LENGTH];
        SQLINTEGER    NativeError;
@@ -220,7 +220,7 @@ bool ODBCAppender::requiresLayout() const
 
 void ODBCAppender::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS 
)
 {
-#if !LOG4CXX_HAVE_ODBC
+#if !LOG4CXX_HAVE_ODBC || LOG4CXX_LOGCHAR_IS_UNICHAR
        LogLog::error(LOG4CXX_STR("Can not activate ODBCAppender unless 
compiled with ODBC support."));
 #else
        if (_priv->mappedName.empty())
@@ -262,7 +262,7 @@ void ODBCAppender::activateOptions( 
LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
 
 void ODBCAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
        _priv->buffer.push_back(event);
 
        if (_priv->buffer.size() >= _priv->bufferSize)
@@ -292,7 +292,7 @@ void ODBCAppender::closeConnection(ODBCAppender::SQLHDBC /* 
con */)
 
 ODBCAppender::SQLHDBC ODBCAppender::getConnection(LOG4CXX_NS::helpers::Pool& p)
 {
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
        SQLRETURN ret;
 
        if (_priv->env == SQL_NULL_HENV)
@@ -351,18 +351,7 @@ ODBCAppender::SQLHDBC 
ODBCAppender::getConnection(LOG4CXX_NS::helpers::Pool& p)
                        , wPwd, SQL_NTS
                        );
 #else
-               SQLWCHAR* wURL, *wUser = nullptr, *wPwd = nullptr;
-               encode(&wURL, _priv->databaseURL, p);
-               if (!_priv->databaseUser.empty())
-                       encode(&wUser, _priv->databaseUser, p);
-               if (!_priv->databasePassword.empty())
-                       encode(&wPwd, _priv->databasePassword, p);
-
-               ret = SQLConnectW( _priv->connection
-                       , wURL, SQL_NTS
-                       , wUser, SQL_NTS
-                       , wPwd, SQL_NTS
-                       );
+       #error ODBCAppender is not supported when logchar is unichar
 #endif
 
                if (ret < 0)
@@ -384,7 +373,7 @@ void ODBCAppender::close()
 {
        if (_priv->setClosed())
        {
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
                if (!_priv->buffer.empty() && 0 == _priv->preparedStatement)
                {
                        Pool p;
@@ -408,7 +397,7 @@ void ODBCAppender::ODBCAppenderPriv::close()
                        e, ErrorCode::GENERIC_FAILURE);
        }
 
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
 
        if (this->connection != SQL_NULL_HDBC)
        {
@@ -424,7 +413,7 @@ void ODBCAppender::ODBCAppenderPriv::close()
 #endif
 }
 
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
 void ODBCAppender::ODBCAppenderPriv::setPreparedStatement(SQLHDBC con, Pool& p)
 {
        auto ret = SQLAllocHandle( SQL_HANDLE_STMT, con, 
&this->preparedStatement);
@@ -438,9 +427,7 @@ void 
ODBCAppender::ODBCAppenderPriv::setPreparedStatement(SQLHDBC con, Pool& p)
 #elif LOG4CXX_LOGCHAR_IS_UTF8
        ret = SQLPrepareA(this->preparedStatement, 
(SQLCHAR*)this->sqlStatement.c_str(), SQL_NTS);
 #else
-       SQLWCHAR* wsql;
-       encode(&wsql, this->sqlStatement, p);
-       ret = SQLPrepareW(this->preparedStatement, wsql, SQL_NTS);
+       #error ODBCAppender is not supported when logchar is unichar
 #endif
        if (ret < 0)
        {
@@ -627,7 +614,7 @@ void 
ODBCAppender::ODBCAppenderPriv::setParameterValues(const spi::LoggingEventP
 
 void ODBCAppender::flushBuffer(Pool& p)
 {
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
        if (0 == _priv->preparedStatement)
                _priv->setPreparedStatement(getConnection(p), p);
        _priv->flushBuffer(p);
@@ -642,7 +629,7 @@ void ODBCAppender::ODBCAppenderPriv::flushBuffer(Pool& p)
        {
                if (this->parameterValue.empty())
                        this->errorHandler->error(LOG4CXX_STR("ODBCAppender 
column mappings not defined"));
-#if LOG4CXX_HAVE_ODBC
+#if LOG4CXX_HAVE_ODBC && !LOG4CXX_LOGCHAR_IS_UNICHAR
                else try
                {
                        this->setParameterValues(logEvent, p);
@@ -691,44 +678,6 @@ void ODBCAppender::setSql(const LogString& s)
     _priv->sqlStatement = s;
 }
 
-#if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR || defined(WIN32) || 
defined(_WIN32)
-void ODBCAppender::encode(wchar_t** dest, const LogString& src, Pool& p)
-{
-       *dest = Transcoder::wencode(src, p);
-}
-#endif
-
-void ODBCAppender::encode(unsigned short** dest,
-       const LogString& src, Pool& p)
-{
-       //  worst case double number of characters from UTF-8 or wchar_t
-       *dest = (unsigned short*)
-               p.palloc((src.size() + 1) * 2 * sizeof(unsigned short));
-       unsigned short* current = *dest;
-
-       for (LogString::const_iterator i = src.begin();
-               i != src.end();)
-       {
-               unsigned int sv = Transcoder::decode(src, i);
-
-               if (sv < 0x10000)
-               {
-                       *current++ = (unsigned short) sv;
-               }
-               else
-               {
-                       unsigned char u = (unsigned char) (sv >> 16);
-                       unsigned char w = (unsigned char) (u - 1);
-                       unsigned short hs = (0xD800 + ((w & 0xF) << 6) + ((sv & 
0xFFFF) >> 10));
-                       unsigned short ls = (0xDC00 + (sv & 0x3FF));
-                       *current++ = (unsigned short) hs;
-                       *current++ = (unsigned short) ls;
-               }
-       }
-
-       *current = 0;
-}
-
 const LogString& ODBCAppender::getSql() const
 {
        return _priv->sqlStatement;
diff --git a/src/main/cpp/transcoder.cpp b/src/main/cpp/transcoder.cpp
index 870ff436..12a0c568 100644
--- a/src/main/cpp/transcoder.cpp
+++ b/src/main/cpp/transcoder.cpp
@@ -461,6 +461,7 @@ void Transcoder::encode(const LogString& src, std::wstring& 
dst)
 #endif
 }
 
+#if LOG4CXX_ABI_VERSION <= 15
 wchar_t* Transcoder::wencode(const LogString& src, Pool& p)
 {
 #if LOG4CXX_LOGCHAR_IS_WCHAR
@@ -474,7 +475,7 @@ wchar_t* Transcoder::wencode(const LogString& src, Pool& p)
        std::memcpy(dst, tmp.data(), tmp.length() * sizeof(wchar_t));
        return dst;
 }
-
+#endif
 
 unsigned int Transcoder::decode(const std::wstring& in,
        std::wstring::const_iterator& iter)
diff --git a/src/main/include/log4cxx/db/odbcappender.h 
b/src/main/include/log4cxx/db/odbcappender.h
index c09fb36b..bbcfb8c7 100644
--- a/src/main/include/log4cxx/db/odbcappender.h
+++ b/src/main/include/log4cxx/db/odbcappender.h
@@ -268,12 +268,6 @@ class LOG4CXX_EXPORT ODBCAppender : public AppenderSkeleton
        private:
                ODBCAppender(const ODBCAppender&);
                ODBCAppender& operator=(const ODBCAppender&);
-#if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR || defined(WIN32) || 
defined(_WIN32)
-               static void encode(wchar_t** dest, const LogString& src,
-                       LOG4CXX_NS::helpers::Pool& p);
-#endif
-               static void encode(unsigned short** dest, const LogString& src,
-                       LOG4CXX_NS::helpers::Pool& p);
 
        protected:
                struct ODBCAppenderPriv;
diff --git a/src/main/include/log4cxx/helpers/transcoder.h 
b/src/main/include/log4cxx/helpers/transcoder.h
index e91a09d6..68cf8388 100644
--- a/src/main/include/log4cxx/helpers/transcoder.h
+++ b/src/main/include/log4cxx/helpers/transcoder.h
@@ -116,9 +116,10 @@ class LOG4CXX_EXPORT Transcoder
                 *    Append the equivalent of \c src onto \c dst.
                 */
                static void encode(const LogString& src, std::wstring& dst);
+#if LOG4CXX_ABI_VERSION <= 15
                /// A null-terminated equivalent of \c src.
                static wchar_t* wencode(const LogString& src, 
LOG4CXX_NS::helpers::Pool& p);
-
+#endif
                /**
                 *   Increment \c iter past the next code point in \c str.
                 *   @pre \c iter is a valid, dereferenceable iterator.
diff --git a/src/test/cpp/nt/nteventlogappendertestcase.cpp 
b/src/test/cpp/nt/nteventlogappendertestcase.cpp
index d9e5fcb1..2e542e58 100644
--- a/src/test/cpp/nt/nteventlogappendertestcase.cpp
+++ b/src/test/cpp/nt/nteventlogappendertestcase.cpp
@@ -17,6 +17,7 @@
 
 #if defined(_WIN32) && !defined(_WIN32_WCE)
 #include <log4cxx/nt/nteventlogappender.h>
+#if !LOG4CXX_LOGCHAR_IS_UNICHAR
 #include "../appenderskeletontestcase.h"
 #include "windows.h"
 #include <log4cxx/logger.h>
@@ -109,4 +110,5 @@ class NTEventLogAppenderTestCase : public 
AppenderSkeletonTestCase
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(NTEventLogAppenderTestCase);
-#endif
+#endif // !LOG4CXX_LOGCHAR_IS_UNICHAR
+#endif // defined(WIN32) && !defined(_WIN32_WCE)

Reply via email to