/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.data.oracle;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.geotools.data.DataSourceException;
/**
* Provides a sequence for generating unique FID keys. Selects the max value of the fid column
* then increments it with each successive call to getNext().
*
* <p>
* This may break if other tools are modifying the database at the same time. But this is a wider
* issue that should be dealt with in a Geotools standard way. When that way is determined this
* class can probably disappear. This is also part of the reason why this class is only package
* visible, since this method of generating fids should not be used by other data sources.
* </p>
*
* @author Sean Geoghegan, Defence Science and Technology Organisation
* @author $Author: seangeo $
* @source $URL$
* @version $Id$
*
* @task REVISIT: This assumes that the DB does not manage the PK itself. I need to work out a way
* to check that is does and then defer to the DB in that case.
*/
class FIDSequence {
/** Holds the current FID. THis is incremented for each getNext() call */
private int current;
/**
* Creates a FID sequence that generates unique FID keys for adding features to the table.
*
* @param conn The Database Connection
* @param tablename The table
* @param fidColumn The FID column
*
* @throws DataSourceException If an error occurs determining the max fid.
*/
FIDSequence(Connection conn, String tablename, String fidColumn) throws DataSourceException {
ResultSet resultSet = null;
try {
String query = "SELECT max(" + fidColumn + ") FROM " + tablename;
Statement statement = conn.createStatement();
resultSet = statement.executeQuery(query);
if (resultSet.next()) {
Number number = (Number) resultSet.getObject(1);
current = number.intValue();
} else {
throw new DataSourceException("Could not get max for " + fidColumn);
}
} catch (SQLException e) {
throw new DataSourceException("SQL Error occured when " + "generating unique key", e);
} catch (ClassCastException e) {
throw new DataSourceException("Error casting fid column " + "to a number", e);
} finally {
try {
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e1) {
// dont need to do anything here - just closing the result set
}
}
}
/**
* Gets the next unique FID key.
*
* @return The next key in the sequence.
*/
int getNext() {
current += 1;
return current;
}
}