Entenda o Formato PDB (Palm Database)

        O Palm Database (PDB) é o formato padrão que o PalmOS utiliza para armazenamento de dados, em forma de registros. Neste artigo, explicaremos o modo como são armazenados os dados dentro do PDB, as estruturas internas e os conceitos envolvidos na sua utilização.

Conceitos

  • Primeiramente, não devemos confundir os arquivos que são gravados no Desktop, de extensão PDB, com o formato de armazenamento de dados do PalmOS, o Palm Database (PDB). Os arquivos gravados no Desktop tem esta extensão para associá-los ao gerenciador de HotSync do Palm, possibilitando a instalação dos Bancos de Dados no Palm e o backup deles depois de um HotSync. No PalmOS não há arquivos e extensões. Todos os dados armazenados são gravados na memória, através de formatos específicos para cada tipo de utilização. Até mesmo os programas (PRC, Palm Resource) são Bancos de Dados com um formato específico. O que determina e diferencia o tipo do Banco de Dados armazenado são as informações do Header, indicando se aquele Banco de Dados é um Banco de Registros, Resource, PQA, etc. (Veremos outros formatos em outros artigos).

  • Outro conceito importante a destacar é que o formato padrão dos Bancos de Dados são detalhados aqui como se fossem uma estrutura seqüencial, exatamente como são gravados os arquivos PDB no Desktop, provenientes de um HotSync. Na realidade, a forma como o PalmOS armazena os Bancos de Dados na memória pode variar em função da quantidade de memória disponível e versão do Sistema Operacional. Naturalmente, se você decidir gerar um Arquivo PDB no desktop com a estrutura detalhada aqui e enviá-lo ao Palm, será perfeitamente possível, pois durante o processo do HotSync, o PalmOS alocará os recursos necessários para armazenar seu Banco de Dados na memória e torná-lo disponível para suas aplicações.

  • Para quem vem de outras plataformas e linguagens de programação, é comum tentar associar um Banco de Dados a um arquivo DBF, Paradox, etc. Não é possível! O Banco de Dados do Palm não possui conceito de Campos, Índices e Chave Primária (Apesar de existir um Identificador único do registro). O PDB é uma estrutura seqüencial de registros que podem ser classificados na hora da inserção de um novo registro ou mesmo depois, através de uma função da API do PalmOS. O desenvolvedor é responsável por determinar como os dados serão gravados nos registros, o tamanho de cada registro (porque os registros não precisam ter o mesmo tamanho). Só como um exemplo, para classificar um arquivo, é necessária uma função Callback, isto é, uma função provida pelo desenvolvedor, que o PalmOS chama durante uma operação de classificação de registros. Falaremos mais sobre este assunto em outro artigo específico sobre a Programação voltada a Banco de Dados.

Estrutura Física

        O formato PDB é composto de blocos com tamanho variável, exceto o Header que contém sempre 72 bytes. Cada bloco representa um conjunto de informações dentro do Banco de Dados. Veja o desenho dos blocos abaixo:

 

Tabela I

 

Header do Banco de Dados (Tamanho Fixo 72 bytes)

 

Lista de Entradas de Registros (Tamanho variável)

 

AppInfo Block (Opcional, Tamanho Variável)

 

SortInfo Block (Opcional, Tamanho Variável)

 

Entradas de Registros (Tamanho Variável)

 

Detalhamento dos Blocos

Header

        No Header, são gravadas informações que identificam o Banco de Dados no PalmOS e estão detalhadas as localizações dos blocos de informações dentro do Banco de Dados. A estrutura apresentada abaixo, detalha cada parte do Header, começando pela posição 1, como o primeiro byte do Bloco.

Tabela II

Posição Tamanho

Conteúdo

1 a 32 32 Nome genérico do Banco de Dados. Exemplo: “Banco_Generico”. Os bytes que não forem usados após o nome devem ser preenchidos com ZERO. Este nome aparece na Lista “Info”, de Bancos de Dados Instalados no Palm.
33 a 34 2 Flags do Banco de Dados. 16 Bits contendo detalhes sobre características do Banco de Dados no PalmOS.0x0002 – Somente para Leitura0x0004 – AppInfoBlock Modificada

0x0008 – Se Setado, o HotSync fará o Backup do Banco de Dados

0x0010 – OK para instalar sobre uma cópia já existente no Palm

0x0020 – Força RESET do Palm após instalar

0x0040 – Não permite envio do Banco via Infravermelho (Beaming)

35 a 36 2 Versão do Banco de Dados, informada pelo desenvolvedor.
37 a 40 4 Data de Criação do Banco de Dados: Observação sobre dadas no PalmOS: O PalmOS armazena datas computadas em Segundos desde Zero Hora de 01/01/1904. No Windows, a função time(), retorna Segundos desde Zero Hora de 01/01/1970. Assim, para Converter uma data obtida da função time() da API do Windows para uma Data do PalmOS, acrescente o valor fixo decimal 2082844800 ao valor obtido de time().
41 a 44 4 Data de Modificação do Banco de Dados. Segue a regra de datas acima.
45 a 48 4 Data do Último Backup. Segue a regra de datas acima.
49 a 52 4 Número de Modificações no Banco de Dados.
53 a 56 4 Posição absoluta a partir do início do Header do Banco de Dados, identificando a localização do AppInfo Block. Se não houver AppInfo Block no Arquivo, os quatro bytes são preenchidos com Zero.
57 a 60 4 Posição absoluta a partir do início do Header do Banco de Dados, identificando a localização do SortInfo Block. Se não houver SortInfo Block no Arquivo, os quatro bytes são preenchidos com Zero.
61 a 64 4
65 a 68 4
69 a 72 4

Unique ID Seed. Raramente utilizado, serve para armazenar um número de identificador único para o PDB. Somente 3 bytes são utilizados, sendo que o quarto byte serve apenas para alinhamento dos bytes. Normalmente contém Zeros, pois não há documentação disponível para sua utilização.

Creator ID. Identificador único do criador do Banco de Dados. Se você pretende criar uma aplicação e distribuí-la para outros Palm Devices, é altamente recomendado que você registre um ID único na Palm, pois ele identificará cada desenvolvedor nesta plataforma. Se você utilizar qualquer identificação, poderá ocorrer conflitos em unidades que utilizem programas de outros desenvolvedores com o mesmo Creator ID. Consulte a página www.palmos.com/dev/tech/palmos/creatorid/

 

 

PDB Type. Quatro caracteres identificando o tipo do Banco de Dados. Esta informação mais o Identificador do Criador do Arquivo, é a forma maiscomum de abrir o Banco de Dados utilizando as funções da API do PalmOS.

        Nota: Alguns desenvolvedores citam que o Header do Banco de Dados Palm contém 78 bytes. Isso é devido a utilização de apenas uma Record List por Banco de Dados. Na documentação oficial da Palm, encontra-se detalhada a Record List da maneira que mostramos aqui. Por questão de flexibilidade e porque pode haver mais de uma Record List em um Banco de Dados (raro, mas possível), detalhamos o Header com 72 bytes que são realmente fixos dentro de um Banco de Dados Palm e detalhamos a estrutura da Record List separadamente.

 

Lista de Entradas de Registros (Record List)

        A Record List funciona como um índice seqüencial, ou relação de todos os registros gravados no Banco de Dados. Contém entradas informando a Posição Absoluta (em bytes) dos registros a partir do Início do Header. A primeira entrada corresponde ao primeiro registro do Banco de Dados, e assim por diante. Cada Entrada de Registro tem 8 bytes. Veja o detalhamento abaixo:

Tabela III

Posição

Tamanho

Conteúdo

1 a 4

4

Posição Absoluta (em bytes) a partir do início do Header onde começa a próxima Record List (Como dissemos logo acima, raro, porém possível). Normalmente contém Zeros.

5 a 6

2

Número de Entradas de Registros na Record List (Consequentemente, número de registros no Banco de Dados). Observação importante: se o Banco de Dados estiver vazio, as duas próximas posições (7e8) devem ser preenchidas com Zeros, indicando final do Banco de Dados.

7

8

Primeira Entrada de Registro com tamanho de 8 bytes. Os registros são identificados seqüencialmente a partir do primeiro até o último.

 

Entradas de Registros

Tabela IV

Posição

Tamanho

Conteúdo

1 a 4

4

Posição Absoluta (em bytes) a partir do início do Header onde começa o Registro no Banco de Dados.

5

1

Atributos do Registro (Vide Tabela abaixo).

6 a 8

3

Identificador único do Registro (Unique ID). Este identificador é estabelecido automaticamente pelo PalmOS quando o registro é criado. É possível alterar o valor do Unique ID, porém não há garantias que esse número seja preservado no próximo HotSync.

 

Atributos do Registro

Tabela V

Bit

Significado

0,1,2,3

Identificam a Categoria à qual o Registro pertence (Vide AppInfo abaixo sobre Categorias)

4

Registro marcado como Secret (Privado)

5

Registro marcado como Busy (Ocupado pelo Sistema Operacional)

6

Registro marcado como Dirty (Modificado recentemente)

7

Registro marcado como Deleted (Apagado, porém não removido ainda).

        Dentro do Sistema, podemos comparar os bits através de operações de AND lógico e identificar os atributos do registro. Exemplo:

        Atributo & 0x10 = Secret

        Atributo & 0x20 = Busy

        Atributo & 0x40 = Dirty

        Atributo & 0x80 = Deleted

        Atributo & 0xf0 = Todos os atributos setados

        Atributo = 0 Registro Normal (Sem atributos especiais)

        Existem constantes que identificam estes valores dentro do PalmOS. Veremos esse assunto quando estivermos falando da API do Banco de Dados.

 

AppInfo Block

        O AppInfo Block é uma área que pode ser utilizada dentro de um Banco de Dados para guardar qualquer tipo de informação que o desenvolvedor achar necessário. Por exemplo: como dissemos anteriormente, no formato PDB não há definições de campos, tipos de dados, etc. Para suprir essa dificuldade, é comum utilizar o AppInfo Block para gravar infomações a estrutura de campos. Isso fica a critério do desenvolvedor, não há nenhuma API do PalmOS para tal finalidade.

        Outra característica do AppInfo Block é que nele é gravado o conjunto de Categorias de um Banco de Dados. Categorias (Categories no PalmOS) são classificações que são aplicadas à registros de um Banco de Dados. Cada registro pode ser associado à uma Categoria e o PalmOS dispõe de rotinas que permitem filtrar a busca de registros por categoria. Um exemplo típico do uso de Categorias é a aplicação Address do Palm. Nesta aplicação, é possível classificar os registros como Business, Personal, QuickList, etc. São permitidas 16 Categorias por Banco de Dados, sendo que normalmente a primeira da lista é criada com o nome “Unfiled”, para indicar que o registro não foi classificado em nenhuma categoria (default).

 

Estrutura da Category Data dentro do AppInfo Block

Tabela VI

Posição

Tamanho

Conteúdo

1

2

16 bits indicando qual das 16 categorias foi renomeada. É um controle para a aplicação de HotSync que houve mudança nas Categorias.

3

256

Array de 16 strings terminadas em Zero (NULL terminated), com 16 bytes cada string, representando o nome de cada uma das 16 categorias do Banco de Dados. Se forem classificadas menos do que 16 categorias, deve-se inicializar as outras com Zero.

259

16

Array de 16 bytes representando o código de identificação de cada Categoria (ID). Normalmente é inicializado com valores de 1 a 16.

275

1

Último código de categoria utilizado (ID).

276

1

Um byte não utilizado (Somente para alinhamento de bytes dentro da estrutura).

        O PalmOS dispõe de rotinas de inicialização da Category Data em sua API, porém, se o desenvolvedor estiver gerando um arquivo PDB com sua própria ferramenta, deve estar atento para gerar a estrutura das categorias na ordem correta.

        Dentro do AppInfo Block, logo após o bloco de categorias, o desenvolvedor pode colocar os dados específicos de sua aplicação.

 

SortInfo Block

        O SortInfo Block é uma área dentro do PDB destinada a aplicações específicas do desenvolvedor. Não tem fomato predefinido, nem tamanho. Sua localização é dada pela posição absoluta dentro do Banco de Dados, através do campo específico no Header do PDB. A maioria das aplicações não usa o SortInfo Block e algumas publicações informam que versões antigas do HotSync não suportam o Backup do SortInfo Block do Bancos de Dados.

 

Entradas de Registros

        Os registros que foram apontados na Record List, são colocados logo após o último bloco de dados específicos da aplicação (AppInfo/SortInfo) se houver. Como já dissemos os registros não tem formato, nem padrão de gravação, tamanho, etc (são conhecidos como Raw Data). A única consistência é que a posição absoluta (em bytes) do registro dentro do PDB seja indicada na sua entrada correspondente na Record List.

 

Considerações Finais

        É muito importante ressaltar a maneira como os bytes são armazenados nos processadores Motorola. Para quem costuma “escovar bits” na plataforma Intel, sabe que os bytes são gravados em ordem inversa, por exemplo: o valor 0x0001 é gravado na memória como “01 00”. Esta notação é chamada de “Little Endian” pelos desenvolvedores. Já no PalmOS o byte mais significativo vem primeiro, por exemplo: o valor 0x0001 é gravado como “00 01” na memória. Essa notação é chamada de “Big Endian”. Os desenvolvedores dizem que essa notação foi tirada das histórias de “Gulliver”, onde as tribos rivais “Big Endians e Little Endians” brigavam porque divergiam da maneira que deveriam quebrar os ovos. Um lado achava que a maneira correta de quebrar um ovo era pela parte de cima, o outro pela parte de baixo… Interessante como isso veio parar aqui, não?

        Esperamos que este artigo possa contribuir com o desenvolvedor, elucidando alguns pontos importantes dos Bancos de Dados da plataforma PalmOS. Qualquer sugestão, correção ou crítica envie para admin@clubepalm.com.br. Se necessitar de alguma ajuda adicional, escreva para suporte@clubepalm.com.br. Até a próxima!

Marcio Alexandroni
ClubePalm – A referência do Desenvolvedor PalmOS.

Compatilhe esse artigo!

Leave a Reply

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

This site uses Akismet to reduce spam. Learn how your comment data is processed.