]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11085 Prettify SQL TRACE logs
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 26 Jul 2018 14:10:57 +0000 (16:10 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 2 Aug 2018 18:21:33 +0000 (20:21 +0200)
server/sonar-db-core/src/main/java/org/sonar/db/profiling/ProfilingPreparedStatementHandler.java
server/sonar-db-core/src/main/java/org/sonar/db/profiling/ProfilingStatementHandler.java
server/sonar-db-core/src/main/java/org/sonar/db/profiling/SqlLogFormatter.java
server/sonar-db-core/src/test/java/org/sonar/db/profiling/SqlLogFormatterTest.java

index 51e3372f5b7fb629fa6ab186036f682985e49e5d..ad46941053eece61ba6183f271c5541db0ca63ec 100644 (file)
@@ -44,9 +44,9 @@ class ProfilingPreparedStatementHandler implements InvocationHandler {
       try {
         result = InvocationUtils.invokeQuietly(statement, method, args);
       } finally {
-        profiler.addContext("sql", SqlLogFormatter.formatSql(sql));
+        profiler.addContext("sql", SqlLogFormatter.reformatSql(sql));
         if (sqlParams.length > 0) {
-          profiler.addContext("params", SqlLogFormatter.formatParams(sqlParams));
+          profiler.addContext("params", SqlLogFormatter.reformatParams(sqlParams));
         }
         profiler.stopTrace("");
       }
index 1e2d022a5566540ea1badf2f27046c03d23f6046..c8ac868877640035c1bae408e6eb422e8dbe8193 100644 (file)
@@ -41,7 +41,7 @@ class ProfilingStatementHandler implements InvocationHandler {
         result = InvocationUtils.invokeQuietly(statement, method, args);
       } finally {
         String sql = (String) args[0];
-        profiler.addContext("sql", SqlLogFormatter.formatSql(sql));
+        profiler.addContext("sql", SqlLogFormatter.reformatSql(sql));
         profiler.stopTrace("");
       }
       return result;
index d1c6bd357718dd8c6b9f829912b1d145deab034b..5563b09103098c4b7aff4d4448bbd0160221d9e9 100644 (file)
@@ -21,7 +21,6 @@ package org.sonar.db.profiling;
 
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
-import org.apache.commons.lang.StringUtils;
 
 import static org.apache.commons.lang.StringUtils.abbreviate;
 
@@ -35,11 +34,24 @@ public class SqlLogFormatter {
     // only statics
   }
 
-  public static String formatSql(String sql) {
-    return StringUtils.replaceChars(sql, '\n', ' ');
+  public static String reformatSql(String sql) {
+    char[] chars = sql.toCharArray();
+    StringBuilder result = new StringBuilder(chars.length);
+
+    for (int i = 0; i < chars.length; i++) {
+      char c = chars[i];
+      if (c == '\n' || c == '\t') {
+        c = ' ';
+      }
+      if (Character.isWhitespace(c) && i > 0 && Character.isWhitespace(chars[i - 1])) {
+        continue;
+      }
+      result.append(c);
+    }
+    return result.toString();
   }
 
-  public static String formatParam(@Nullable Object param) {
+  public static String reformatParam(@Nullable Object param) {
     if (param == null) {
       return PARAM_NULL;
     }
@@ -47,13 +59,13 @@ public class SqlLogFormatter {
     return NEWLINE_PATTERN.matcher(abbreviated).replaceAll("\\\\n");
   }
 
-  public static String formatParams(Object[] params) {
+  public static String reformatParams(Object[] params) {
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < params.length; i++) {
       if (i > 0) {
         sb.append(", ");
       }
-      sb.append(formatParam(params[i]));
+      sb.append(reformatParam(params[i]));
     }
     return sb.toString();
   }
index ce3ac0925f414a05e19f5588c7a5698085dcd05e..461309ac49a6567cfefc8f6a059d437e8718e359 100644 (file)
@@ -27,31 +27,33 @@ import static org.assertj.core.api.Assertions.assertThat;
 public class SqlLogFormatterTest {
 
   @Test
-  public void formatSql() {
-    assertThat(SqlLogFormatter.formatSql("select *")).isEqualTo("select *");
+  public void reformatSql() {
+    assertThat(SqlLogFormatter.reformatSql("")).isEqualTo("");
+    assertThat(SqlLogFormatter.reformatSql("select *")).isEqualTo("select *");
+    assertThat(SqlLogFormatter.reformatSql("select *\nfrom issues")).isEqualTo("select * from issues");
+    assertThat(SqlLogFormatter.reformatSql("select *\n from issues")).isEqualTo("select * from issues");
+    assertThat(SqlLogFormatter.reformatSql("select *\n   from issues")).isEqualTo("select * from issues");
+    assertThat(SqlLogFormatter.reformatSql("select    *\n   from    issues")).isEqualTo("select * from issues");
+    assertThat(SqlLogFormatter.reformatSql("select    *\n\t\t  from  \tissues")).isEqualTo("select * from issues");
   }
 
   @Test
-  public void formatSql_removes_newlines() {
-    assertThat(SqlLogFormatter.formatSql("select *\nfrom issues")).isEqualTo("select * from issues");
+  public void reformatParam() {
+    assertThat(SqlLogFormatter.reformatParam(null)).isEqualTo("[null]");
+    assertThat(SqlLogFormatter.reformatParam("")).isEqualTo("");
+    assertThat(SqlLogFormatter.reformatParam("foo")).isEqualTo("foo");
+    assertThat(SqlLogFormatter.reformatParam("foo  bar ")).isEqualTo("foo  bar ");
   }
 
   @Test
-  public void formatParam() {
-    assertThat(SqlLogFormatter.formatParam(null)).isEqualTo("[null]");
-    assertThat(SqlLogFormatter.formatParam("")).isEqualTo("");
-    assertThat(SqlLogFormatter.formatParam("foo")).isEqualTo("foo");
+  public void reformatParam_escapes_newlines() {
+    assertThat(SqlLogFormatter.reformatParam("foo\n  bar\nbaz")).isEqualTo("foo\\n  bar\\nbaz");
   }
 
   @Test
-  public void formatParam_escapes_newlines() {
-    assertThat(SqlLogFormatter.formatParam("foo\nbar\nbaz")).isEqualTo("foo\\nbar\\nbaz");
-  }
-
-  @Test
-  public void formatParam_truncates_if_too_long() {
+  public void reformatParam_truncates_if_too_long() {
     String param = repeat("a", SqlLogFormatter.PARAM_MAX_WIDTH + 10);
-    String formattedParam = SqlLogFormatter.formatParam(param);
+    String formattedParam = SqlLogFormatter.reformatParam(param);
     assertThat(formattedParam)
       .hasSize(SqlLogFormatter.PARAM_MAX_WIDTH)
       .endsWith("...")
@@ -59,14 +61,14 @@ public class SqlLogFormatterTest {
   }
 
   @Test
-  public void formatParams() {
-    String formattedParams = SqlLogFormatter.formatParams(new Object[] {"foo", 42, null, true});
+  public void reformatParams() {
+    String formattedParams = SqlLogFormatter.reformatParams(new Object[] {"foo", 42, null, true});
     assertThat(formattedParams).isEqualTo("foo, 42, [null], true");
   }
 
   @Test
-  public void formatParams_returns_blank_if_zero_params() {
-    String formattedParams = SqlLogFormatter.formatParams(new Object[0]);
+  public void reformatParams_returns_blank_if_zero_params() {
+    String formattedParams = SqlLogFormatter.reformatParams(new Object[0]);
     assertThat(formattedParams).isEqualTo("");
   }