A operação de escrita de um grafo persistente em memória estável consiste em percorrer e salvaguardar todos os agrupamentos que dele fazem parte, mesmo que alguns sejam remotos. A operação de salvaguarda de um agrupamento faz-se através da salvaguarda de todos os objectos que dele fazem parte, partindo da raiz.
Dentro de cada objecto podem existir dois tipos de entidades: referências para outros objectos e que o se designará por dados, i.e., qualquer coisa que não seja uma referência.
O algoritmo de escrita apenas se preocupa directamente com as referências. Os dados são da exclusiva responsabilidade do programador da aplicação. Este tem à sua disposição dois métodos da carta, que pode redefinir. Se não forem redefinidos, apenas as referências serão salvaguardadas.
O primeiro método, SPM_quot
PI_OnSave", permite executar operações de
escrita de dados sobre uma entidade de armazenamento temporário (EAT)
que é passada como argumento. A natureza exacta de uma EAT depende da
realização concreta, mas que deve possuir uma região disponível para a
escrita de dados, assim como um contador que permita saber qual a
quantidade de informação armazenada. O segundo método,
SPM_quot
PI_OnRestore", recupera os dados do objecto a partir da EAT,
previamente inicializada, passada como argumento. Deve haver cuidado
para que as acções desempenhadas por ambos os métodos sejam
complementares. A estrutura de EAT é a que se apresenta na
figura 5.11.
Figure 5.11: Estrutura de uma EAT.
O algoritmo de travessia do grafo baseia-se em procura em profundidade. A procura de referências processe-se para cada objecto encontrado, excepto se o objecto não existir no contexto local. A procura pára sempre que seja encontrado um IOP pertencente ao agrupamento em construção ou a outro agrupamento. No caso de se ter um objecto remoto, a procura pára e apenas o IOP do objecto remoto é armazenado. Do lado remoto uma operação de escrita é iniciada, sendo retornado o IOP da raiz implícita do agrupamento formado remotamente. Por cada objecto encontrado, e depois de terem sido processadas todas as referências, o método OnSave é executado sobre a carta correspondente ao objecto. No caso remoto, a execução do método tem lugar no contexto onde a carta reside.
A lista de referências a processar é obtida automaticamente a partir
da carta, através do método SPM_quot
PI_getRefs", que retorna um conjunto
de referências a processar. Este método, ao contrário dos dois
anteriores, que podem ser opcionalmente redefinidos pelo programador,
é automaticamente criado, pelo gerador de cartas, para cada classe que
deva suportar persistência para as suas instâncias.
Além das referências para outros objectos e dos dados dependentes do nível de programa, quando um objecto é processado também se salvaguarda o seu tipo, com vista a posterior recuperação.
A estrutura global de um agrupamento figa definida como se ilustra na figura 5.12. Existem três tabelas e dois blocos de informação sobre o conteúdo dos objectos do agrupamento.
Figure 5.12: Estrutura de um agrupamento.
A primeira tabela contém as dimensões de si própria, das outras duas e dos dois blocos restantes. Destes, o primeiro contém descritores de objectos e o segundo as EAT utilizadas pelo nível de programa.
A segunda tabela contém as correspondências entre os identificadores intra-agrupamento, LIDs, e as posições correspondentes dentro do bloco de descritores. Note-se que, no decurso da vida de um agrupamento, alguns dos seus objectos podem ser destruídos. Os LIDs a eles associados deixam de ser válidos e não podem ser reutilizados. O mapa de LIDs deve então conter informação sobre o facto de eles serem inválidos.
A terceira tabela contém informação sobre os tipos dos objectos no interior do agrupamento.
O bloco de descritores contém, por cada entrada, o número de referências do objecto para outros objectos, o identificador do tipo, a dimensão da EAT do nível de programa, assim como a sua localização. Se a dimensão da EAT for dada como nula, a sua posição é ignorada.
Finalmente, o bloco de dados contém informação da responsabilidade do programador do nível de programa, pelo que a informação neles contida é completamente arbitrária.