Mercurial > hg > monetdb-java
diff src/main/java/nl/cwi/monetdb/jdbc/MonetSavepoint.java @ 0:a5a898f6886c
Copy of MonetDB java directory changeset e6e32756ad31.
author | Sjoerd Mullender <sjoerd@acm.org> |
---|---|
date | Wed, 21 Sep 2016 09:34:48 +0200 (2016-09-21) |
parents | |
children | 7307caacc2d5 e092fa8d9ab7 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetSavepoint.java @@ -0,0 +1,135 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2016 MonetDB B.V. + */ + +package nl.cwi.monetdb.jdbc; + +import java.sql.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * The representation of a savepoint, which is a point within the current + * transaction that can be referenced from the Connection.rollback method. + * When a transaction is rolled back to a savepoint all changes made after + * that savepoint are undone. + * Savepoints can be either named or unnamed. Unnamed savepoints are + * identified by an ID generated by the underlying data source. + * + * This little class is nothing more than a container for a name and/or + * an id. Each instance of this class always has an id, which is used for + * internal representation of the save point. + * + * Because the IDs which get generated are a logical sequence, application + * wide, two concurrent transactions are guaranteed to not to have the same + * save point identifiers. In this implementation the validaty of save points + * is determined by the server, which makes this a light implementation. + * + * @author Fabian Groffen + * @version 1.0 + */ +public class MonetSavepoint implements Savepoint { + /** The id of the last created Savepoint */ + private static AtomicInteger highestId = new AtomicInteger(0); + + /** The name of this Savepoint */ + private final String name; + /** The id of this Savepoint */ + private final int id; + + public MonetSavepoint(String name) throws IllegalArgumentException { + if (name == null) throw new IllegalArgumentException("null not allowed"); + + this.id = getNextId(); + this.name = name; + } + + public MonetSavepoint() { + this.id = getNextId(); + this.name = null; + } + + + /** + * Retrieves the generated ID for the savepoint that this Savepoint object + * represents. + * + * @return the numeric ID of this savepoint + * @throws SQLException if this is a named savepoint + */ + @Override + public int getSavepointId() throws SQLException { + if (name != null) throw + new SQLException("Cannot getID for named savepoint", "3B000"); + + return getId(); + } + + /** + * Retrieves the name of the savepoint that this Savepoint object + * represents. + * + * @return the name of this savepoint + * @throws SQLException if this is an un-named savepoint + */ + @Override + public String getSavepointName() throws SQLException { + if (name == null) throw + new SQLException("Unable to retrieve name of unnamed savepoint", "3B000"); + + return name; + } + + //== end of methods from Savepoint interface + + /** + * Retrieves the savepoint id, like the getSavepointId method with the only + * difference that this method will always return the id, regardless of + * whether it is named or not. + * + * @return the numeric ID of this savepoint + */ + int getId() { + return id; + } + + /** + * Returns the name to use when referencing this save point to the MonetDB + * database. The returned value is guaranteed to be unique and consists of + * a prefix string and a sequence number. + * + * @return the unique savepoint name + */ + String getName() { + return "MonetDBSP" + id; + } + + + /** + * Returns the next id, which is larger than the last returned id. This + * method is synchronized to prevent race conditions. Since this is static + * code, this method is shared by requests from multiple Connection objects. + * Therefore two successive calls to this method need not to have a + * difference of 1. + * + * @return the next int which is guaranteed to be higher than the one + * at the last call to this method. + */ + private static int getNextId() { + return highestId.incrementAndGet(); + } + + /** + * Returns the highest id returned by getNextId(). This method is also + * synchronized to prevent race conditions and thus guaranteed to be + * thread-safe. + * + * @return the highest id returned by a call to getNextId() + */ + private static int getHighestId() { + return highestId.get(); + } +}