[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: [Exceção NotEnoughSpaceException]



Tiago Silveira writes:
 > Nelson Guedes Paulo Junior <npaulo@linux.ime.usp.br> wrote:
 > > Em um e-mail da lista, perguntaram o que fazem os metodos
 > > setFillFactor() e getFillFactor() da interface recordset....
 > > Na resposta, o professor colocou que um tal metodo update() retornaria a
 > > exceção Not EnoughSpaceException... Mas pelo texto do CAMAT, a função
 > > que deveria realizar essa tarefa (no caso o update()) deveria procurar
 > > espaço em outras paginas e so retornar algum erro caso não fosse
 > > possivel alocar o record em alguma pagina..... Não é contraditorio
 > > passar a "batata-quente" para alguem que não deveria saber como resolver
 > > esse problema? Afinal quem chamou o metodo update() não deveria saber o
 > > que ele esta fazendo e já que o problema é facil de resolver
 > > internamente (é so procurrar outro lugar para colocar o record) não
 > > seria melhor faze-lo internamente?
 > 
 > ----
 > 
 > Acho que o update() deve chamar o método que aloca o registro, e se não for
 > possivel mesmo arrumar espaço pra ele (nem no lugar que ele estava, nem num
 > novo lugar) aí sim ele lança a NotEnoughSpace... Também não peguei muito bem
 > essa parte, mas eu tentaria isso primeiro...

Concordo que um método assim é melhor para usuário, mas não é o que eu estou
pedindo. O método update() proposto tenta atualizar o registro na página
em que ele está e lança NotEnoughSpaceException se isso não for possível
por falta de espaço na página. Caso falte espaço na página, ele lança a
exceção e pronto. Ele não tenta arrumar espaço para o registro em alguma
outra página.

É claro que seria fácil resolver esse problema internamente, em vez de
empurrá-lo para o usuário. Do ponto de vista de quem vai usar o pacote,
é muito melhor ter um método update que primeiro tenta atualizar o
registro sem mudá-lo de página e, caso não consiga, tenta arrumar espaço
noutra página. A declaração desse metodo deveria ser um pouco diferente
da do metodo proposto. Ela poderia ser assim:

    public abstract long betterUpdate(long recordId, DBObject obj)
        throws InvalidRecordIdException, WrongTypeException,
               NotEnoughSpaceException, java.io.IOException;

A única diferença na declaração é que este método retorna o recordId do
registro atualizado. Caso o registro não tenha mudado de página, o
recordId retornado é igual ao que foi recebido como parâmetro. E a exceção
NotEnoughSpaceException só é lançada se não houver espaço para o
registro atualizado em lugar nenhum.

Se vocês preferirem implementar um método assim, ótimo. Podem até
chamá-lo de update mesmo, em vez de betterUpdate. Mas nesse caso
implementem também um método updateInPlace, que faz o que eu havia
pedido. Ele nem precisa ser publico.

Por que faço tanta questão de um updateInPlace ? Por causa da próxima
etapa. Imaginem que vocês tem um índice que referencia os registros. Por
exemplo, registros de Alunos poderiam ser indexados pelo campo
numeroUSP. Se você atualizar o campo endereço de um aluno sem mudar de
página o registro do Aluno, a entrada do índice que referencia esse
registro continuará correta. Se o registro mudar de página, o índice
precisará ser atualizado.

Reverbel