View Javadoc
1   /*
2    * $Source$
3    * $Revision$
4    *
5    * Copyright (C) 2000 William Chesters
6    *
7    * Part of Melati (http://melati.org), a framework for the rapid
8    * development of clean, maintainable web applications.
9    *
10   * Melati is free software; Permission is granted to copy, distribute
11   * and/or modify this software under the terms either:
12   *
13   * a) the GNU General Public License as published by the Free Software
14   *    Foundation; either version 2 of the License, or (at your option)
15   *    any later version,
16   *
17   *    or
18   *
19   * b) any version of the Melati Software License, as published
20   *    at http://melati.org
21   *
22   * You should have received a copy of the GNU General Public License and
23   * the Melati Software License along with this program;
24   * if not, write to the Free Software Foundation, Inc.,
25   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA to obtain the
26   * GNU General Public License and visit http://melati.org to obtain the
27   * Melati Software License.
28   *
29   * Feel free to contact the Developers of Melati (http://melati.org),
30   * if you would like to work out a different arrangement than the options
31   * outlined here.  It is our intention to allow Melati to be used by as
32   * wide an audience as possible.
33   *
34   * This program is distributed in the hope that it will be useful,
35   * but WITHOUT ANY WARRANTY; without even the implied warranty of
36   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37   * GNU General Public License for more details.
38   *
39   * Contact details for copyright holder:
40   *
41   *     William Chesters <williamc At paneris.org>
42   *     http://paneris.org/~williamc
43   *     Obrechtstraat 114, 2517VX Den Haag, The Netherlands
44   */
45  
46  package org.melati.poem;
47  
48  import java.sql.Connection;
49  import java.sql.SQLException;
50  
51  import org.melati.poem.transaction.Transaction;
52  
53  /**
54   * A set of dbms actions, which can be rolled back if necessary.
55   */
56  public class PoemTransaction extends Transaction {
57    private Database database;
58    private Connection connection;
59  
60    /**
61     * Constructor.
62     */
63    public PoemTransaction(Database database, Connection connection, int index) {
64      super(database, index);
65      this.database = database;
66      this.connection = connection;
67      try {
68        connection.setAutoCommit(false);
69      }
70      catch (SQLException e) {
71        throw new SQLSeriousPoemException(e);
72      }
73    }
74  
75    /**
76     * @return the Database this PoemTransaction relates to
77     */
78    public final Database getDatabase() {
79      return database;
80    }
81  
82    final Connection getConnection() {
83      return connection;
84    }
85  
86    protected void backingCommit() {
87      try {
88        connection.commit();
89        if (database.logCommits()) database.log(new CommitLogEvent(this));
90      }
91      catch (SQLException e) {
92        throw new CommitFailedPoemException(e);
93      }
94    }
95  
96    protected void backingRollback() {
97      try {
98        // MySQL closes idle connections by default
99        if(connection.isClosed()){
100         if (database.logCommits()) database.log(
101               "No rollback on closed connection for " 
102                   + new RollbackLogEvent(this));
103       } else {
104         connection.rollback();
105         if (database.logCommits()) database.log(new RollbackLogEvent(this));
106       }
107     }
108     catch (SQLException e) {
109       throw new RollbackFailedPoemException(e);
110     }
111   }
112 
113   /**
114    * Close the transaction, committing or rolling back, 
115    * notifying the database that we are closed.
116    * @param commit whether to commit before closing
117    */
118   public void close(boolean commit) {
119     try {
120       if (commit)
121         commit();
122       else
123         rollback();
124     }
125     finally {
126       database.notifyClosed(this);
127     }
128   }
129 
130   /**
131    * {@inheritDoc}
132    * @see org.melati.poem.transaction.Transaction#toString()
133    */
134   public String toString() {
135     return database.getName() + "/" + super.toString();
136   }
137 }
138 
139