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.
