Implemented query logging.
authorMarco Zanon <info@marcozanon.com>
Sat, 12 Dec 2015 09:31:00 +0000 (09:31 +0000)
committerMarco Zanon <info@marcozanon.com>
Sat, 12 Dec 2015 09:31:00 +0000 (09:31 +0000)
4.x/src/java/com/marcozanon/macaco/database/MDatabaseConnection.java
4.x/src/java/com/marcozanon/macaco/database/MDatabaseConnectionGenerator.java
4.x/src/java/com/marcozanon/macaco/database/MDatabaseConnectionPool.java
4.x/src/java/com/marcozanon/macaco/logging/MLogListener.java [new file with mode: 0644]

index 63aa6eefda90e75dfa2b8371e1c6b0ff9a39e30d..0e1de5ed57a404516e016cb0a01c9553220b83f8 100644 (file)
@@ -7,6 +7,7 @@
 package com.marcozanon.macaco.database;
 
 import com.marcozanon.macaco.MObject;
+import com.marcozanon.macaco.logging.MLogListener;
 import com.marcozanon.macaco.text.MText;
 import java.sql.Connection;
 import java.sql.DriverManager;
@@ -26,6 +27,7 @@ public class MDatabaseConnection extends MObject {
     protected String url = null;
     protected String username = null;
     protected String password = null;
+    protected MLogListener logListener = null;
 
     protected Connection connection = null;
 
@@ -33,7 +35,7 @@ public class MDatabaseConnection extends MObject {
 
     /* */
 
-    public MDatabaseConnection(String driver, String url, String username, String password) throws MDatabaseConnectionFailureException {
+    public MDatabaseConnection(String driver, String url, String username, String password, MLogListener logListener) throws MDatabaseConnectionFailureException {
         super();
         //
         if (MText.isBlank(driver)) {
@@ -53,6 +55,7 @@ public class MDatabaseConnection extends MObject {
         this.url = url;
         this.username = username;
         this.password = password;
+        this.setLogListener(logListener);
         // Load driver.
         try {
             Class.forName(this.getDriver()).newInstance();
@@ -76,6 +79,7 @@ public class MDatabaseConnection extends MObject {
         // Set SQL mode to standard ANSI.
         try {
             this.getConnection().createStatement().executeUpdate("SET SQL_MODE='ANSI'");
+            this.logStatement("### SET SQL_MODE='ANSI' ###");
         }
         catch (SQLException exception) {
             throw new MDatabaseConnectionFailureException("Could not set SQL mode to ANSI.", exception);
@@ -160,6 +164,7 @@ public class MDatabaseConnection extends MObject {
             this.getConnection().setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
             this.getConnection().setAutoCommit(false);
             this.setTransactionStatus(MDatabaseConnection.TransactionStatus.SUCCESSFUL);
+            this.logStatement("### BEGIN TRANSACTION ###");
         }
         catch (SQLException exception) {
             throw new MSqlTransactionException("Could not start transaction.", exception);
@@ -174,6 +179,7 @@ public class MDatabaseConnection extends MObject {
             this.getConnection().rollback();
             this.getConnection().setAutoCommit(true);
             this.setTransactionStatus(MDatabaseConnection.TransactionStatus.CLOSED);
+            this.logStatement("### ROLLBACK ###");
         }
         catch (SQLException exception) {
             this.setTransactionStatus(MDatabaseConnection.TransactionStatus.FAILED);
@@ -188,6 +194,7 @@ public class MDatabaseConnection extends MObject {
                     this.getConnection().commit();
                     this.getConnection().setAutoCommit(true);
                     this.setTransactionStatus(MDatabaseConnection.TransactionStatus.CLOSED);
+                    this.logStatement("### COMMIT ###");
                     return MDatabaseConnection.TransactionStatus.SUCCESSFUL;
                 }
                 catch (SQLException exception) {
@@ -227,6 +234,7 @@ public class MDatabaseConnection extends MObject {
             // Execute the statement and parse the results.
             preparedStatement.execute();
             results = new MSqlStatementResults(preparedStatement);
+            this.logStatement(preparedStatement.toString());
         }
         catch (SQLException exception) {
             if (MDatabaseConnection.TransactionStatus.SUCCESSFUL == this.getTransactionStatus()) {
@@ -243,4 +251,21 @@ public class MDatabaseConnection extends MObject {
         return new MSqlTable(this, table, primaryKey);
     }
 
+    /* Logging. */
+
+    public void setLogListener(MLogListener logListener) {
+        this.logListener = logListener;
+    }
+
+    protected MLogListener getLogListener() {
+        return this.logListener;
+    }
+
+    protected void logStatement(String statement) {
+        MLogListener logListener = this.getLogListener();
+        if (null != logListener) {
+            logListener.onMessageLogging(statement);
+        }
+    }
+
 }
index 76b62e0522e9a2f73298fbc635bd82580c97d06a..c4a6a1590486244973f6722e54eb8c024281e8ea 100644 (file)
@@ -7,6 +7,7 @@
 package com.marcozanon.macaco.database;
 
 import com.marcozanon.macaco.MObject;
+import com.marcozanon.macaco.logging.MLogListener;
 import com.marcozanon.macaco.text.MText;
 
 public class MDatabaseConnectionGenerator extends MObject {
@@ -15,10 +16,11 @@ public class MDatabaseConnectionGenerator extends MObject {
     protected String url = null;
     protected String username = null;
     protected String password = null;
+    protected MLogListener logListener = null;
 
     /* */
 
-    public MDatabaseConnectionGenerator(String driver, String url, String username, String password) {
+    public MDatabaseConnectionGenerator(String driver, String url, String username, String password, MLogListener logListener) {
         super();
         //
         if (MText.isBlank(driver)) {
@@ -38,6 +40,7 @@ public class MDatabaseConnectionGenerator extends MObject {
         this.url = url;
         this.username = username;
         this.password = password;
+        this.logListener = logListener;
     }
 
     /* Driver. */
@@ -64,10 +67,16 @@ public class MDatabaseConnectionGenerator extends MObject {
         return this.password;
     }
 
+    /* Log listener. */
+
+    public MLogListener getLogListener() {
+        return this.logListener;
+    }
+
     /* Generator. */
 
     public MDatabaseConnection getNewDatabaseConnection() throws MDatabaseConnectionFailureException {
-        return new MDatabaseConnection(this.getDriver(), this.getUrl(), this.getUsername(), this.getPassword());
+        return new MDatabaseConnection(this.getDriver(), this.getUrl(), this.getUsername(), this.getPassword(), this.getLogListener());
     }
 
     public boolean isGeneratorFor(MDatabaseConnection databaseConnection) {
@@ -87,6 +96,9 @@ public class MDatabaseConnectionGenerator extends MObject {
         if (!databaseConnection.getPassword().equals(this.getPassword())) {
             return false;
         }
+        if (databaseConnection.getLogListener() != this.getLogListener()) {
+            return false;
+        }
         //
         return true;
     }
index 1b3b6368e8b65989c76ca194c21c5e0d8a463880..cd57ed17d59bc54b165208909116bc9245468ca1 100644 (file)
@@ -7,6 +7,7 @@
 package com.marcozanon.macaco.database;
 
 import com.marcozanon.macaco.MObject;
+import com.marcozanon.macaco.logging.MLogListener;
 import java.util.LinkedList;
 
 public class MDatabaseConnectionPool extends MObject {
@@ -19,7 +20,7 @@ public class MDatabaseConnectionPool extends MObject {
 
     /* */
 
-    public MDatabaseConnectionPool(String driver, String url, String username, String password, int minimumSize, int maximumSize) throws MDatabaseConnectionFailureException {
+    public MDatabaseConnectionPool(String driver, String url, String username, String password, int minimumSize, int maximumSize, MLogListener logListener) throws MDatabaseConnectionFailureException {
         super();
         //
         if (0 > minimumSize) {
@@ -32,7 +33,7 @@ public class MDatabaseConnectionPool extends MObject {
             throw new IllegalArgumentException(String.format("Invalid 'maximumSize': %s < %s ('minimumSize').", maximumSize, minimumSize));
         }
         //
-        this.databaseConnectionGenerator = new MDatabaseConnectionGenerator(driver, url, username, password);
+        this.databaseConnectionGenerator = new MDatabaseConnectionGenerator(driver, url, username, password, logListener);
         this.minimumSize = minimumSize;
         this.maximumSize = maximumSize;
         //
diff --git a/4.x/src/java/com/marcozanon/macaco/logging/MLogListener.java b/4.x/src/java/com/marcozanon/macaco/logging/MLogListener.java
new file mode 100644 (file)
index 0000000..d7d8924
--- /dev/null
@@ -0,0 +1,15 @@
+/**
+ * Macaco
+ * Copyright (c) 2009-2015 Marco Zanon <info@marcozanon.com>.
+ * Released under MIT license (see LICENSE for details).
+ */
+
+package com.marcozanon.macaco.logging;
+
+public interface MLogListener {
+
+    /* Logging. */
+
+    public void onMessageLogging(String message);
+
+}