//--------------------------------------------------------------------------------------//
//									Classe Class1									    //
//					Gera um número de identificação toda vez que é chamada				//
//																						//
// Como vc não disse se a conexão já estaria estabelecida ou não, eu construi a classe  //
// com dois construtores, um que cria a própria conexão com o BD onde esta a tabela     //
// GERANOMEID, e outro construtor que usa uma conexão já existente que lhe é passada    //
// como parametro.																		//
//																						//
// Pelo mesmo motivo foi preciso fazer duas funções de geração de id uma com uma conexão//
// já estabelecida e outra que usa a conexão estabelecida pela própria classe.			//
//																						//
// As partes do código que variam de acordo com o uso estão junto de um comentário		//
// "varia".																				//
//																						//
// A classe Class1 existe apenas para testar a classe, não é necessário recria-la junto //
// com a classe GeraId, mas ela dá uma idéia de como seria o código de chamada da classe//
//																						//
// O login e a senha na linha de conexão só são úteis se sua base estiver protegida por //
// senha caso contrário não importa o que vc colocar ali, não influencia em nada		//
//	
// Hamilton Fonte II - 9515919.9 - PUC.RIO/LES																					//
//--------------------------------------------------------------------------------------//

import java.sql.*;	//necessário
import java.io.*;

public class GeraId
{
	//variáveis para realizar a conexão, necessário
	public Connection conConexao;
	public Statement  stmtDeclaracao;
	public ResultSet  rsResultados;
	public String     sUrl       = "jdbc:odbc:GeraId"; //varia
	public String     sQueryCons = new String();
	public String     sQueryUpdt = new String();
	public int        iAntes;
		
	
	//---------------------------------------------------//
	// construtor para a conexão inexistente, necessário //
	//---------------------------------------------------//
	public GeraId( String NomeTabela )
	{
		try{ //registrando o driver para conexão
			
			Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver"); //varia
			
		} catch (ClassNotFoundException exp1) {
			
			System.out.println("Erro: " + exp1.getMessage()); //varia
		
		}
		
		
		try{ //estabelecendo a conexão
			
			conConexao     = DriverManager.getConnection(sUrl, "hamilton", "hamilton");
			stmtDeclaracao = conConexao.createStatement();
			conConexao.setAutoCommit(false);
						
		} catch (SQLException exp2) {
			
			System.out.println("Erro: " + exp2.getMessage()); //varia
		
		}
		
		//construindo as querys com o nome da tabela a ser consultada
		sQueryCons = "select BASEID from " + NomeTabela;
		sQueryUpdt = "update " + NomeTabela + " set BASEID = ";
		
	}//construtor sem conexão
	
	
	
	//----------------------------------------------------//
	// construtor para a conexão já existente, necessário //
	//----------------------------------------------------//
	public GeraId( String NomeTabela, Connection conConexao, Statement stmtDeclararacao )
	{
		//construindo as querys com o nome da tabela a ser consultada		
		sQueryCons = "select BASEID from " + NomeTabela;
		sQueryUpdt = "update " + NomeTabela + " set BASEID = ";
		
	}//construtor com conexão já estabelecida
	
	
	//-----------------------------------------------------//
	// Método pegaNumero, responsável por acessar a tabela //
	// e gerar um número, necessário.					   //
	//-----------------------------------------------------//
	public int pegaNumero( int iIntervalo )
	{
		int iTentativas = 0;
				
		while ( iTentativas < 50 )
		{
			try{
				
				//recuperando iAntes
				rsResultados = stmtDeclaracao.executeQuery( sQueryCons );
				rsResultados.next();
				
				iAntes       = rsResultados.getInt(1);
														
				//atualizando iAntes				
				iAntes       = iAntes + iIntervalo;
			
				//construindo a Query de atualização
				sQueryUpdt = sQueryUpdt + Integer.toString(iAntes);
				
				//atualizando a tabela
				stmtDeclaracao.executeUpdate(sQueryUpdt);
				
				//validando as alterações
				conConexao.commit();
				
				return iAntes;
				
			} catch (SQLException exp3) {
				
				System.out.println("Erro: " + exp3.getMessage()); //varia
				
				try{

					conConexao.rollback();
					
				} catch (SQLException exp4) {
				
					System.out.println("Erro: " + exp3.getMessage()); //varia
					
				}//try de rollback
				
				iTentativas++;
				
			}//try de alteração
			
		}//for de alteração
		
		//não conseguiu um número
		return -1;
	}//função pegaNumero
	
	
	
	//-----------------------------------------------------//
	// Método pegaNumero, responsável por acessar a tabela //
	// e gerar um número, necessário.					   //
	//-----------------------------------------------------//
	public int pegaNumero( int iIntervalo, Connection conConexao, Statement stmtDeclaracao )
	{
		int iTentativas = 0;
				
		while ( iTentativas < 50 )
		{
			try{
				
				//recuperando iAntes
				rsResultados = stmtDeclaracao.executeQuery( sQueryCons );
				rsResultados.next();
				
				iAntes       = rsResultados.getInt(1);
														
				//atualizando iAntes				
				iAntes       = iAntes + iIntervalo;
			
				//construindo a Query de atualização
				sQueryUpdt = sQueryUpdt + Integer.toString(iAntes);
				
				//atualizando a tabela
				stmtDeclaracao.executeUpdate(sQueryUpdt);
				
				//validando as alterações
				conConexao.commit();
				
				return iAntes;
				
			} catch (SQLException exp3) {
				
				System.out.println("Erro: " + exp3.getMessage()); //varia
				
				try{

					conConexao.rollback();
					
				} catch (SQLException exp4) {
				
					System.out.println("Erro: " + exp3.getMessage()); //varia
					
				}//try de rollback
				
				iTentativas++;
				
			}//try de alteração
			
		}//for de alteração
		
		//não conseguiu um número
		return -1;
	}//função pegaNumero para conexão já exsitente
	
}