From cd94b6e13a96832e1f717f1a57e3f072151d0bf0 Mon Sep 17 00:00:00 2001 From: Marco Zanon Date: Sat, 12 Dec 2015 09:31:00 +0000 Subject: [PATCH] Implemented query logging. --- .../macaco/database/MDatabaseConnection.java | 27 ++++++++++++++++++- .../MDatabaseConnectionGenerator.java | 16 +++++++++-- .../database/MDatabaseConnectionPool.java | 5 ++-- .../macaco/logging/MLogListener.java | 15 +++++++++++ 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/java/com/marcozanon/macaco/logging/MLogListener.java diff --git a/src/java/com/marcozanon/macaco/database/MDatabaseConnection.java b/src/java/com/marcozanon/macaco/database/MDatabaseConnection.java index 63aa6ee..0e1de5e 100644 --- a/src/java/com/marcozanon/macaco/database/MDatabaseConnection.java +++ b/src/java/com/marcozanon/macaco/database/MDatabaseConnection.java @@ -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); + } + } + } diff --git a/src/java/com/marcozanon/macaco/database/MDatabaseConnectionGenerator.java b/src/java/com/marcozanon/macaco/database/MDatabaseConnectionGenerator.java index 76b62e0..c4a6a15 100644 --- a/src/java/com/marcozanon/macaco/database/MDatabaseConnectionGenerator.java +++ b/src/java/com/marcozanon/macaco/database/MDatabaseConnectionGenerator.java @@ -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; } diff --git a/src/java/com/marcozanon/macaco/database/MDatabaseConnectionPool.java b/src/java/com/marcozanon/macaco/database/MDatabaseConnectionPool.java index 1b3b636..cd57ed1 100644 --- a/src/java/com/marcozanon/macaco/database/MDatabaseConnectionPool.java +++ b/src/java/com/marcozanon/macaco/database/MDatabaseConnectionPool.java @@ -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/src/java/com/marcozanon/macaco/logging/MLogListener.java b/src/java/com/marcozanon/macaco/logging/MLogListener.java new file mode 100644 index 0000000..d7d8924 --- /dev/null +++ b/src/java/com/marcozanon/macaco/logging/MLogListener.java @@ -0,0 +1,15 @@ +/** + * Macaco + * Copyright (c) 2009-2015 Marco Zanon . + * Released under MIT license (see LICENSE for details). + */ + +package com.marcozanon.macaco.logging; + +public interface MLogListener { + + /* Logging. */ + + public void onMessageLogging(String message); + +} -- 2.30.2