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"/>