You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2023/04/27 06:57:57 UTC
[logging-log4cxx] 01/01: Prevent the discard of fractional timestamp seconds when the ODBCappender target is postgresSQL
This is an automated email from the ASF dual-hosted git repository.
swebb2066 pushed a commit to branch postgres_timestamp
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit 7ef548edeb722cc8b3fc66905be26d05dbe1de1c
Author: Stephen Webb <sw...@gmail.com>
AuthorDate: Thu Apr 27 16:57:30 2023 +1000
Prevent the discard of fractional timestamp seconds when the ODBCappender target is postgresSQL
---
src/main/cpp/odbcappender.cpp | 37 ++++++++++++++++++----
.../input/xml/odbcAppenderDSN-Log4cxxTest.xml | 8 ++---
2 files changed, 34 insertions(+), 11 deletions(-)
diff --git a/src/main/cpp/odbcappender.cpp b/src/main/cpp/odbcappender.cpp
index 79f647f9..b5202c6b 100644
--- a/src/main/cpp/odbcappender.cpp
+++ b/src/main/cpp/odbcappender.cpp
@@ -346,7 +346,29 @@ ODBCAppender::SQLHDBC ODBCAppender::getConnection(log4cxx::helpers::Pool& p)
throw ex;
}
-
+#if LOG4CXX_LOGCHAR_IS_WCHAR
+ SQLWCHAR *wUser = nullptr, *wPwd = nullptr;
+ if (!_priv->databaseUser.empty())
+ wUser = (SQLWCHAR*)_priv->databaseUser.c_str();
+ if (!_priv->databasePassword.empty())
+ wPwd = (SQLWCHAR*)_priv->databasePassword.c_str();
+ ret = SQLConnectW(_priv->connection
+ , (SQLWCHAR*)_priv->databaseURL.c_str(), SQL_NTS
+ , wUser, SQL_NTS
+ , wPwd, SQL_NTS
+ );
+#elif LOG4CXX_LOGCHAR_IS_UTF8
+ SQLCHAR *wUser = nullptr, *wPwd = nullptr;
+ if (!_priv->databaseUser.empty())
+ wUser = (SQLCHAR*)_priv->databaseUser.c_str();
+ if (!_priv->databasePassword.empty())
+ wPwd = (SQLCHAR*)_priv->databasePassword.c_str();
+ ret = SQLConnectA(_priv->connection
+ , (SQLCHAR*)_priv->databaseURL.c_str(), SQL_NTS
+ , wUser, SQL_NTS
+ , wPwd, SQL_NTS
+ );
+#else
SQLWCHAR* wURL, *wUser = nullptr, *wPwd = nullptr;
encode(&wURL, _priv->databaseURL, p);
if (!_priv->databaseUser.empty())
@@ -354,11 +376,12 @@ ODBCAppender::SQLHDBC ODBCAppender::getConnection(log4cxx::helpers::Pool& p)
if (!_priv->databasePassword.empty())
encode(&wPwd, _priv->databasePassword, p);
- ret = SQLConnectW( _priv->connection,
- wURL, SQL_NTS,
- wUser, SQL_NTS,
- wPwd, SQL_NTS);
-
+ ret = SQLConnectW( _priv->connection
+ , wURL, SQL_NTS
+ , wUser, SQL_NTS
+ , wPwd, SQL_NTS
+ );
+#endif
if (ret < 0)
{
@@ -472,7 +495,7 @@ void ODBCAppender::ODBCAppenderPriv::setPreparedStatement(SQLHDBC con, Pool& p)
|| SQL_DATETIME == targetType)
{
item.paramType = SQL_C_TYPE_TIMESTAMP;
- item.paramMaxCharCount = decimalDigits;
+ item.paramMaxCharCount = (0 <= decimalDigits) ? decimalDigits : 6;
item.paramValueSize = sizeof(SQL_TIMESTAMP_STRUCT);
item.paramValue = (SQLPOINTER)p.palloc(item.paramValueSize);
}
diff --git a/src/test/resources/input/xml/odbcAppenderDSN-Log4cxxTest.xml b/src/test/resources/input/xml/odbcAppenderDSN-Log4cxxTest.xml
index 781bd84e..c82c63ba 100644
--- a/src/test/resources/input/xml/odbcAppenderDSN-Log4cxxTest.xml
+++ b/src/test/resources/input/xml/odbcAppenderDSN-Log4cxxTest.xml
@@ -27,11 +27,13 @@
</appender>
<appender name="PatternAppender" class="ODBCAppender">
<param name="DSN" value="Log4cxxTest"/>
- <param name="sql" value="INSERT INTO [ApplicationLogs].[dbo].[UnitTestLog] ([Thread],[LogName],[LogTime],[LogLevel],[FileName],[FileLine],[Message]) VALUES ('%t','%c','%d{yyyy-MM-dd HH:mm:ss.SSSSSS}','%p','%f','%L','%m{'}')" />
+ <param name="sql" value="INSERT INTO UnitTestLog (Thread,LogName,LogTime,LogLevel,FileName,FileLine,Message) VALUES ('%t','%c','%d{yyyy-MM-dd HH:mm:ss.SSSSSS}','%p','%f','%L','%m{'}')" />
+ <!--param name="sql" value="INSERT INTO ApplicationLogs.dbo.UnitTestLog (Thread,LogName,LogTime,LogLevel,FileName,FileLine,Message) VALUES ('%t','%c','%d{yyyy-MM-dd HH:mm:ss.SSSSSS}','%p','%f','%L','%m{'}')" /-->
</appender>
<appender name="PreparedAppender" class="ODBCAppender">
<param name="DSN" value="Log4cxxTest"/>
- <param name="sql" value="INSERT INTO [ApplicationLogs].[dbo].[UnitTestLog] ([Thread],[LogName],[LogTime],[LogLevel],[FileName],[FileLine],[Message]) VALUES (?,?,?,?,?,?,?)" />
+ <param name="sql" value="INSERT INTO UnitTestLog (Thread,LogName,LogTime,LogLevel,FileName,FileLine,Message) VALUES (?,?,?,?,?,?,?)" />
+ <!--param name="sql" value="INSERT INTO ApplicationLogs.dbo.UnitTestLog (Thread,LogName,LogTime,LogLevel,FileName,FileLine,Message) VALUES (?,?,?,?,?,?,?)" /-->
<param name="ColumnMapping" value="thread"/>
<param name="ColumnMapping" value="logger"/>
<param name="ColumnMapping" value="time"/>
@@ -39,8 +41,6 @@
<param name="ColumnMapping" value="shortfilename"/>
<param name="ColumnMapping" value="line"/>
<param name="ColumnMapping" value="message"/>
- <!--param name="User" value="dbo"/-->
- <!--param name="Password" value="myLog4cxxTestPassword"/-->
</appender>
<appender name="ASYNC" class="AsyncAppender">
<param name="BufferSize" value="1000"/>