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

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

commit 460a1146edf3777389e5fe85372a95c264fb05b3
Author: Stephen Webb <[email protected]>
AuthorDate: Sun Jun 7 13:30:16 2026 +1000

    Drop NTEventLogAppender and ODBCAppender support when logchar=unichar
---
 src/main/cpp/nteventlogappender.cpp           | 19 +++++++--
 src/main/cpp/odbcappender.cpp                 | 55 +--------------------------
 src/main/cpp/transcoder.cpp                   |  3 +-
 src/main/include/log4cxx/db/odbcappender.h    |  6 ---
 src/main/include/log4cxx/helpers/transcoder.h |  3 +-
 5 files changed, 22 insertions(+), 64 deletions(-)

diff --git a/src/main/cpp/nteventlogappender.cpp 
b/src/main/cpp/nteventlogappender.cpp
index fec9447a..672a4a0a 100644
--- a/src/main/cpp/nteventlogappender.cpp
+++ b/src/main/cpp/nteventlogappender.cpp
@@ -222,9 +222,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 +235,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")));
diff --git a/src/main/cpp/odbcappender.cpp b/src/main/cpp/odbcappender.cpp
index b9e9650d..10fbe683 100644
--- a/src/main/cpp/odbcappender.cpp
+++ b/src/main/cpp/odbcappender.cpp
@@ -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)
@@ -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)
        {
@@ -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.

Reply via email to