Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
UNIVERSIDADE FEDERAL DE SANTA CATARINA CURSO DE CIÊNCIAS DA COMPUTAÇÃO
Elenice Colle Manganelli Juliano Romani
PROTOCOLOS DE SINCRONIZAÇÃO DE DADOS EM AMBIENTES WIRELESS: UM ESTUDO DE
CASO
Trabalho de Conclusão de Curso submetido à Universidade Federal de Santa Catarina como parte dos requisitos para a obtenção do grau de Bacharel em Ciências da Computação.
Orientador: Mário Antônio Ribeiro Dantas
Florianópolis-SC, fevereiro de 2004.
ii
PROTOCOLOS DE SINCRONIZAÇÃO DE DADOS EM AMBIENTES WIRELESS: UM ESTUDO DE
CASO
Elenice Colle Manganelli
Juliano Romani
________________________________
José Mazzucco Jr. Coordenador do Curso
Banca Examinadora:
________________________________
Prof. Mário Antônio Ribeiro Dantas Orientador
________________________________
Prof. Rosvelter J. Coelho da Costa
______________________________
Prof. Roberto Willrich
iv
AGRADECIMENTOS
Agradecemos ao professores que nos apoiaram, as nossas famílias que agüentaram a
gente, e a 992, a Pior Turma de Todos os Tempos.
v
RESUMO
Atualmente, tem se verificado um grande crescimento na utilização da
computação móvel. Um dos fatores que podem explicar essa tendência é o
desenvolvimento de novos recursos computacionais, com uma maior capacidade de
processamento e armazenamento nos dispositivos móveis, bem como o aumento das
taxas de transmissão em redes wireless. Uma importante característica na sincronização
dos dispositivos móveis é o protocolo de sincronização de dados utilizado. Porém,
algumas considerações precisam ser analisadas na escolha, tais como: memória
disponível no dispositivo, a rede que vai ser utilizada (a taxa de transmissão, etc.). O
problema fundamental é encontrar um protocolo de sincronização de dados que atenda
aos problemas identificados. Neste trabalho é apresentada uma análise comparativa de
diferentes protocolos de sincronização de dados, baseando-se em um estudo de caso
experimental feito em uma plataforma convencional. Os resultados indicam algumas
soluções para o desenvolvimento na plataforma PalmOS e uma análise comparativa dos
protocolos HotSync e SyncML.
vi
ABSTRACT
Currently, it has verified a great growth in the use of the mobile computation.
One of the factors that can explain this trend is the development of new computational
resources, with a bigger capacity of processing and storage in the mobile devices, as
well as the increase of the taxes of transmission in wireless networks. An important
characteristic in the synchronization of the mobile devices is the used data
synchronization protocol . However, some considerations need is analyzed in the
choice, such as: available memory of the device, the network that go to be used (the tax
of transmission, etc.). The basic problem is to find a data synchronization protocol that
takes care of to the identified problems. In this work an analysis of different data
synchronization protocols is presented, being based on a study of made experimental
case in a conventional platform. The results indicate solutions for the development in
the PalmOS platform and an comparative analysis of the protocols HotSync and
SyncML.
vii
SUMÁRIO
CAPÍTULO I
1. INTRODUÇÃO......................................................................................................... 01
CAPÍTULO II
2. COMPUTAÇÃO MÓVEL........................................................................................ 03
2.1. Evolução da Computação Móvel ..................................................................... 03
2.2. Computadores Móveis ..................................................................................... 06
2.3. Computadores Fixos ........................................................................................ 07
2.4. Tecnologias sem Fio ........................................................................................ 07
2.4.1. Bluetooth.................................................................................................. 07
2.4.2. LANs sem Fio.......................................................................................... 08
2.4.3. Tecnologia Celular .................................................................................. 09
2.4.3.1.GSM ............................................................................................. 09
2.4.3.2.EDGE ............................................................................................ 10
2.4.3.3.GPRS ............................................................................................. 11
2.4.3.4.CDMA ........................................................................................... 12
2.5. Características da Computação Móvel............................................................. 13
2.5.1. Mobilidade ............................................................................................... 14
viii
2.5.2. Portabilidade ............................................................................................ 15
2.5.2.1. Pouca Bateria................................................................................ 16
2.5.2.2. Falta de Segurança na Informação................................................ 16
2.5.2.3. Pequena Interface com o Usuário................................................. 16
2.5.2.4. Pouca capacidade de armazenamento........................................... 17
2.5.3. Adaptação ................................................................................................ 17
2.5.4. Desconexão .............................................................................................. 17
2.6. Modelos Computacionais Móveis.................................................................... 19
2.6.1. Modelo Cliente/Servidor.......................................................................... 19
2.6.1.1. Modelo Cliente/Agente/Servidor .................................................. 20
2.6.1.2. Modelo Cliente/Interceptador/Servidor ........................................ 21
2.6.2. Modelo Peer-to-Peer ................................................................................ 22
2.6.3. Modelo de Agentes Móveis ..................................................................... 22
CAPÍTULO III
3. BANCO DE DADOS MÓVEIS................................................................................ 24
3.1. Características dos Banco de Dados Móveis ................................................... 25
3.1.1. Caching ................................................................................................... 25
3.1.2. Replicação .............................................................................................. 26
3.1.3. Difusão de dados .................................................................................... 27
ix
3.2. Transações Móveis .......................................................................................... 27
3.2.1. Propriedades das Transações Móveis ..................................................... 28
3.2.1.1. Atomicidade ................................................................................ 28
3.2.1.2. Consistência................................................................................. 29
3.2.1.3. Isolamento ................................................................................... 30
3.2.1.4. Durabilidade ................................................................................ 31
3.3. Modelos de Transações Móveis ........................................................................ 31
3.4. Processamento de Consultas.............................................................................. 33
3.5. Recuperação de Falhas ...................................................................................... 34
3.5.1. Localização................................................................................................ 36
3.5.2. Desconexão................................................................................................ 36
3.5.3. Energia....................................................................................................... 36
3.5.4. Rede........................................................................................................... 37
3.5.5. Falhas......................................................................................................... 37
3.5.6. Estratégias de Recuperação ....................................................................... 37
CAPÍTULO IV
4. TECNOLOGIAS DE SINCRONIZAÇÃO ............................................................... 41
4.1. Tipos de Sincronização ................................................................................... 41
4.1.1. One-Way................................................................................................. 41
x
4.1.2. Two-Way................................................................................................ 42
4.2. Protocolos de Sincronização ........................................................................... 42
4.2.1. Hotsync ................................................................................................... 44
4.2.2. Intellisync ............................................................................................... 45
4.2.3. SyncML .................................................................................................. 46
4.2.4. CPISync.................................................................................................. 50
CAPÍTULO V
5. AMBIENTE EXPERIMENTAL E RESULTADOS OBTIDOS .............................. 51
5.1. Descrição do Ambiente Utilizado................................................................... 51
5.2. Iniciando o Desenvolvimento na Plataforma PalmOS..................................... 52
5.2.1. PDB......................................................................................................... 53
5.2.2. PRC e Runtime ....................................................................................... 59
5.2.3. Conduit ................................................................................................... 60
5.2.4. Ferramentas de Desenvolvimento .......................................................... 62
5.3. Protótipo Desenvolvido ................................................................................... 64
5.3.1. O Programa Cliente................................................................................. 66
5.3.2. Descrição do Banco de Dados do Cliente .............................................. 68
5.3.3. O Módulo Conduit.................................................................................. 69
xi
5.4. Protocolos de Sincronização Investigados ........................................................ 69
CAPÍTULO VI
6. CONCLUSÕES E TRABALHOS FUTUROS .................................................... 73
REFERÊNCIAS BIBLIOGRÁFICAS ...................................................................... 76
ANEXOS ...................................................................................................................... 80
xii
ÍNDICE DE FIGURAS
FIGURA 1 – Dispositivos Móveis .................................................................................. 6
FIGURA 2 – Rede Fixa ................................................................................................... 7
FIGURA 3 – Estados de uma Operação de Desconexão............................................... 19
FIGURA 4 – Modelo Cliente/Servidor ......................................................................... 20
FIGURA 5 – Modelo Cliente/Agente/Servidor............................................................. 21
FIGURA 6 – Modelo Cliente/Interceptador/Servidor ................................................... 22
FIGURA 7 – HandOff – Estratégia de Recuperação..................................................... 39
FIGURA 8 – O Pentágono da Sincronização em Ambientes Móveis........................... 43
FIGURA 9 – Servidor Intellisync.................................................................................. 46
FIGURA 10 – Servidor SyncML .................................................................................. 47
FIGURA 11 – Interface do Cliente................................................................................ 65
FIGURA 12 – Estrutura do Sistema.............................................................................. 67
FIGURA 13 – Volume de Dados HotSync e SyncML (Slow)...................................... 70
FIGURA 14 – Volume de Dados HotSync e SyncML (Fast e Normal) ....................... 71
xiii
ÍNDICE DE TABELAS
TABELA 1 – Distribuição dos Blocos no PDB ............................................................ 54
TABELA 2 – Descrição do Header............................................................................... 54
TABELA 3 – Lista de Entradas de Registros................................................................ 56
TABELA 4 – Entradas de Registros ............................................................................. 56
TABELA 5 – Atributos dos Registros........................................................................... 57
TABELA 6 – Estrutura da Category ............................................................................. 58
TABELA 7 – Ferramentas de desenvolvimento para PalmOS ..................................... 63
TABELA 8 – Propriedades dos Protocolos de Sincronização de Dados Estudados..... 73
1
CAPÍTULO I
1. INTRODUÇÃO
Atualmente, com a ploriferação dos dispositivos móveis, os usuários são
providos de acesso a dados em qualquer lugar que estejam. Os sistemas que
fornecem esse acesso aos dados necessitam de novas tecnologias para gerenciar
e sincronizar dados, solucionando possíveis conflitos, verificando mudanças e
propagando as atualizações nos diversos dispositivos da sincronização.
Os protocolos de sincronização de dados para dispositivos móveis são
cuidadosamente criados para cobrir todos os problemas enfrentados. No caso
especial dos PDAs, que geralmente comunicam-se via serial, usb ou via wireless
com baixa largura de banda, possuem poder de processamento limitado, pouca
memória e pouca bateria espera-se que sempre estejam prontos para processar ou
transferir um grande volume de dados. Com esta visão levantada, existe a
necessidade que os protocolos de sincronização sejam eficientes o suficiente
para suprir as necessidades requeridas.
Este trabalho compreende o estudo e a experimentação dos protocolos de
sincronização de dados encontrados atualmente no mercado. Nossa pesquisa
também envolveu o desenvolvimento de um protótipo experimental de
sincronização de dados visando encontrar as dificuldades e facilidades de se
trabalhar com a computação móvel. A arquitetura empregada no experimento
incorporou ambientes de hardware convencionais e de baixo custo.
2
O objetivo principal deste trabalho é fornecer subsídios necessários para
o avanço da pesquisa científica, fornecendo as dificuldades e facilidades da
computação móvel e uma análise da performance dos protocolos de
sincronização de dados.
O trabalho é organizado como segue. O capítulo 2 fornece uma visão
geral sobre computação móvel, falando da evolução, das tecnologias sem fio,
das principais características e dos modelos de computação móvel. O capítulo 3
compreende a caracterização dos bancos de dados móveis, as transações móveis
e seus modelos, o processamento de consultas e a recuperação de falhas. No
capítulo 4 encontram-se as tecnologias de sincronização e os protocolos de
sincronização de dados estudados. O capítulo 5 expõe o ambiente experimental e
o protótipo desenvolvido. O capítulo 6 finaliza a pesquisa com as conclusões e a
perspectiva de trabalhos futuros.
3
CAPÍTULO II
2. COMPUTAÇÃO MÓVEL
A computação móvel tornou-se uma realidade na vida das pessoas com o
aparecimento de duas tecnologias: o aparecimento de computadores portáteis poderosos
e o desenvolvimento de redes rápidas e mais confiáveis (BARBARÁ,1999).
O ambiente da computação móvel não requer mais que os usuários mantenham
uma posição fixa na rede, permitindo assim uma grande mobilidade dos usuários.
O principal desafio da computação móvel é conseguir garantir o funcionamento
igualado aos dos computadores fixos, já que diversas restrições surgem com a
mobilidade, ou seja, é necessário ter um sistema de computadores distribuídos com
serviços comparáveis aos dos computadores fixos mas que permita mobilidade
(MATEUS & LOUREIRO, 1998).
2.1. Evolução da Computação Móvel
A evolução da computação móvel pode ser analisada através da evolução
tecnológica segundo Mateus & Loureiro (1998) até 1995 :
• 1820: Hans Christian Oersted descobre que a corrente elétrica produz
campo magnético; André Marie Ampère quantifica essa descoberta na lei de
Ampère;
4
• 1830: Joseph Henry descobre que a variação do campo magnético induz
corrente elétrica, mas quem publica o resultado é Michael Faraday, que
descobriu independentemente o mesmo resultado;
• 1864: James Clark Maxwell modifica a lei de Ampère e de Faraday e
desenvolve quatro operações sobre campos magnéticos;
• 1876: Alaxender Graham Bell inventa o telefone;
• 1896: Guglielmo Marconi inventa o telégrafo sem fio;
• 1907: Início do serviço de radiodifusão;
• 1914: Início da 1ª Guerra Mudial. Desenvolvimento rápido das
comunicações;
• 1921 : Radiodifusão entra em operação nos Estados Unidos;
• 1928: A Polícia de Detroit introduz um sistema de radiodifusão para
acionamento de carros;
• 1933: Quatro canais são autorizados para utilização na faixa de 30 – 40
MHz;
• 1935: A FM (Modulação em Freqüência) surge com alternativa para a AM
(Modulação em Amplitude) diminuindo o problema de ruídos;
• 1939: Grande avanço da comunicação via rádio com o advento da Segunda
Guerra Mundial;
• 1945: AT & T Bell Labs inicia experimentos na utilização de freqüências
mais altas objetivando melhorias nos serviços móveis;
• 1947: AT & T lança o IMTS (Improved Mobile Telephone Service), um
sistema onde apenas uma torre atendia uma grande área ou cidade. Em
seguida a AT & T Bell Labs propõe o conceito de celular;
5
• Anos 50: A faixa de transmissão é reduzida pela metade, onde sistemas
requeriam uma elevada banda de transmissão. Os primeiros sistemas de
paging começam a surgir;
• Anos 60: Um novo receptor de FM abre espaço para um maior número de
canais de comunicação com o mesmo espectro. Surgem aqui os primeiros
aparelhos portáteis;
• Anos 70: Um espectro de freqüência é alocado para os sistemas celulares.
Em 1979 é lançada a primeira rede celular no mundo, no Japão;
• 1983: O sistema celular evoluiu para os padrões atuais, sendo lançada a
primeira rede celular americana. Outros sistemas similares entram em
operação no mundo;
• 1991: Validação inicial nos Estados Unidos dos padrões TDMA e CDMA
de tecnologia celular;
• 1992: Introdução do sistema celular GSM (Groupe Spéciale Mobile);
• 1994: Introdução do sistema CPDC (Cellular Digital Packet Data). Início
dos serviços PCS (Personal Communication Services) CDMA e TDMA;
• 1995: Início dos projetos para cobertura terrestre de satélites de baixa
órbitra.
De acordo com PASTORE (2000) o número de usuários móveis excedeu 468
milhões em 2000, um número maior do que os usuários que utilizavam a internet, que
era 365 milhões.
6
2.2. Computadores Móveis
Computadores Móveis ou dispositivos móveis (PDAs, handhelds, Laptops,
celulares) possuem algumas vantagens com relação aos computadores fixos: são leves,
pequenos, pessoais, acessíveis, etc.
Mas por outro lado, as vantagens encontradas nos computadores móveis
acarretam um estreitamento de recursos, percebível facilmente aos abituados a utilizar a
computação fixa (DENARDI, 2003).
Os elementos móveis possuem geralmente pouca memória RAM, processadores
mais lentos, memória de armazenamento pequena e interface com o usuário limitada,
alguns exemplos de dispositivos móveis podem ser vistos na Figura 1.
FIGURA 1. Dispositivos Móveis. Fonte: MOB2003
7
2.3. Computadores Fixos
Os computadores fixos ou dispositivos fixos fazem parte de uma rede fixa cuja
localização e conectividade não mudam. Algumas das estações conectadas na rede fixa
podem servir como estações base de recursos, essas estações são também conhecidas
como servidores (ITO, 2001). Um exemplo de uma rede fixa pode ser vista na Figura 2.
FIGURA 2. Rede Fixa.
2.4. Tecnologias sem Fio
2.4.1. Bluetooth
A tecnologia wireless Bluetooth, segundo Dantas (2002), é um padrão de fato e
uma especificação para enlaces entre dispositivos móveis, usando ondas de rádio de
curto alcance. O Bluetooh Special Interest Group (SIG) é um grupo industrial formado
8
por empresas lideres em telecomunicações, computação e rede que estão dirigindo o
desenvolvimento da tecnologia e trazendo esta realidade para o mercado.
A proposta da tecnologia Bluetooth é habilitar os usuários para a conexão de
uma grande variedade de dispositivos de computação e telecomunicações de maneira
simples e fácil, sem a necessidade de cabos. Como a tecnologia é baseada em enlace via
rádio, é fácil a transmissão rápida e segura de voz e dados na rede. A operação do
Bluetooth é efetuada em uma banda de freqüência entre 2.402 e 2.480 GHz que está
globalmente disponível e tem compatibilidade mundial, sendo portanto um padrão
global para conectividade wireless. A tecnologia Bluetooth é muito resistente às
intempéries e dificuldades eletromagnéticas, o q garente que as interferências são
pequenas.
2.4.2. LANs sem Fio
Segundo GETIEEE802, o padrão de redes locais sem fio (802.11) define o
protocolo e a compatibilidade de interconexão de equipamentos de comunicação de
dados via ar, radio ou infravermelho em uma rede local (LAN) usando o "carrier sense
multiple access protocol with collision avoidance"(CSMA/CA) como mecanismo de
compartilhamento do meio. O controle de acesso ao meio (MAC) suporta operações
abaixo do controle do ponto de acesso assim como entre estações independentes. O
protocolo inclui autenticação, associação e reassociação de serviços, um procedimento
opcional de cifragem e descifragem, gerenciamento de energia. O padrão inclui a
definição de base de informação gerenciável (MIB) usando Abstract Syntax Notation 1
9
(ASN.1) e especifica o protocolo MAC formalmente, usando o Specification and
Description Language (SDL).
A camada física da implementação infravermelha suporta 1Mbit/s de taxa de
dados com uma extensão opcional de 2Mbit/s. A camada física da implementação do
rádio especifica também frequency-hopping spread spectrum (FHSS) suportando
1Mbit/s e um opcional 2Mbit/s de taxa de transferência ou direct sequence spread
spectrum (DSSS) suportando 1 e 2Mbit/s de taxa de transferência.
2.4.3. Tecnologia Celular
Algumas tecnologias celular serão descritas a seguir, segundo 3GAM (2003) :
• GSM
• EDGE
• GPRS
2.4.3.1. GSM
O Sistema Global de comunicações Móveis (GSM) é uma tecnologia sem fio de
segunda geração (2G) que provê serviços de qualidade de voz e de dados comutados por
circuito em uma ampla gama de faixas de espectro, que incluem 450, 850, 900, 1800 e
1900 MHz. GSM é uma tecnologia digital ou "PCS". Provê uma evolução sem
dificuldades e com bom custo-benefício para a terceira geração (3G). Estima-se que
10
GSM irá representar entre 80 e 85% dos clientes de próxima geração mundialmente,
segundo UMTS Fórum.
Em junho de 2003, GSM estava disponível via 665 redes em mais de 179 países.
É a tecnologia sem fio de uso predominante em termos mundiais, com mais de 880
milhões de clientes no continente americano, Ásia e Europa, o que representa 72% de
todos os clientes de tecnologia sem fio.
O GSM permite a vários usuários compartilharem um único canal de rádio
através de uma técnica denominada multiplexação por divisão de tempo (TDM), em que
um canal é dividido em seis intervalos de tempo. Designa-se para cada chamador um
intervalo de tempo específico de transmissão, que permite a vários chamadores
compartilhar um único canal simultaneamente sem interferência dos outros. Este
desenho viabiliza o uso eficiente do espectro e proporciona sete vezes mais capacidade
do que a analógica ou "AMPS", uma tecnologia de primeira geração (1G). GSM
também utiliza uma técnica chamada "salto de freqüências" que minimiza a
interferência proveniente de fontes externas e torna praticamente impossível o acesso
indevido a comunicações alheias.
2.4.3.2. EDGE
A EDGE (Taxas de Dados Ampliadas para a Evolução GSM) é uma tecnologia
de terceira geração (3G) de transmissão de dados e acesso à Internet de alta velocidade
que transmite dados em velocidade de até 473 kbps e taxa média entre 80 e 130 kbps.
As taxas médias são rápidas o suficiente para permitir um amplo leque de serviços de
11
dados avançados, incluindo streaming de som e imagem, acesso rápido à Internet e
download de arquivos pesados. A EDGE também suporta serviços "push-to-talk."
A EDGE às vezes é chamada de GPRS ampliada (E-GPRS; de Enhanced GPRS)
porque aumenta em três ou quatro vezes a capacidade e o throughput de dados da
GPRS. Assim como a GPRS, a EDGE é um serviço baseado em pacotes que oferece aos
clientes uma conexão permanente para transmissão de dados.
Assim como a conexão de banda larga por cabo e DSL, a EDGE oferece
conexão permanente à Internet, eliminando a necessidade de se conectar cada vez que
for usar, e os clientes podem receber serviços "pushed", tais como alertas da Bolsa. A
EDGE também permite que os clientes mantenham uma transmissão de dados enquanto
estão atendendo a uma ligação telefônica. Isto é totalmente único em tecnologias GSM.
2.4.3.3. GPRS
O Padrão de Transmissão de Rádio por Pacote (GPRS) é uma solução
espectralmente eficiente de dados móveis para novos serviços de dados mais rápidos e
roaming internacional. Como tecnologia de dados sem fio, GPRS oferece velocidades
máximas de dados de 115 kbps e um throughput médio de 30 a 40 kbps. GPRS é
freqüentemente chamada de tecnologia "2.5G" porque é a primeira etapa que uma
operadora GSM empreende quando inicia a transição à terceira geração (3G).
GPRS é uma tecnologia baseada em pacotes, o que significa que os dados são
divididos em pacotes e transmitidos em surtos breves via uma rede IP. Este desenho é
muito mais eficiente do que as redes comutadas por circuito e propicia uma redução dos
custos operativos da rede. O desenho de pacotes favorece os usuários principalmente de
duas maneiras: em primeiro lugar, GPRS provê uma conexão permanente de dados e
12
assim os usuários não precisam entrar no sistema cada vez que querem ter acesso a
serviços de dados. Em segundo lugar, os usuários só pagam pelos dados e não pagam
pelo tempo de permanência no ar em que se faz a conexão e nem pelo tempo de carregar
dados.
GPRS está baseada na plataforma GSM. GPRS está baseada em IP, padrão
universal utilizado na Internet, não num padrão unicamente de tecnologia sem fio que
requer equipamento proprietário. Ao utilizar uma tecnologia aberta e totalmente
padronizada, GPRS é ideal para o fornecimento de acesso sem fio a outras redes
baseadas em IP, como LANs corporativas e ISPs. Outra vantagem da base IP de GPRS
é que as operadoras e seus parceiros podem desenvolver e lançar serviços de dados
avançados muito mais rapidamente e a menor custo, fatores atribuídos à ampla
disponibilidade de "know-how IP" e equipamento pronto para usar.
Como a tecnologia sem fio de transmissão de dados por pacote mais amplamente
utilizada no mundo, GPRS se apóia na base de assinantes GSM, que já orça pelo bilhão,
e 665 redes GSM em mais de 179 países. Como GSM, GPRS suporta seamless roaming,
e portanto os usuários continuam tendo acesso a seus serviços de dados quando viajam.
Em junho de 2003, 162 operadoras em 70 países já haviam lançado GPRS. Mais 33
operadoras em outros 17 países estão em diferentes etapas de implantação.
2.4.3.4. CDMA
De acordo com CDG , o padrão CDMA (Code Division Multiple Access) é uma
tecnologia "spread spectrum", permitindo muitos usuarios ocuparem a mesma alocação
de tempo e freqüência em uma determinada banda/espaço. Como o próprio nome diz,
13
CDMA designa códigos únicos para cada comunicação para diferenciar de outras do
mesmo spectrum. Num mundo de recursos de spectrum finitos, CDMA habilita muito
mais pessoas para compartilhar as ondas emitidas ao mesmo tempo do que tecnologias
alternativas. O CDMA2000 representa a familia de tecnologia 3G que inclui
CDMA2000 1X e CDMA2000 1xEV:
• CDMA2000 1X pode dobrar a capacidade de voz da rede cdmaOne e entregar
pacotes de dados a uma velocidade máxima de 307kbps em ambientes móveis.
• CDMA2000 1xEV inclui:
1. CDMA2000 1xEV-DO: entrega pacotes de dados a uma velocidade
máxima de 2.4Mbps e suporta aplicações como transferencia de MP3 e
video conferencia.
2. CDMA2000 1xEV-DV: provê a integração de voz e tranmissão de
pacotes de dados e serviços multimídia simultaneamente em velocidades
de até 3.09Mbps.
3. 1xEV-DO e 1xEV-DV as duas são compatíveis com CDMA2000 1X e
cdmaOne.
2.5. Características da Computação Móvel
Computadores móveis requerem acesso a redes sem fio, embora possa às vezes
se unir fisicamente à uma rede fixa com uma conexão melhor e mais barata
permanecendo estacionários em reuniões em cima de uma mesa por exemplo.
14
Em uma comunicação sem fio é muito mais difícil conseguir uma comunicação
perfeita, pois existem muitos obstáculos que podem interferir no sinal, introduzindo
assim ruídos e ecos. As conexões sem fio possuem qualidade mais baixa que as
conexões fixas, pois possuem baixa largura de banda, taxas de erros elevadas e
desconexões mais freqüentes. Esses fatores podem aumentar a latência nos
retransmissores, atraso no intervalo de retransmissão, erro no processamento do
protocolo de controle e curtas desconexões (FORMAN & ZAHORJAN, 1994).
2.5.1. Mobilidade
Entende-se por mobilidade a capacidade que um dispositivo possui de se mover
pela rede. Nos deparamos com vários problemas provenientes da mobilidade.
Algumas das principais conseqüências da mobilidade são abordadas por SILVA
& ENDLER (2000):
• A inexistência de uma topoligia fixa de rede faz com que os algoritmos
existentes precisem ser reprojetados;
• A carga distribuída em uma rede com elementos móveis pode variar muito mais
rapidamente que em uma rede fixa;
• A localização de um elemento móvel na rede implica em um aumento no custo
de cada comunicação;
• Estruturas de dados e algoritmos são necessários para manter a localização dos
clientes móveis atualizada;
• A largura de banda, a latência da comunicação e a confiabilidade dos elementos
móveis podem variar muito;
15
• O número de serviços disponíveis de um elemento móvel podem variar de um
local para outro.
A mobilidade entre as células pode acarretar em interferência ou interrupção da
comunicação, assim como largura de banda reduzida podendo ocasionar várias
restrições na qualidade da transmissão dos dados (SONG. et al, 1999).
2.5.2. Portabilidade
Dentre todas as vantagens que um dispositivo móvel possui, ele ainda não atende
aos desejos de seus usuários, pois para eles ele deveria ser pequeno, pesar pouco, ser
durável, resistente à água e ter uma bateria de vida longa. Alguns problemas são
solucionados, mas outros não, como a bateria por exemplo, já que o dispositivo deve ser
leve.
Segundo FORMAN & ZAHORJAN (1994) quatro problemas ainda são
enfrentados devido à portabilidade do dispositivo, são eles:
• Pouca Bateria;
• Pouca Segurança da Informação;
• Pequena Interface com o Usuário e;
• Pouca Capacidade de Armazenamento.
16
2.5.2.1. Pouca Bateria
A bateria é a única fonte de energia para o dispositivo móvel e é também o que
mais pesa para ele. Uma solução que vem sendo estudada é o consumo menor de
energia das funções executadas pelo dispositivo. Vários fabricantes vêm desenvolvendo
projetos na arquitetura dos dispositivos para que consumam menos bateria. A bateria
pode ser conservada não somente pela arquitetura, mas também por um software mais
eficiente.
2.5.2.2. Falta de Segurança na Informação
Os computadores portáteis possuem riscos de danos físicos, de acesso
desautorizado, de perda e de roubo, isto pode acarretar na perca de privacidade, pela
violação de dados pessoais bem como a perca total dos dados. Esses riscos podem ser
reduzidos quando o dispositivo serve apenas como intermediador da comunicação e
atualização dos dados armazenados que ficam em um servidor fixo e seguro. E para
impedir a divulgação não autorizada da informação contida em um dispositivo roubado
ou perdido, os dados armazenados no disco ou em cartões de memória são
criptografados. Só que para isso ter efeito, os usuários não podem deixar sessões
autenticadas abertas. Em redes wireless sistemas de replicação resolvem o problema de
backup em computadores remotos, conservando a informação segura.
2.5.2.3. Pequena Interface com o Usuário
O tamanho de um dispositivo portátil limita muito a interface com o usuário, as
tecnologias de janelas dos softwares atuais é inadequada devido ao tamanho da tela.
17
Barras de tarefas ou títulos ocupam muito espaço na tela e por isso são consideradas
desnecessárias. Várias maneiras de aumentar a interface ou pelo menos dar a impressão
que ela foi aumentada estão sendo estudadas.
Técnicas de reconhecimento da escrita e da fala são englobadas ao dispositivo
com o intuito de diminuir o tamanho e aumentar a durabilidade.
2.5.2.4. Pouca Capacidade de Armazenamento
A capacidade de armazenamento em um dispositivo móvel é limitada por
exigências físicas de tamanho e bateria. Embora os computadores em rede de hoje
possuam paginação remota, confiar na rede não é muito aconselhável para um
dispositivo móvel susceptível a desconexões regulares.
2.5.3. Adaptação
Todas as circunstâncias de um usuário móvel mudam constantemente devido a
sua locomoção no ambiente, para que as unidades móveis funcionem com sucesso é
necessário que estas unidades sejam adaptativas. STAYANARAYANAN (1996) define
uma faixa de estratégias para adaptação delimitada por dois extremos, Laissez-Faire e
Application-Transparent.
2.5.4. Desconexão
Os sistemas computadorizados de hoje dependem muito da rede a qual estão
ligados, podendo até parar de funcionar caso ocorram falhas na rede. A falha na rede é
de um interesse muito maior na computação móvel já que a comunicação sem fio é
18
muito susceptível a desconexão. Considera-se então o melhor computador móvel aquele
que tolera as desconexões à rede (FORMAN & ZAHORJAN, 1994).
Segundo PITOURA & SAMARAS (1998), as operações de desconexão
envolvem três estados distintos, como visto na Figura 3:
• Hoarding: carregamento de itens na unidade móvel. Os dados podem ser
replicados ou movidos a um cachê local, podendo ficar inacessíveis a outros
membros da rede;
• Operações Locais: período em que o dispositivo está desconectado da rede fixa
podendo realizar operações apenas dos dados que possue em memória, isso
ocorre após o hoarding. Caso os dados necessários não estejam disponíveis, é
criada uma fila para execução de operações futuras que ocorrerão na próxima
conexão à rede;
• Reconciliação: durante a reconexão os dados são atualizados na unidade fixa
conforme as informações provenientes dos dispositivos conectados.
Uma situação de atualização concorrente entra em funcionamento e deve ser
tratada por uma semântica correta para que não ocorra inconsistência nos dados
atualizados.
19
FIGURA 3 – Estados de uma operação de desconexão. Fonte: (PITOURA & SAMARAS, 1998).
Na comunicação sem fio as desconexões podem ser caracterizadas de formas
diferentes. As desconexões podem ser voluntárias ou forçadas. Nas desconexões
voluntárias o usuário ou dispositivo é quem desliga a conexão com o propósito de
diminuir o custo da tarifa, o consumo de energia ou a largura de banda. Na desconexão
forçada o usuário não pretendia desligar a conexão, mas ela acontece espontaneamente
por motivo de cobertura na área ou falta de sinal no local em que se encontra (MATEUS
& LOUREIRO, 1998).
2.6. Modelos Computacionais Móveis
2.6.1. Modelo Cliente/Servidor
Segundo SATYANARAYANAN (1996), são chamadas de aplicações clientes
àqueles sistemas computacionais que solicitam serviços para uma aplicação que está
Hoarding
Reintegração Operações locais
20
sendo executada em outro lugar ou sistema operacional. Parte da comunicação é feita
por cabos fixos e na parte restante a comunicação é estabelecida por sinais de rádio, ou
seja, sem fio algum (Figura 4).
FIGURA 4 – Modelo Cliente/Servidor. Fonte: CUNHA (2003).
O dispositivo móvel faz o papel de cliente, enquanto o dispositivo fixo trabalha
como servidor. Podem existir vários servidores com funcionalidades distintas, dando
maior disponibilidade dos dados aos clientes.
Para MATEUS & LOUREIRO (1998) o modelo tradicional Cliente/Servidor não
atende a todos os requisitos necessários da computação móvel, por isso duas extensões
do modelo são discutidas a seguir: o Modelo Cliente/Agente/Servidor e o modelo
Cliente/Interceptador/Servidor.
2.6.1.1. Modelo Cliente/Agente/Servidor
Este é um modelo onde existem três partes: o cliente, que representa o
computador móvel, o servidor que é a estação na rede fixa e o agente que fica na rede
fixa e age em função do cliente (Figura 5). O agente simula a presença do cliente na
Aplicação cliente
Aplicação servidora
Unidade fixaUnidade móvel
Enlace sem fio
Rede fixaRede sem fio
21
rede fixa aliviando o impacto das falhas na comunicação, ele provê facilidades para
enfileirar mensagens a serem trocadas com o cliente móvel. O tempo de resposta entre
operações remotas pode diminuir, já que a carga de trabalho do servidor é menor.
Alguns problemas são encontrados nesse modelo; a necessidade de mudança do
cliente para comunicação com o agente e não mais com o servidor é um deles, outro
pode ser levantado no sentido de otimização, já que o agente otimiza a transmissão de
dados para o cliente móvel e não no sentido contrário.
FIGURA 5 – Modelo Cliente/Agente/Servidor. Fonte: CUNHA (2003).
2.6.1.2. Modelo Cliente/Interceptador/Servidor
Nesse modelo existem dois agentes, um fica na parte da rede fixa e outro na
parte móvel (Figura 6). Esses dois novos elementos são chamados de interceptadores ao
invés de agentes. O interceptador do lado do cliente intercepta chamadas do cliente e
junto com o outro interceptador executa otimizações para reduzir a comunicação no
lado sem fio e tentar manter a computação do cliente móvel sem interrupções.
Aplicação cliente
Aplicação servidora
Enlace sem fio
Unidade fixaUnidade móvelAgente
Rede fixa Rede sem fio
22
FIGURA 6 – Modelo Cliente/Interceptador/Servidor. Fonte: CUNHA (2003).
2.6.2. Modelo Peer-to-Peer
Neste modelo não existe distinção entre estações clientes e estações servidoras,
todas podem desempenhar tanto um papel como o outro. Esse modelo na computação
móvel faz com que os computadores tornem-se parceiros idênticos numa computação
distribuída (MATEUS & LOUREIRO, 1998).
2.6.3. Modelo de Agentes Móveis
Esse modelo trata a questão da mobilidade mais naturalmente podendo executar
um trabalho desconectado. Os agentes, descritos por PITOURA & SAMARAS (1998),
têm a capacidade de executar funções remotamente, sendo constituídos por instruções,
dados e um estado próprio. Além disso, possuem alguns aspectos que tornam viáveis a
execução de transações em ambientes móveis, tais como:
• Os agentes são tratados como objetos, quando ele é tranferido todo o objeto é
movido;
Aplicação cliente
Aplicação servidora
Enlace sem fio
Unidade fixaUnidade móvel
InterceptadorInterceptador
Rede fixa Rede sem fio
23
• O agente móvel não precisa ser executado de modo síncrono;
• Os agentes móveis ou objetos locais comunicam-se e trocam informações entre
si;
• Os agentes móveis podem executar operações mesmo estando desconectados;
• Tarefas em paralelo podem ser executadas por agentes distintos em diferentes
servidores.
24
CAPÍTULO III
3. BANCO DE DADOS MÓVEIS
A computação móvel está sendo utilizada nas mais diversas áreas de negócio,
incluindo a área de vendas, de empresas imobiliárias, empresas aéreas, de controle de
informação de trânsito e várias outras, principalmente nas grandes cidades.
Para que a mobilidade tenha efeito vantajoso existe a necessidade da utilização
de banco de dados para controle e armazenamento da informação. Um SGBD (Sistema
Gerenciador de Banco de Dados) tem como objetivo propiciar um ambiente conveniente
e eficiente para recuperação e armazenamento da informação (SILBERSCHATZ et al,
1999).
As aplicações que rodam em clientes móveis se conectam freqüentemente a
repositórios de dados remotos carregando somente as informações necessárias. Para isso
é necessário que o banco de dados tenha a capacidade de carregar as informações do
repositório e trabalhar com essa informação mesmo estando desconectado ou fora do
alcance do repositório. As informações atualizadas no cliente móvel enquanto ele estava
desconectado serão atualizadas na sua próxima conexão (BADRINATH & PHATAK,
1995).
25
3.1. Características dos Bancos de Dados Móveis
3.1.1. Caching
O mecanismo de caching é utilizado para otimizar o tempo de resposta nas
consultas da computação móvel e dar suporte quando a unidade móvel estiver
desconcetada.
Para que o mecanismo de caching atinja um bom resultado é necessário que estejam
definidas as estruturas de dados e as estratégias de gerenciamento do caching
consideradas as características de cada aplicação e o padrão de acesso aos dados
(FERREIRA & FINGER, 2000).
As operações sobre os dados podem ser divididas em três categorias segundo
DENARDI (2003):
• Dados somente para consulta: os dados não podem ser atualizados localmente e
conseqüentemente eles não são reintegrados em uma futura conexão ao banco de
dados remoto.
• Dados não concorrentes: atualizações locais podem ser feitas, mas os dados
replicados ficam bloqueados no servidor, evitando atualizações conflitantes.
• Dados concorrentes: os dados replicados podem ser alterados tanto no servidor
como no cache. Para que não ocorram conflitos o cache deve armazenar
informações sobre atualizações ocorridas para tomada de decisões.
26
3.1.2.Replicação
O sistema mantém cópias idênticas das relações inteiras ou partes dela que são
chamadas de réplicas e podem ser armazenadas em diversos pontos da rede.
Como na computação móvel as conexões podem ser raras, fracas e sem aviso
prévio, o computador móvel tem a necessidade de armazenar uma cópia local dos dados
necessários a fim de diminuir o custo com novas consultas e facilitar o trabalho em
modo desconectado (LUBINSKI & HEUER, 2000).
A replicação de dados é um dos problemas-chave em sistemas de computação
móvel. Um tratamento aplicável de replicação precisa de soluções novas que os
protocolos de replicação existentes não oferecem. Os sistemas atualmente em uso em
ambientes móveis sobrecarregam o usuário com a manutenção e consistência dos dados
replicados (LUBINSKI & HEUER, 2000).
Alguns requisitos precisam ser atingidos nas técnicas de replicação de dados,
segundo LUBINSKI & HEUER (2000):
• Alta disponibilidade de dados no dispositivo móvel, com o intuito de atingir
custos baixos e uma consistência de dados aceitável;
• Uso de informação de contexto semântico sobre o usuário, atributos da aplicação
e dos dados
27
3.1.3.Difusão de Dados
A difusão de dados, segundo BARBARÁ (1999), é a entrega de informações de um
conjunto de provedores para um grande número de clientes. Este processo de entrega de
informação é caracterizado pela assimetria nas comunicações. A largura de banda é
maior no sentido servidor-cliente do que no sentido cliente-servidor. Quando um
servidor recebe um pedido de dados ele localiza-o e retorna para o cliente os dados, este
modelo é chamado de pull-based. Quando a entrega dos dados é feita repetidamente
pelo servidor a um conjunto de clientes está se usando o modelo push-based. Neste
modelo o grande problema enfrentado é a decisão sobre quais itens de dados devem ser
disseminados.
3.2. Transações Móveis
Transação é uma coleção de operações que desempenham uma função lógica dentro
de uma aplicação do sistema de banco de dados. Cada transação é uma unidade de
atomicidade e consistência. As transações não devem violar nenhuma regra de
consistência no banco de dados. Portanto, o banco de dados que estava consistente antes
do início da transação deve permanecer consistente após o término da transação. No
entanto, durante a execução de uma transação, há a necessidade de aceitar
inconsistências temporárias. Estas inconsistências, embora necessárias, podem gerar
problemas caso ocorra uma falha (SILBERSCHATZ et al, 1999).
28
3.2.1. Propriedades das Transações Móveis
Para garantir que uma transação seja confiável e consistente e assegurar a
integridade dos dados, o sistema de banco de dados deve manter as propriedades de
atomicidade, consistência, isolamento e durabilidade que serão apresentadas a seguir.
3.2.1.1. Atomicidade
A transação deve ser atômica, ou seja, ela deve ser executada por completo, ou será
totalmente desfeita (SILBERSCHATZ et al, 1999). No caso de ocorrer qualquer
interrupção na execução da transação, é de responsabilidade do sistema gerenciador de
banco de dados determinar o que deve ser feito com a mesma ao se recuperar a falha. O
sistema de banco de dados mantém registrado os valores dos dados antes do início da
transação e só apaga essa cópia quando a transação for considerada confirmada. Caso
contrário, estes valores poderão ser restabelecidos.
Comumente, há dois tipos de falhas. O primeiro é quando uma falha ocorre por
erros nos dados de entrada, impasses ou alguma razão que impediria de concluir sua
tarefa com sucesso. No caso desta falha o aborto da transação pode ser executado pela
própria transação ou ainda pelo sistema gerenciador de banco de dados (SGBD),
caracterizando a recuperação de transações. O segundo tipo está ligado a quedas no
sistema, falhas de processadores, interrupções no canal de comunicação e assim por
diante. Este tipo de falha é involuntário à transação. A principal diferença entre esta
falha e a anterior, é que esta pode estar com dados ainda em memória volátil, o que
provocaria a perda dos dados.
29
3.2.1.2. Consistência
A consistência de uma transação é o banco de dados estar em um estado consistente
antes do início da transação a após o término da mesma continuar consistente.
Segundo ÖZSU & VALDURIEZ (2001), existe uma classificação quanto aos dados
sujos (valores de dados atualizados por uma transação mas ainda não confirmados), em
quatro graus de consistência:
• Transação com consistência de grau 3:
1ª consideração – a transação não sobrescreve dados sujos de outras
transações;
2ª consideração – a transação não consolida nenhuma gravação até concluir
todas as gravações, ou seja, até o final da transação completa;
3ª consideração – a transação não lê dados sujos de outras transações;
4ª consideração – outras transações não sujam quaisquer dados lidos por
esta transação até que esta seja executada por completo.
• Transação com consistência de grau 2: deve verificar as três primeiras
considerações acima citadas no grau 3.
• Transação com consistência de grau 1: deve verificar as duas primeiras
considerações citadas no grau 3.
• Transação com consistência de grau 0: deve verificar a primeira consideração
citada no grau 3.
Com estes graus de consistência é possível projetar aplicativos mais flexíveis e que
possam utilizar transações que operem em níveis diferentes.
30
3.2.1.3. Isolamento
O isolamento de uma transação garante que nenhuma outra transação visualize seus
resultados antes desta estar completa. O isolamento é um dos fatores mais importantes
para a manutenção da consistência entre as transações.
Considerando os graus de consistência vistos anteriormente, verifica-se que quanto
maior o grau de consistência maior deve ser o grau de isolamento. O isolamento das
transações permite que haja execução concorrente, ou seja, mais que uma transação
sendo executada simultaneamente.
Os níveis de isolamento são definidos segundo seu fenômeno (ÖSZU &
VALDURIEZ, 2001):
• Dados sujos: dados com valores já modificados por uma transação, mas não
efetivados ainda.
• Leitura não repetível ou leitura vaga: uma transação lê o valor de um item de
dados. Logo após outra transação elimina este item de dado e efetiva a
transação. Quando a primeira transação volta a ler o mesmo item e não o
encontra acaba gerando dois valores de leitura dentro de uma mesma transação.
• Fantasma: uma transação pesquisa em certos itens de dados, seguindo um
critério para a pesquisa, mas outra transação insere novas tuplas após essa
pesquisa. No momento em que a primeira transação pesquisa novemente haverá
mais dados que serão diferentes dos recuperados.
31
3.2.1.4. Durabilidade
Esta propriedade da transação garante que, uma vez executada e consolidada a
transação, seus resultados se tornem permanentes no banco de dados. Com isso, está
assegurado a permanência destes dados no banco, mesmo se ocorrerem falhas no
sistema.
3.3. Modelos de Transações Móveis
Segundo DUNHAM & KUMAR (1998) no passado pesquisadores tem
endereçado os problemas de processamento de informação móvel e nós classificamos os
aproximadores como reestruturação das transações ACID para processamento de
informação móvel e desenvolver um novo modelo de transação. Serão mostrados alguns
modelos de transações móveis.
Transação Kangaroo: é o primeiro e o único em redes móveis que inclui
movimento em sua estratégia de execução. O modelo é construido assumindo um multi
banco de dados onde o gerenciamento da transação é sempre desempenhado pela
estação base. Como a unidade móvel se movimenta, então o gerenciamento da transação
também se move. Cada transação é divida em subtransações que são executadas
independentemente do sistema de banco de dados da rede fixa.
Reporting e Co-transação: a origem das transações é representada em termos
de reporting, que pode compartilhar seu resultado parcial com a transação de origem a
qualquer hora e pode realizar a operação commint independentemente, e co-transações,
que é uma classe especial da transação de reporting, na qual pode ser forçada a esperar
por outras transações, depois de entregar seu resultado pode continuar a executar outras
32
operações. Essas duas transações podem ser executadas tranto na estação base como na
unidade móvel.
Clustering: assume um sistema totalmente distribuido, e é designado para
manter a consistência do banco de dados. O banco de dados é divido em cluster, e um
segundo nível de consistência dos dados é definido e mantido. Nesse modelo, uma
transação móvel é decomposta em um conjunto de transações fracas e completas. As
operações de leitura e escrita também são classificadas como fracas e completas. As
operações fracas são permitidas para acessar enquanto desconectadas. A transação pode
acessar ou atualizar dados na unidade móvel e pode se tornar inconsistente com os
dados da rede fixa.
Semantics Based: assume o processamento de uma transação móvel como um
problema de conexão e concorrência, podendo ter longos atrasos no processamento de
dados, bem como, desconexões. Essa abordagem utiliza a organização dos objetos para
dividir grandes e complexos objetos em pequenos fragmentos. O servidor do banco de
dados disponibiliza os fragmentos a pedido de uma unidade móvel. Para completar a
transação, a unidade móvel retorna os fragmentos para o servidor.
MDSTPM: é assumido que um Multidatabase Transaction Processing Manager
(MDSTPM) em cada unidade móvel. Cada componente do sistema de banco de dados é
responsável pelo gerenciamento das transações locais. Para facilitar a execução de
transações globais, uma camada de software adicional pode ser implementada,
permitindo o gerenciamento e coordenação de transações através dos múltiplos
componentes do sistema de gerenciamento (YEO & ZASLAVSKY, 1994).
33
3.4. Processamento de Consultas
Para se realizar uma consulta móvel, dependendo do caso, é necessário se ter a
localização exata da unidade. Podemos utilizar o GPS para consulta da localização, ou
através de uma triangulação das antenas que captam o sinal.
Como NASSU & FINGER (2000) disseram, quando um usuário faz uma
consulta diversos fatores contribuem no tempo de resposta do sistema, tais como:
• O tempo de transmissão de dados pode ser alto. A baixa taxa de transmissão dos
meios sem fio, a baixa confiabilidade, que pode gerar retransmissões freqüentes,
influem nesse tempo.
• A execução da consulta ao banco de dados pode ser demorada, principalmente
no caso em que as cidades são grandes, com grande número de ruas e
informações. O grande uso de forma concorrente também pode retardar o tempo
de resposta do banco de dados.
• O usuário pode estar desconectado da rede, por vontade própria ou não. O tempo
de desconexão pode ser longo e a resposta pode demorar mais para chegar ao
usuário que a solicitou.
A localização dos dados no processamento das consultas pode incluir dados
transientes, que trocam de valores de acordo com o processamento das consultas, e
dados contínuos, que são continuamente atualizados durante o movimento da unidade
móvel.
Em computação móvel, uma unidade móvel esta em constantes mudanças de
lugar. A localização depende dos dados existentes e o conjunto de dados e seus valores
são ligados com uma localização particular, onde respostas para consultas dependem de
34
onde são originadas. Então dependendo do lugar da consulta eu teria um resultado
diferente de uma consulta realizada em outro lugar.
Vários fatores são responsáveis pela posição do usuário após a consulta:
• Velocidade
• Aceleração
• Tipo de movimento, como uniforme, uniformimente variado, etc
• Direção
• Sentido
• Trajetória
• Tempo de processamento de consulta, demora na transmissão de dados,
desconexões ou quedas de sinal.
3.5. Recuperação de Falhas
É um processo responsável a preservar a consistência do banco de dados após
falhas do sistema, de transações ou de meios de comunicação.
Em sistemas distribuídos a recuperação de falhas é baseada em pontos de
recuperação, conhecidos como checkpoints. No caso de falhas e desconexões, a
aplicação usa o último checkpoint, salvo para reiniciar sua execução (PITOURA &
SAMARAS, 1998).
A unidade móvel deve estar sempre informada sobre qual célula se encontra e
quando o sistema entrará em modo de desconexão, pois ela é responsável por gerar um
checkpoint caso mude de célula ou haja uma desconexão. Um checkpoint global
consiste de um conjunto de checkpoints locais. Os estados globais são armazenados e
usados pelo protocolo para recuperar falhas das aplicações. Um estado global inclui o
35
estado de cada processo que faz parte da aplicação distribuída e possivelmente algumas
mensagens. Para uma recuperação correta, o protocolo pode salvar um estado
consistente global.
De acordo com (NEVES & FUCHS, 1997), os protocolos checkpoint são
classificados em duas categorias:
• Protocolos coordenados: a criação dos checkpoints é realizada em modo
conectado, para garantir a consistência e recuperabilidade do checkpoint global.
O protocolo requer o envio de mensagens para diferentes unidades móveis, para
que ocorra a sincronização no processo de checkpoint, e as vezes pode ocorrer
problema de desconexão.
• Protocolos não coordenados: permitem a criação de checkpoints independentes,
sem a necessidade de comunicação, desse modo, o processo pode continuar
durante as desconexões. No entanto, mensagens precisam ser trocadas durante a
recuperação para localizar o checkpoint global, exigindo a coleta de informações
sobre outras unidades móveis.
Devido às características como mobilidade, baixa largura de banda e
desconexões, protocolos coordenados e não coordenados são considerados inadequados
para o ambiente móvel (PITOURA & SAMARAS, 1998).
NEVES & FUCHS (1997) propõem um novo tipo de protocolo que armazena o
estado global sem troca de mensagens. Durante a execução da aplicação, o protocolo
mantém o estado global em um local fixo para recuperar falhas permanentes, falhas de
hardware, e outro em unidades móveis para recuperar falhas temporárias, falhas de
software.
36
Algumas características de um esquema de checkpoint em um ambiente móvel
são analisadas a seguir.
3.5.1. Localização
Para que exista a comunicação entre a rede fixa e a unidade móvel, é necessário
saber a localização exata desta última. A localização de uma unidade móvel dentro de
uma rede fixa não é constante devido a sua mobilidade. Uma unidade móvel precisa ser
localizada para depois determinar seu checkpoint. O protocolo pode também manter a
trilha dos lugares onde o estado do processo foi salvo.
3.5.2. Desconexão
Uma unidade móvel é dita desconectada quando esta fora da faixa de
transmissão dos emissores. Durante a desconexão, todas as informações armazenadas
em sites remotos não estão acessíveis às unidades móveis. Desta forma, uma unidade
móvel fica impossibilitada de enviar ou receber mensagens.
3.5.3. Energia
Devido às restrições oferecidas pelo tempo das baterias utilizadas pelos dispositivos
móveis o consumo das mesmas deve ser reduzido. O protocolo checkpoint tem a função
de reduzir a quantidade de informações que são adicionadas para as mensagens e evitar
o envio de mensagens extras, realizando o menos número possível de acessos ao
servidor.
37
3.5.4. Rede
A diversidade de tecnologias utilizadas em redes wireless faz com que as
características da rede não sejam constantes, tais como, custos, velocidade e latência. O
protocolo checkpoint deverá se adaptar as características da rede onde está atuando.
3.5.5. Falhas
Unidades móveis podem apresentar falhas de software, que são gerenciadas por soft
checkpoints e são armazenados localmente na unidade móvel, e de hardware, que são
gerenciadas por hard checkpoints e são armazenados na rede fixa. O protocolo
checkpoint deve fornecer mecanismos para tolerar os tipos de falhas que possam a vir
ocorrer com as unidades móveis.
3.5.6. Estratégias de Recuperação
Uma estratégia de recuperação essencialmente tem dois componentes, segundo
KRISHNA (1996): uma estratégia de state-saving e uma de handoff.
• State-saving – as estratégias apresentadas aqui são baseadas no tradicional
checkpointing e técnicas de message-logging. Nessas estratégias o host
periodicamente salva o estado em um lugar seguro. Então, numa falha do host, a
execução pode ser recomeçada do último checkpoint salvo. Duas estratégias de
recuperação salvando o estado do processo serão discutidas aqui:
o No Logging: o estado do processo pode ser alterado, tanto na recepção
de mensagem de outro host, ou tanto na entrada de dados pelo usuário.
As mensagens ou as entradas de dados que alteram o estado são
38
chamados eventos de escrita. Num acesso No Logging o estado de um
dipositivo móvel é salvo num servidor toda vez que ocorre um evento de
escrita no dispositivo móvel. Depois de uma falha, quando o dispositivo
móvel reinicializa, o dispositivo manda uma mensagem pro servidor, que
então transfere o último estado para o dispositivo móvel. O dispositivo
móvel então lê o ultimo estado e recomeça a operação. É importante
salientar que a necessidade de uma freqüente transmissão do estado o
link sem fio é um fator limitante para esse esquema.
o Logging: o dispositivo móvel verifca seu estado periodicamente. As
mensagens e entradas de dados que modificam o estado do dispositivo
móvel são armazenadas. Caso uma mensagem seja recebida de outro
usuário, a estação base primeiro a loga, e depois a envia para o
dispositivo móvel, para ser executada. Em uma entrada de dados pelo
usuário, o dispositivo primeiro envia uma cópia para a estação base para
logging e depois do reconhecimento do dispositivo móvel, processa a
entrada e envia uma resposta ao usuário. Este procedimento garante que
as mensagens ou entradas do usuário não sejam perdidas devido às falhas
que possam ocorrer.
• Handoff – um grande problema para a recuperação de dados é a mobilidade de
estações móveis de célula, não sendo possível à definição exata de sua
localização. A figura 7 representa a execução de um handoff. Os dispositivos
móveis 1 e 2 executam algoritmo distribuído.
39
FIGURA7 - Handoff – Estratégia de Recuperação
Na execução de um handoff, a estação base 2 armazena o checkpoint e as
mensagens de log do dispositivo móvel 2. Durante a execução, o dispositivo
móvel 2 se desloca para a célula da estação 3, e depois para a célula da estação
4. O processo de handoff ocorre entre os limites das estações 2 e 3, e entre as
estações 3 e 4. Se uma falha ocorrer entre o dispositivo móvel 2 até sua chegada
na estação 4, as informações poderão ser recuperadas devido ao seu
armazenamento na estação 2. Caso este processo não seja realizado, isto é, as
informações não sejam armazenadas, a estação base onde se encontra o
dispositivo móvel deverá identificar onde o checkpoint foi salvo. Este
procedimento poderá ser baseado em uma transferência durante o processo de
handoff sobre o estado do dispositivo móvel.
Existem três modos de transferir informações durante o handoff: pessimistic,
lazy, trickle.
Estação Base 4
Estação Base 3
Estação Base 2
Estação Base 1
Estação Base 5
Disp Móvel 1
Disp Móvel 2
Disp Móvel 2
Disp Móvel 2
Rede Fixa
40
Pessimistic: em um deslocamento de um dispositivo móvel de uma célula para
outra, o checkpoint é transferido durante o handoff. Caso a estratégia de logging
esteja sendo usada, a mensagem de log é transferida juntamente para a nova
célula da estação base. Uma vez recebido o checkpoint ou o log, a estação base
envia um reconhecimento para a estação anterior e esta cancela as informações,
desde que a unidade móvel não esteja mais em sua célula. A principal
desvantagem ;e que esta aproximação requer que um grande volume de dados
seja transferido durante o handoff.
Lazy: durante o handoff não há transferência de log e checkpoint. A estratégia
cria uma lista de estações base de células visitadas por um dispositivo móvel que
pode utilizar as estratégias de logging e not-logging descritas anteriormente. A
desvantagem desta estratégia é o armazenamento de checkpoints e logs em
diferentes estações base.
Tricle: garante que logs e checkpoint correspondentes a um dispositivo móvel,
estejam sempre na estação base mais próxima. Durante o handoff, uma
mensagem é enviada para a estação precedente para transferir qualquer log ou
checkpoint que tenha sido armazenado em um dispositivo móvel. Semelhante à
estratégia Lazy, a estação base corrente envia uma mensagem de controle para a
nova célula da estação base, identificando a localização da célula do dispositivo
móvel, que grava a autenticação do dispositivo móvel precedente.
41
CAPÍTULO IV
4. TECNOLOGIAS DE SINCRONIZAÇÃO
Para BADRINATH & PHATAK (2001) a sincronização em ambientes
móveis pode ser definida como o ato de estabelecer equivalência entre duas coleções de
dados, entre cliente e servidor, após a ocorrência de alteração nos registros
armazenados. Depois de sincronização de dados cada elemento de dados em uma
coleção é mapeado por um elemento de dados em outra, sendo que seus dados são
equivalentes, entretanto não necessariamente idênticos.
4.1. Tipos de Sincronização
4.1.1. One-Way
A sincronização One-Way compreende a transferência de atualizações de dados
em sentido único (PALAZZO & PULIOFITO, 2000). Após um dispositivo estabelecer
conexão com outro ele indica todas as alterações realizadas localmente. Após a
transmissão, os dados são aplicados no banco de dados do receptor. O dispositivo
receptor não recebe nenhuma mensagem de aceite ou erro na efetivação das requisições
ao banco de dados.
O plano One-Way pode ser aplicado de duas formas: no sentido cliente/servidor
ou ao contrário.
42
a) One-Way Cliente/Servidor
Nesse tipo de sincronização o cliente é responsável por inicia-la e submeter todas
as modificações ao servidor, mas o servidor não retorna o resultado final das ações
realizadas no banco de dados.
b) One-Way Servidor/Cliente
O servidor que inicia a transmissão, que conecta-se com o cliente e submete
todos os dados atualizados no banco de dados consolidado . Após terminar a
transferência, o cliente possui a versão atualizada de todos registros do banco de dados
do servidor. O servidor não captura nenhuma alteração feita pelo cliente.
4.1.2. Two-Way
A transmissão das modificações ocorre nos dois sentidos, tanto do cliente como
do servidor. A sincronização é iniciada pelo cliente. O servidor identifica e trata os
conflitos existentes retornando ao cliente os dados corretos. No final, o cliente e o
servidor possuem os mesmos dados.
4.2. Protocolos de Sincronização
Um protocolo de sincronização define o fluxo de trabalho para a comunicação
durante uma seção de sincronização de dados quando o dispositivo móvel é conectado à
rede fixa. Para BREITBART, KOMONDOOR, RASTOGI (1999), deve dar suporte a
identificação de registros, comandos de protocolo comuns para sincronização de dados
local e de rede, e poder apoiar a identificação e resolução de conflitos de sincronização.
43
Atualmente diversos fabricantes oferecem uma variedade de produtos de
sincronização de dados. Cada protocolo funciona apenas para transportes específicos
implementados para alguns dispositivos. A proliferação de tecnologias de sincronização
complica as tarefas de usuários, fabricantes de dispositivos, provedores de serviços e
desenvolvedores de aplicações. A falta de um protocolo de sincronização de dados
comum impede o crescimento do uso de dispositivos móveis, restringindo a habilidade
de usuários para ter acesso dados e limitando a entrega de operações realizadas sobre
dados móveis. Todos os protocolos tendem a alcançar o pentágono, Figura 8, mas
nenhum protocolo estudado alcança tal objetivo.
FIGURA 8 – O Pentágono da Sincronização em Ambientes Móveis
A sincronização entre dispositivos móveis é determinada por uma variedade de
fatores, incluindo a latência da sincronização, a quantidade de bateria utilizada, o custo
monetário envolvido (conexão a rede, tempo, etc.), a robustez e a confiabilidade da
rotina de sincronização. Um bom protocolo de sincronização é aquele que tende a estas
direções.
Os dispositivos móveis são limitados na comunicação devido às ligações de rede
que os conectam, possuem poderes computacionais limitados, memória e bateria
Volume de dados transmitido
Tamanho da rede
Memória Ponto central de falha
Computação
44
limitadas. Os vértices do Pentágono, Figura 8, representam a escalabilidade da
sincronização em dispositivos móveis. A computação e a comunicação têm ligação
direta com a latência e utilização da bateria. A memória dos dispositivos móveis é
limitada e nenhum protocolo que consumir muita memória será apropriado. Ao mesmo
tempo, nós desejamos desenvolver protocolos que permitam que um grande número
dispositivos na rede sincronizem entre si, que sejam robustos e preferivelmente peer-to-
peer em vez do centralizado, mantendo-se na linha com a natureza de redes ad-hoc .
Aplicações que reconciliam e solucionam mudanças em dados entre duas fontes
distintas são amplamente utilizadas por empresas de geração de softwares para sistemas
móveis. Porém, o mercado de sincronização atual consiste em soluções proprietárias
múltiplas, que não satisfazem todo o espectro de funcionalidades e o suporte requerido
aos dispositivos pela maioria das organizações. Muitas organizações não estão dispostas
a desenvolver múltiplos canais e a implementar várias soluções de sincronização para
permitir o acesso de múltiplos dispositivos a um único banco de dados devido à
complexidade e o custo de manutenção requerido.
4.2.1. Hotsync
Dispositivos Palm rodam na plataforma Palm Operating System que fornece o
protocolo HotSync para sincronizar os bancos de dados do Palm com o do micro
Desktop. O HotSync (PALMOS) opera em dois modos, dependendo do histórico de
sincronização do dispositivo com o micro computador em particular.
O FastSync ocorre quando o dispositivo sincroniza com o mesmo micro
computador que sincronizou pela última vez. Neste caso o dispositivo sincroniza
processando os registros baseados nas flags de status de cada registro que dizem se este
45
foi modificado, criado ou apagado. O FastSync é a melhor opção quando a
sincronização ocorre somente entre dois dispositivos, sendo que o dispositivo poderá
recordar flags de status somente de um micro computador.
O Slowsync ocorre quando a condição principal do Fastsync não é encontrada.
Neste caso o dispositivo transfere a base de dados inteira ao PC a ser trabalhado pela
comparação. Enquanto o espaço de armazenamento do dispositivo se torna maior e as
bases de dados se tornam maiores, a introdução da latência crescente envolvida em
transferir a base de dados inteira do PDA ao PC para a sincronização subseqüente torna-
se cada vez mais importante.
Mas pode-se dizer que com o avanço de tecnologias mais rápidas de conexão
dos dispositivos móveis com os PCs e as redes sem fio cada vez mais rápidas a latência
do slowsync se transforma um assunto tratável.
4.2.2. Intellisync
O Intellisync (PUMATECH), produto fabricado pela Pumatech, faz sempre a
sincronização do tipo Fastsync, utilizando um servidor central com o qual os
dispositivos móveis sincronizam sempre. Isto significa que todos os dispositivos
sincronizados têm que manter as flags de status das atualizações com respeito somente
ao usuário central, permitindo um Fastsync todas as vezes. A Figura 9 mostra uma rede
típica da companhia usando a arquitetura de Intellisync.
46
FIGURA 9 – Servidor Intellisync
Esta arquitetura não é projetada para o caso geral onde um dispositivo pode
sincronizar com outros dispositivo em uma rede do tipo peer-to-peer. No geral, uma
arquitetura distribuída baseada na sincronização do tipo peer-to-peer fornece o
desempenho muito melhor da rede, nos termos de robustez e escalabilidade, do que uma
rede centralizada.
4.2.3. SyncML
SyncML , segundo SYNCML (2002) é uma iniciativa da indústria aberta suportada
por muitas companhias, incluindo Ericsson, IBM, Lótus, Matsushita, Motorola, Nokia,
OpenWare e Starfish.
Pode ser considerada como uma linguagem padrão para sincronizar diferentes
dispositivos e aplicações sobre qualquer rede. Com o SyncML qualquer tipo de
informação pode ser sincronizada para manter a informação consistente e atualizada,
não importando a localização do dispositivo e da rede.
47
O protocolo possui as seguintes características:
• Opera efecientemente sobre redes wireless e com fios.
• Suporta uma variedade de protocolos de transporte, como HTTP, WSP, OBEX,
redes TCP/IP, SMTP, POP3, IMAP, e protocolos proprietários.
• Acesso a dados de uma variedade de aplicações.
A figura 10 mostra o SyncML framework. Este framework ajuda na análise de
implementação de um modelo de sistema associado com a implementação do SyncML.
Os blocos maiores desse framework é a representação do protocolo SyncML, conceitual
adaptador SyncML e a interface SyncML. O protocolo de sincronização de dados
SyncML está fora do framework SyncML para manter o framework de fácil
implementação e atividade conjunta.
FIGURA 10 – Servidor SyncML
48
A aplicação “A” descreve um serviço de rede que provê serviço de sincronização de
dados para a aplicação “B”. Vamos assumir que a aplicação “B” deseja se sincronizar
com a aplicação “A”. O serviço e o dispositivo são conectados sobre um protocolo de
transporte em comum, como HTTP. A aplicação “A” implementa o processo “Sync
Engine” utilizando o protocolo de sincronização de dados manifestando o acesso cliente
para o “Sync Server” – um recurso de rede. O “Sync Server Agent” se comunica entre
as aplicações cliente e o “Sync Engine” para gerenciar o acesso a rede e para e de as
comunicações. Invocando as funções definidas na interface SyncML para executar essas
capacidades. A interface SyncML não é nada mais que uma aplicação para o “SyncML
Adapter”. “SyncML Adapter” é um processo conceitual que pode ser considerado como
ponto de entrada e saída para a aplicação “A”.
Usando a representação de protocolo, SyncML é um protocolo de sincronização que
define como inicializar, sincronizar e encerrar a sincronização incluindo a troca de
dados entre os dispositivos sincronizados. SyncML é programado considerando ele
como um protocolo de sincronização comum, tendo cuidado nos casos onde os serviços
de rede e os dispositivos de armazenamento de dados que estão começando a ser
sincronizados estão em formatos diferentes ou sendo usados por diferentes programas.
Há sete tipos diferentes de sincronização definidas pelo SyncML, dependendo de como
a sincronização é inicializada pelo cliente eu servidor e a transferência de informação
entre eles.
1. Two-Way Sync: Este tipo de sincronização é o mais normal e largamente usado
onde o servidor e o cliente trocam somente os dados modificados no final.
Cliente é sempre esperado para começar a sincronização mandando as
modificações primeiro.
49
2. Slow Sync: Este tipo de sincronização como ser considerada como uma forma
de sincronização two-way com uma exceção de que o cliente envia o banco de
dados inteiro ao invés de somente as modificações, pedindo ao servidor para
preparar a analise da sincronização para os dados entre cliente e o servidor. O
servidor retorna sempre as modificações requeridas pelo cliente.
3. One-Way Sync from Client only: Somente durante este tipo de sincronização, o
cliente envia todas as modificações para o servidor, mas não espera nenhuma
modificação do servidor.
4. Refresh Sync from Client only: Este é um tipo especial de One-Way Sync from
Client , onde o cliente exporta todos os dados do banco de dados para o servidor.
O servidor é esperado repor os dados existentes com o banco de dados recebido
do cliente.
5. One-Way Sync from Server only: Este tipo de sincronização envia todos os
dados modificados do servidor para o cliente e não espera qualquer modificação
do cliente.
6. Refresh Sync from Server only: Este é um tipo especial de sincronização One-
Way Sync from Server, onde o servidor esporta todos os dados do banca de
dados para o cliente. O cliente é esperado repor os dados existentes com o banco
de dados recebido do servidor.
7. Server Alertd Sync: O servidor alerta o cliente para preparar uma sincronização.
Ele também diz ao cliente qual dos tipos de sincronização acima a ser usada
entre eles.
50
SyncML tenta conseguir potencialidades do Fastsync, requerendo que todos os
dispositivos da rede possuam flags de status para cada registro. Isso pode causar uma
demanda de memória muito grande. Onde a complexidade aumenta conforme o número
de dispositivos em rede. Isso não é sustentável em redes com vários dispositivos.
4.2.4. CPISync
Há muitas instâncias de sincronização de dados onde há necessidade de
sincronizar dados semelhantes em dispositivos diferentes. O CPISync, segundo
Trachtenberg, Starobinbki, e Agarwal (2001,2002), que é uma abreviação de
“Characteristc Polynominal Interpolation Syncronization”, faz a complexidade do
tempo da sincronização quase independente do tamanho do conjunto de dados a ser
sincronizado, e somente dependente do número de diferenças entre os dois conjuntos de
dados. Este é um contraste marcante em relação ao Slowsync que utiliza uma
transferência de dados inteira entre os hosts enquanto sincronizando os dados, fazendo a
sincronização dos dados um tempo linear em relação ao numero de registros no banco
de dados.
CPISync é baseado em uma solução recente para um conjunto de problemas de
reconcialização por Minsky, Trachtenberg e Zippel (2000) é escalável com o número
de dispositivos na rede e o tamanho do banco de dados a ser sincronizado. Esta solução
envolve mais recurso computacional comparado ao Slowsync, este recurso
computacional pode ser distribuído assimetricamente entre os hosts. Isto significa que
em casos onde os hosts tem capacidades computacionais diferentes (ex. PDA e PC), o
CPISync pode transferir mais dos recursos computacionais para o pc, permitindo uma
rápida execução do CPISync comparado a uma aproximação simétrica.
51
5. AMBIENTE EXPERIMENTAL E RESULTADOS OBTIDOS
Nosso ambiente experimental é composto por um cliente móvel representado por
um Palm M100 e um servidor fixo, um Atlon XP 1.4 GHz. A seguir descreveremos
todo o ambiente utilizado, as ferramentas de desenvolvimento utilizadas para
desenvolver o protótipo de sincronização e a análise comparativa dos protocolos de
sincronização de dados estudados.
5.1. Descrição do Ambiente Utilizado
Para nosso experimento utilizamos um cliente móvel que faz operações de
consulta e atualizações em um banco de dados consolidado pertencente a um servidor.
Por motivos burocráticos não foi possível conseguir dispositivos recentes a
tempo para nosso experimento, possuíamos apenas um dispositivo portátil, um Palm
M100, para fazer o papel de cliente.
Utilizamos um computador Atlon XP 1.4 GHz, rodando Windows XP como
servidor e um Palm M100 funcionando como cliente móvel. O PalmOS Emulator
(POSE) também foi utilizado funcionando como clientes móveis inexistentes.
A utilização do Emulador não é recomendada só para suprir a falta de um
dispositivo, mas sim para testar aplicações antes de serem instaladas nos dispositivos
físicos. No Emulador as aplicações rodam mais rápido e pode-se evitar um Hard Reset
caso a aplicação desenvolvida possua algum erro.
52
5.2. Iniciando o Desenvolvimento na Plataforma PalmOS
Quando iniciamos nosso projeto, a previsão que havia era a de conseguir
trabalhar com dois dispositivos portáteis adquiridos pela universidade, só que por vários
motivos não conseguimos os dispositivos a tempo. Tínhamos em mãos um Palm M100
e algumas idéias formuladas.
As principais dúvidas que surgiram foram a de “Como começar a desenvolver?”
e “Que ferramenta utilizar?”. Algumas dúvidas foram sendo esclarecidas ao longo de
todo o estudo desenvolvido e serão apresentadas a seguir.
A primeira coisa que tivemos que ter como pré-requisito antes do
desenvolvimento foi a de se habituar com o dispositivo que tínhamos disponível, o Palm
M100.
Após conhecer bem o Palm que iríamos trabalhar descobrimos a existência do
Emulador do PalmOS , o Palm OS Emulator (POSE). Assim poderíamos desenvolver
algum aplicativo e testá-lo no emulador. O emulador simula o funcionamento de
diversos modelos diferentes do Palm. Para simular cada modelo é necessário carregar a
ROM específica no emulador.
O emulador é uma ferramenta muito importante para desenvolvedores Palm, é
altamente recomendável que, antes de colocar a aplicação funcionar no Palm, teste-se
ela no emulador.
A maioria dos projetos para Palm envolvem dois tipos de programas:
53
- Aplicativo executado no Palm
Esse é o programa que será executado no Palm, desenvolvido com a ferramenta
de programação escolhida. Os caminhos para escolher a melhor ferramenta serão
descritos mais tarde.
- Conduit
O Conduit é uma DLL responsável pela troca de dados entre Palm e o Desktop
nos dois sentidos.
Atualmente existe uma variedade menor de ferramentas disponíveis para
produção dessas DLLs, comparada ao número de ferramentas disponíveis para o
desenvolvimento de aplicativos para o Palm.
Alguns conceitos sobre o desenvolvimento na plataforma PalmOS são descritos
a seguir.
5.2.1. PDB
O Palm Database (PDB) é o formato padrão que o PalmOS utiliza para
armazenamento de dados, em forma de registros. Apresentaremos aqui o modo como
são armazenados os dados dentro do PDB, as estruturas internas e os conceitos
envolvidos na sua utilização.
54
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 a disposição dos blocos abaixo:
TABELA 1- Distribuição dos Blocos no PDB
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 2 – Descrição do Header
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 Leitura
0x0004 – AppInfoBlock Modificada
0x0008 – Se Setado, o HotSync fará o Backup do
55
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. 41 a 44 4 Data de Modificação do Banco de Dados. 45 a 48 4 Data do Último Backup. 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 PDB Type. Quatro caracteres identificando o tipo do Banco de Dados. Esta informação mais o Identificador do Criador do Arquivo, é a forma mais comum de abrir o Banco de Dados utilizando as funções da API do PalmOS.
65 a 68 4 Creator ID. Identificador único do criador do Banco de Dados.
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.
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
56
(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 3 – Lista de Entradas de Registros
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 (7 a 8) 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 4 – Entradas de Registros
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.
57
Atributos do Registro
TABELA 5 –Atributos do Registro
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
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. 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 aplicadas aos 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
58
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 6 – Estrutura da Category
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 arquivo PDB for gerado com uma ferramenta específica, deve se ficar atento para
gerar a estrutura das categorias na ordem correta.
Dentro do AppInfo Block, logo após o bloco de categorias, podem ser colocados os
dados específicos da aplicação.
59
SortInfo Block
O SortInfo Block é uma área dentro do PDB destinada a aplicações específicas.
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.
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.
5.2.2. PRC e Runtime
PRC é a extensão do aplicativo desenvolvido para rodar no Palm. Em linguagem
simplificada, é equivalente ao “.EXE” ao qual estamos acostumados.
Algumas ferramentas simplesmente geram um PRC, após o processo de
compilação.
60
Outras ferramentas trabalham com run-time, ou seja, em modo interpretado.
Geralmente o run-time é instalado no Palm durante o processo de instalação da própria
ferramenta. Nem sempre o arquivo gerado fica visível, mas o importante é que ele é
transportado para o Palm durante o próximo HotSync, juntando-se ao run-time da
ferramenta. Ao ser executado, o run-time aciona o aplicativo, interpretando os
comandos e executando-o.
Dependendo da ferramenta utilizada não há como optar em desenvolver o próprio
Conduit e pode-se ficar sujeito a trabalhar com o Conduit nativo da ferramenta, e toda
troca de dados estará sujeita às regras da ferramenta. Com isso, perde-se muita
flexibilidade.
5.2.3. Conduit
O Conduit, que é uma DLL ativada durante o processo de sincronização. O
Conduit tem a capacidade de importar, exportar e sincronizar dados entre o dispositivo
móvel e o desktop. Ele pode utilizar o tipo de transferência que achar mais conveniente,
escolhendo entre one-way e two-way. Com ele podemos atualizar nosso banco de dados
móveis com o servidor e vice-versa.
Tipos de Conduit
- Conduit de Instalação: este conduit tem como finalidade instalar aplicações na
memória principal do dispositivo móvel ou em seu cartão de expansão. Geralmente este
61
conduit é ativado durante o processo de sincronização. Os aplicativos provenientes do
servidor são instalados no dispositivo móvel sem que este solicite.
- Conduit de Backup: este conduit faz uma cópia fiel dos dados localizados na unidade
móvel para o micro servidor.
- Conduit de Sincronização: sincroniza dados entre unidades móveis ou fixas. O
programador do conduit é quem indica o que irá ocorrer. Dados podem ser copiados ou
atualizados no desktop e vice-versa.
Em nosso experimento utilizamos um conduit de sincronização que
descreveremos mais tarde.
A DLL desenvolvida para a sincronização, chamada de Conduit, pode ser feita
através de algumas ferramentas:
• Delphi
• Visual C++
• Java e Visual Basic
A escolha da ferramenta vai depender necessariamente da habilidade com a
linguagem. Optamos por desenvolver nosso Conduit em Delphi, pois já temos
conhecimento nessa linguagem a algum tempo.
62
5.2.4. Ferramentas de Desenvolvimento
Existem diversas ferramentas para desenvolvimento de aplicações para
dispositivos móveis. As ferramentas não ficam distribuídas em melhores ou piores, mas
sim em as mais adequadas ao projeto específico. Para escolher a ferramenta levamos em
consideração alguns pontos relevantes:
- Tamanho e Performance do aplicativo X Facilidade e Rapidez de
desenvolvimento
É claro que os aplicativos desenvolvidos em liguagem C terão um tamanho bem
menor do que os demais e a performance poderá ser bem diferenciada. Entretanto, o
desenvolvimento em C requer tempo e habilidade por nós já esquecida. A flexibilidade
da linguagem C nos dá um poder muito grande, como por exemplo acessar todas as
funções do PalmOS. Mas a dificuldade em desenvolver é bem maior comparado a das
ferramentas "RAD" , o que implica no fator TEMPO, que é tão importante na hora de
dimensionar o prazo de um projeto.
Ficou claro que quanto maior a facilidade e rapidez de desenvolvimento, maior a
possibilidade de termos um aplicativo bem dimensionado, ou um aplicativo não tão
grande porém sujeito a trabalhar com run-time.
- Run-time
Avaliar o espaço ocupado e se a empresa cobra um custo por run-time.
63
- Preço dos Aplicativos
Avaliar o preço do aplicativo, ficar também atento à licença de uso por tempo
determinado, além da política de upgrades.
Podemos separar as ferramentas de desenvolvimento em categorias, onde os
principais termos de comparação são FLEXIBILIDADE x FACILIDADE/RAPIDEZ de
desenvolvimento.
Na categoria FÁCIL e RÁPIDO, porém pouco flexível, e ainda sujeito à run-time
presente no Palm, ficaram, entre outros, o Satelite Forms, o CASL Tools e o Pendragon
Forms. São ferramentas para desenvolvedores bem acostumados a desenvolver sistemas
em Delphi, VB e semelhantes.
Na categoria FLEXÍVEL e LEVE, porém com uma curva lenta de aprendizado,
com o pré-requisito de muito conhecimento em linguagem C, estão o CodeWarrior e o
GCC.
O CodeWarrior é o ambiente oficial de desenvolvimento para o PalmOS e
permite criar aplicações em ANSI C e C++ no Windows 95/98/NT e Macintosh.
O seguinte quadro comparativo foi criado para avaliação das ferramentas
encontradas:
Tabela 7 – Ferramentas de desenvolvimento para PalmOS
Ferramenta Runtime Flexibilidade Curva de Aprendizado Conduit próprio CodeWarrior Não Grande Lenta Não GCC (PRC Não Grande Lenta Não
64
Tools) Satelite Forms
Sim Média/Grande Rápida Sim
Pendragon Forms
Sim Pequena Rápida Sim
CASL Tools Sim Média Rápida Sim PDA Toolbox
Não Pequena Rápida Sim
Falchnet Não Grande Lenta Não PocketStudio Não Média Média Não
Como foi citado anteriormente, algumas ferramentas têm seus próprios
Conduits. Outras, entretanto, como exemplo o CodeWarrior, cujos aplicativos são PRCs
e manipulam PDBs, devem ser complementadas com a aplicação Conduit.
5.3. Protótipo Desenvolvido
Para verificar as funcionalidades de consulta e sincronização de dados através do
Palm, criamos uma aplicação com um cadastro de clientes e um módulo para consulta
de endereço através do cep. A Figura 11 mostra a tela inicial da aplicação. Este sistema
permite que usuários móveis compartilhem dados de clientes provenientes de um banco
de dados consolidado, podendo também incluir, excluir e editar dados do servidor.
65
FIGURA 11 - Interface do Cliente
As réplicas dos dados provenientes do servidor ficam na memória RAM do
dispositivo móvel, permitindo que o usuário trabalhe com estas réplicas em modo
desconectado. A sincronização é feita assim que o cliente achar necessário.
O sistema como um todo pode ser visto da seguinte maneira:
- Aplicação Cliente: permite que o usuário faça consultas, inserções, atualizações
e exclusões do banco de dados.
66
- Banco de Dados do Cliente: armazena as réplicas de dados provenientes do
banco de dados consolidado ou de própria criação do cliente móvel.
- Protocolo de Sincronização: responsável por fazer a conexão dos dispositivos e
transferência dos dados. Para este sistema utilizamos o protocolo HotSync e testamos a
funcionalidade de outros protocolos de sincronização disponíveis no mercado mas que
não englobaram o sistema.
- Gerenciador de Sincronização: responsável por ativar os conduits disponíveis
para sincronização.
- Banco de Dados Consolidado: base de dados fixa localizada no servidor.
5.3.1. O Programa Cliente
Nossa aplicação cliente tem por finalidade prover o acesso e gerenciar os dados
disponíveis na unidade móvel. Tudo o que é feito sobre os dados locais repercutem nos
dados localizados no servidor.
O usuário móvel tem acesso a todos os dados da base de Clientes localizada no
servidor, podendo alterar as informações, incluir um novo cliente ou excluí-lo da base
de dados, através da sincronização. Outra opção ao usuário é a consulta de endereço via
cep, que foi englobada à nossa aplicação para verificação de consultas via cliente.
A aplicação como um todo pode ser vista na Figura 12.
67
FIGURA 12 – Estrutura do Sistema
Para a programação da interface utilizamos inicialmente a ferramenta Satellite
Forms Enterprise Edition versão 4.1.0. Desenvolvida pela Pumatech desde 1997 e
lançada em 2001, a Satellite Forms é uma ferramenta RAD, de fácil aprendizado e pode
gerar sistemas para a plataforma PalmOS ou Pocket PC 2002/2003. Possui conduit
próprio, mas não dá muita flexibilidade ao programador.
Aplicações feitas em Satellite Forms necessitam do run-time da aplicação
instalado no dispositivo para funcionar .
Em nosso experimento não utilizamos o conduit próprio da ferramenta,
desenvolvemos nosso próprio conduit. No momento da sincronização foi detectado que
o componente utilizado para desenvolver o conduit não é compatível com os dados
provenientes da Satellite Forms. A partir daí não conseguimos mais trabalhar com a
ferramenta, já que ela não possuía os requisitos necessários para o nosso
68
desenvolvimento. Decidimos assim optar por outra ferramenta, a PocketStudio
Professional.
Desenvolvida pela Pocket-Technologies desde 1999 e lançada em 2001, a
PocketStudio possui um compilador que gera aplicações nativas PalmOS sem a
necessidade de run-time. Nos primeiros momentos não nos adaptamos bem a esta
ferramenta, já que o desenvolvimento com a Satellite Forms era muito mais produtivo e
fácil, mas ao longo do desenvolvimento fomos nos adaptando e conseguimos concluir a
aplicação.
5.3.2. Descrição do Banco de Dados do Cliente
Em nossa aplicação foram definidos dois banco de dados, um para
gerenciamento dos dados dos clientes, o Cliente-DB e outro para consulta de cep no
servidor, o Cep-DB.
Esses dois bancos de dados possuem a mesma estrutura do banco de dados do
servidor, a principal diferença é que os banco de dados do cliente possuem todos os
dados classificados como do tipo string, eles são convertidos para o formato que está no
servidor apenas na hora da sincronização, enquanto no servidor os atributos dos dados
são bem definidos.
69
5.3.3 O Módulo Conduit
O Conduit construído em nosso experimento foi projetado com a linguagem
Borland Delphi 5.0.
Para que o conduit fizesse parte do processo de sincronização era necessário que
ele fosse inserido na lista de eventos a serem sincronizados. Utilizamos o CDK (Conduit
Development Kit) para essa inserção. Cada DLL inserida através do CDK deve possuir
um creatorID que faz ligação com a respectiva aplicação instalada no palmtop.
5.4. Protocolos de Sincronização Investigados
Dentre os protocolos estudados, conseguimos testar apenas 2, o HotSync e o
SyncML. Apesar de tentarmos encontrar os outros protocolos estudados, não
encontramos nada de concreto sobre o CPISync e pouca coisa sobre o Intellisync. Havia
uma versão de teste do cliente Intellisync, mas o servidor de sincronização não
encontrava-se disponível para download.
Nossos testes foram feitos utilizando os protocolos Hotsync e SyncML. O
servidor de sincronização foi instalado em um computador Atlon XP 1.4 GHz e o
cliente de sincronização foi instalado no emulador POSE. Utilizamos um banco de
dados contendo informação de aproximadamente 1800 clientes, totalizando 128 Kb de
dados.
Alguns pontos relevantes foram levantados na análise:
70
Volume de Dados Transmitido
O SyncML transmitiu um volume de dados consideravelmente maior que o
HotSync para a mesma quantidade de dados transmitida, como pode ser visto na Figura
13. Já na Figura14, o SyncML transmitiu um volume menor de dados no modo normal ,
equivalente ao modo Fast do HotSync, isso se deve ao fato de que o HotSync tranfere
ao registro todo que foi modificado e o SyncML transfere apenas os dados do registro
que foram midificados. Considerando-se ambientes wireless, esta característica é muito
importante, já que a comunicação pode ser fraca.
050000
100000
150000200000250000300000350000
400000450000500000
bytes transferidos
slow sync hotsyncslow sync syncml
FIGURA 13 – Volume de Dados HotSync e SyncML (Slow)
71
0
2000
4000
6000
8000
10000
12000
14000
16000
18000
bytes transferidos
fast sync hotsyncnormal sync syncml
FIGURA 14 - Volume de Dados HotSync e SyncML (Fast e Normal)
Processamento Envolvido
Não foi possível levantar essa característica já que estávamos utilizando o
emulador.
Tamanho da Rede
Essa característica indica se com o aumento da rede o protocolo continua
funcionando normalmente. Nesta categoria o FastSync torna-se mais fraco, pois
sincroniza apenas dois nodos na rede. O SyncML é inadequado para grandes redes
porque cada dispositivo tem que manter a informação de sincronização para todos os
outros dispositivos da rede.
72
Memória
Na utilização dos protocolos estudados verificou-se que o SyncML é o que
consome mais memória do dispositivo e do servidor para fazer a sincronização. Dados
concretos não podem ser levantados devido à utilização do emulador. Dispositivos com
pouca memória não são indicados para sincronizar via SyncML.
73
CAPÍTULO VI
6. CONCLUSÕES E TRABALHOS FUTUROS
Nos últimos anos ocorreu um crescimento substancial das tecnologias que
empregam computação móvel. Com este trabalho conseguimos mostrar como é
trabalhar com computação móvel, os problemas enfrentados e que atitudes tomar.
Mostramos um problema clássico de sincronização entre banco de dados e os protocolos
empregados no experimento.
Existem diversos protocolos de sincronização no mercado, mas muitos deles não
estão disponíveis para um estudo aprofundado. A decisão a ser tomada de que protocolo
utilizar depende muito dos recursos disponíveis pelo usuário, principalmente no que se
refere ao hardware disponível.
Dentre os protocolos estudados, chegou-se a seguinte tabela comparativa:
TABELA 8 – Propriedades dos Protocolos de Sincronização de Dados Estudados
Protocolo de Sincronização
de Dados
Volume de Dados
Transmitidos
Número de dispositivos na
rede
Memória utilizada
Ponto central de
falha
Processamento utilizado
HotSync modo FastSync
Normal
Apenas 2 Normal Sim Normal
HotSync modo SlowSync
Alto Vários Normal Sim Normal
74
SyncML modo Normal
Baixo Apenas 2 Alto Sim Normal
SyncML modo Slow
Normal Vários, mas torna-se muito complexo
Muito alto, dependendo do número de dispositivos utilizado
Sim Alto
O assunto escolhido para este trabalho tem evidente tendência de crescimento futuro. Os
PDAs estão cada vez menores e com maior desempenho, trazendo consigo novos
problemas a serem enfrentados e os protocolos existentes não atendem a tudo que
precisam.
Com base no levantamento bibliográfico feito neste trabalho foi possível
observar as diversas abordagens de pesquisa com relação à computação móvel
permitiram um estudo amplo para atender diversos tipos de necessidades. Percebemos
que há pouca coisa que nos fala sobre os protocolos de sincronização. Na maioria
encontrada, nenhum documento toma um aprofundamento no assunto relevante o
suficiente.
O estudo que ocorreu para o desenvolvimento deste trabalho nos trouxe um bom
entendimento das deficiências e facilidades que a computação móvel nos traz. A
implementação prática de um protótipo de sincronização contribuiu para o
aprimoramento de métodos propostos na literatura e a descoberta de novos desafios para
incentivar a continuidade deste e de outros trabalhos científicos.
75
Em termos de trabalhos futuros, uma boa análise a ser feita é a da criação de um
protocolo que alcance todas as necessidades da sincronização, podendo funcionar em
redes maiores, consumindo pouca memória dos dispositivos, transmitindo um grande
volume de dados em um tempo curto, etc., características estas que a maioria no
mercado não tem.
76
REFERÊNCIAS BIBLIOGRÁFICAS
3GAM – 3G AMERICAS:: Unifying the Americas through Wireless Tecnology.
http://www.3gamericas.org
BADRINATH, B. R.; PHATAK, S. H. Bounded Locking for Optimistic
Concurrency Control. Department of Computer Science, University Rutgers,
Piscatway, 1995.
BARBARÁ, D. Mobile Computing and Database: A Survey. IEEE Transactions on
Knowledge and Data Engineering, p.1-14, 1999.
BREITBART, Y.; KOMONDOOR, R.; RASTOGI, R.; et al. Update Propagation
Protocols for Replicated Databases. ACM SIGMOD International Conference
on Management of Data, p.97-108, 1999.
CDG – CDMA Development Group
http://www.cdg.org
CUNHA, D. P. da. Um Estudo das Estratégias de Replicação e Reconciliação de
Banco de Dados Móveis em um Ambiente Wireless. Dissertação de Mestrado
em Ciência da Computação, UFSC, 2003
DANTAS, M. Tecnologias de Redes de Comunicação e Computadores. Rio de
Janeiro: Axcel Books, 2002.
DENARDI, M.A. Um Estudo Comparativo de Mecanismos de Controle de
Concorrência de Gerenciamento de Dados em Ambientes de Computação
Móvel. Dissertação de Mestrado em Ciência da Computação, UFSC, 2003.
77
DUNHAM, M.; KUMAR, V. Defining Location Data Dependency, Transaction
Mobility and Commitment. Relatório Técnico 98-CSE-1, fevereiro, 1998, p. 1-
22.
FERREIRA, E. J.; FINGER, M. Controle de Concorrência e Distribuição de Dados:
a teoria clássica, suas limitações e extensões modernas. Escola de Computação
2000.
FORMAN, G. H.; ZAHORJAN, J. The Challenges of Mobile Computing. IEEE
Computer, 27(6):38-47, Abril, 1994.
GETIEEE802 - IEEE Standards “Get IEEE 802”(TM) Wireless (IEEE 802.11).
http://standards.ieee.org/getieee802/802.11.html
ITO, G. Bancos de Dados Móveis: Uma Análise de Soluções Propostas para
Gerenciamento de Dados. Dissertação de Mestrado em Ciência da Computação,
UFSC, 2001.
KRISHNA, P.. Performance Issues in Mobile Wireless Networks. Dissertação –
Texas University, Agosto 1996.
LUBINSKI, A.; HEUER, A. Configured Replication for Mobile Applications.
Workshop Grundlagen von Datenbanken, p.1-13, 2000.
MATEUS, G.; LOUREIRO, A. Introdução a Computação Móvel. Rio de Janeiro:
NCE/UFRJ, 11ª Escola de Computação, 1998.
MINSKY, Y. ; TRACHTENBERG, A. and ZIPPEL, R., Set Reconciliation with
Nearly Optimal Communication Complexity. Tech. Rep. TR2000-1813,
Cornell University, 2000.
MOB2003 – MICROSOFT
http://www.microsoft.com/mobile/images/devices.gif
78
NASSU, E. A.; FINGER, M. O Significado de “Aqui”em Sistemas Transacionais
Móveis. I Workshop SIDAM (Sistemas de Informação Distribuída de Agentes
Móveis), outubro, 2000, p. 55-63.
NEVES, N.; FUCHS, W. K. Adaptive Recovery for Mobile Enviroments.
Communications of the ACM, v.1, n.40, janeiro, 1997, p. 69-74.
ÖZSU, M.; VALDURIEZ, P. Principles of Distributed Database Systems. New
Jersey: Prentice Hall, 2ª ed., 1999.
PALAZZO, S.; PULIOFITO, A.; SCARPA, M. Design and Evaluation of a
Replicated Database for Mobile Systems. Wireless Networks 6, p.131-133,
2000.
PALMOS
http://palmos.com/dev/support/docs/palmos/ReferenceTOC.html
PASTORE, M. Wireless Aims Widespread Appeal. Cyberlatas 2000; cyber
atlas.internet.com/markets/wireless/article/0,,10094_587701,00.html.
PITOURA, E.; SAMARAS, G. Data Management for Mobile Computing. Kluwer
Academic Publishers, 1998.
PUMATECH
http://www.pumatech.com
SILBERSCHATZ, A.; KORTH H.; SUDARSHAN S. Sistemas de Banco de Dados.
Makron Books, São Paulo, 1999.
SILVA, F. J. S. e; ENDLER, M. Requisitos e Arquiteturas de Software para
Computação Móvel. I Workshop SIDAM (Sistemas de Informação Distribuída
de Agentes Móveis), outubro 2000.
79
SONG Siang Wun et al. SIDAM – Sistemas de Informação Distribuídos para
Agentes Móveis. Departamento de Ciência da Computação, IME São Paulo e
Departamento de Ciência da Computação e Estatística ICM São Carlos, São
Paulo, Junho, 1999.
SATYANARAYANAN, M. Fundamental Challenges in Mobile Computing. ACM
Symposium on Principles of Distributed Computing, Filadélfia, p.1-7, 1996.
SYNCML
http://www.syncml.org/downloads.html
TRACHTENBERG, A. ; STAROBINBKI, D. and AGARWAL, S. Fast PDA
Synchronization Using Characteristic Polynomial Interpolation. Tech. Rep.
TR2001-03, Boston University, 2001.
TRACHTENBERG, A. ; STAROBINBKI, D. and AGARWAL, S. Fast PDA
Synchronization Using Characteristic Polynomial Interpolation. Proceedings
of the IEEE Infocom, 2002.
UMST FORUM
http://www.umst-forum.org
YEO, L. H.; ZASLAVSKY, UM. Submission of Transactions from Móbile
Workstations in a Cooperative Multidatabase Processing Enviroment.
Proceedings of Distributed Computing Systems, p. 372-379, junho, 1994.
80
PROTOCOLOS DE SINCRONIZAÇÃO EM AMBIENTES WIRELESS: UM ESTUDO DE CASO
Elenice Colle Manganelli
Juliano Romani {juliano}{elenice}@inf.ufsc.br
CURSO DE CIÊNCIAS DA COMPUTAÇÃO
UNIVERSIDADE FEDERAL DE SANTA CATARINA RESUMO
Atualmente, tem se verificado um grande crescimento na utilização da computação móvel. Um dos fatores que podem explicar essa tendência é o desenvolvimento de novos recursos computacionais, como uma maior capacidade de processamento e armazenamento nos dispositivos móveis, bem como o aumento das taxas de transmissão em redes wireless. Uma importante característica na sincronização dos dispositivos móveis é o protocolo de sincronização utilizado. Porém, algumas considerações precisam ser analisadas na escolha, tais como: memória disponível do dispositivo, a rede que vai ser utilizada, a taxa de transmissão, etc.. O problema fundamental é encontrar um protocolo que atenda aos problemas identificados. Neste trabalho é apresentada uma análise de diferentes protocolos de sincronização, baseando-se em um estudo de caso experimental feito em uma plataforma convencional. Os resultados indicam soluções para o desenvolvimento na plataforma PalmOS e uma análise dos protocolos HotSync e SyncML.
ABSTRACT
Currently, it has verified a great growth in the use of the mobile computation. One of the factors that can explain this trend is the development of new computational resources, as a bigger capacity of processing and storage in the mobile devices, as well as the increase of the taxes of transmission in wireless networks. An important characteristic in the synchronization of the mobile devices is the used synchronization protocol . However, some considerations need is analyzed in the choice, such as: available memory of the device, the network that go to be used, the tax of transmission, etc.. The basic problem is to find a protocol that takes care of to the identified problems. In this work an analysis of different synchronization protocols is presented, being based on a study of made experimental case in a conventional platform. The results indicate solutions for the development in the PalmOS platform and an analysis of the protocols HotSync and SyncML.
COMPUTAÇÃO MÓVEL
A computação móvel tornou-se uma realidade na vida das pessoas com
o aparecimento de duas tecnologias: o aparecimento de computadores portáteis poderosos e o desenvolvimento de redes
1
rápidas e mais confiáveis (BARBARÁ,1999).
O ambiente da computação móvel não requer mais que os usuários mantenham uma posição fixa na rede, permitindo assim uma grande mobilidade dos usuários.
O principal desafio da computação móvel é conseguir garantir o funcionamento igualado aos dos computadores fixos, já que diversas restrições surgem com a mobilidade, ou seja, é necessário ter um sistema de computadores distribuídos com serviços comparáveis aos dos computadores fixos mas que permita mobilidade (MATEUS & LOUREIRO, 1998).
Características da Computação Móvel
Computadores móveis requerem acesso a redes sem fio, embora possa às vezes se unir fisicamente à uma rede fixa com uma conexão melhor e mais barata permanecendo estacionários em reuniões em cima de uma mesa por exemplo.
Em uma comunicação sem fio é muito mais difícil conseguir uma comunicação perfeita, pois existem muitos obstáculos que podem interferir no sinal, introduzindo assim ruídos e ecos. As conexões sem fio possuem qualidade mais baixa que as conexões fixas, pois possuem baixa largura de banda, taxas de erros elevadas e desconexões mais freqüentes. Esses fatores podem aumentar a latência nos retransmissores, atraso no intervalo de retransmissão, erro no processamento do protocolo de controle e curtas desconexões (FORMAN & ZAHORJAN, 1994).
BANCO DE DADOS MÓVEIS
Para que a mobilidade tenha efeito vantajoso existe a necessidade da utilização de banco de dados para controle e armazenamento da informação. Um SGBD (Sistema Gerenciador de Banco de Dados) tem como objetivo propiciar um ambiente conveniente e eficiente para recuperação e armazenamento da informação (SILBERSCHATZ et al, 1999).
As aplicações que rodam em clientes móveis se conectam freqüentemente a repositórios de dados remotos carregando somente as informações necessárias. Para isso é necessário que o banco de dados tenha a capacidade de carregar as informações do repositório e trabalhar com essa informação mesmo estando desconectado ou fora do alcance do repositório. As informações atualizadas no cliente móvel enquanto ele estava desconectado serão atualizadas na sua próxima conexão (BADRINATH & PHATAK, 1995).
TECNOLOGIAS DE SINCRONIZAÇÃO
Para BADRINATH & PHATAK (2001) a sincronização em ambientes móveis pode ser definida como o ato de estabelecer equivalência entre duas coleções de dados, entre cliente e servidor, após a ocorrência de alteração nos registros armazenados. Depois de sincronização de dados cada elemento de dados em uma coleção é mapeado por um elemento de dados em outra, sendo que seus dados são equivalentes, entretanto não necessariamente idênticos.
2
Hotsync Dispositivos Palm rodam na plataforma Palm Operating System que fornece o protocolo HotSync para sincronizar os bancos de dados do Palm com o do micro Desktop. O HotSync (PALMOS) opera em dois modos, dependendo do histórico de sincronização do dispositivo com o micro computador em particular.
O FastSync ocorre quando o dispositivo sincroniza com o mesmo micro computador que sincronizou pela última vez. Neste caso o dispositivo sincroniza processando os registros baseados nas flags de status de cada registro que dizem se este foi modificado, criado ou apagado. O FastSync é a melhor opção quando a sincronização ocorre somente entre dois dispositivos, sendo que o dispositivo poderá recordar flags de status somente de um micro computador.
O Slowsync ocorre quando a condição principal do Fastsync não é encontrada. Neste caso o dispositivo transfere a base de dados inteira ao PC a ser trabalhado pela comparação. Enquanto o espaço de armazenamento do dispositivo se torna maior grande e as bases de dados se tornam maiores, a introdução da latência crescente envolvida em transferir a base de dados inteira do PDA ao PC para a sincronização subseqüente torna-se cada vez mais importante.
Mas pode-se dizer que com o avanço de tecnologias mais rápidas de conexão dos dispositivos móveis com os PCs e as redes sem fio cada vez mais rápidas a latência do slowsync se transforma um assunto tratável.
Intellisync
O Intellisync (PUMATECH), produto fabricado pela Pumatech, faz sempre a sincronização do tipo Fastsync, utilizando um servidor central com o qual os dispositivos móveis sincronizam sempre. Isto significa que todos os dispositivos sincronizados têm que manter as flags de status das atualizações com respeito somente ao usuário central, permitindo um Fastsync todas as vezes. Esta arquitetura não é projetada para o caso geral onde um dispositivo pode sincronizar com outros dispositivo em uma rede do peer-to-peer. No geral, uma arquitetura distribuída baseada na sincronização do peer-to-peer fornece o desempenho muito melhor da rede, nos termos de robustez e escalabilidade, do que uma rede centralizada.
SyncML SyncML , segundo SYNCML (2002) é uma iniciativa da indústria aberta suportada por muitas companhias, incluindo Ericsson, IBM, Lótus, Matsushita, Motorola, Nokia, OpenWare e Starfish.
Pode ser considerada como uma linguagem padrão para sincronizar diferente dispositivos e aplicações sobre qualquer rede. Com o SyncML qualquer tipo de informação pode ser sincronizada para manter a informação consistente e atualizada, não importando a localização do dispositivo e da rede.
O protocolo possui as seguintes características:
• Opera efecientemente sobre redes wireless e com fios.
• Suporta uma variedade de protocolos de transporte, como HTTP, WSP, OBEX, redes
3
TCP/IP, SMTP, POP3, IMAP, e protocolos proprietários.
• Acesso a dados de uma variedade de aplicações.
Este framework ajuda na analise de implementação de um modelo de sistema associado com a implementação do SyncML. Os blocos maiores desse framework é a representação do protocolo SyncML, conceitual adaptador SyncML e a interface SyncML. O protocolo de sincronização de dados SyncML está fora do framework SyncML para manter o framework de fácil implementação e atividade conjunta.
A aplicação “A” descreve um serviço de rede que provê serviço de sincronização de dados para a aplicação “B”. Vamos assumir que a aplicação “B” deseja se sincronizar com a aplicação “A”. O serviço e o dispositivo são conectados sobre um protocolo de transporte em comum, como HTTP. A aplicação “A” implementa o processo “Sync Engine” utilizando o protocolo de sincronização de dados manifestando o acesso cliente para o “Sync Server” – um recurso de rede. O “Sync Server Agent” se comunica entre as aplicações cliente e o “Sync Engine” para gerenciar o acesso a rede e para e de as comunicações. Invocando as funções definidas na interface SyncML para executar essas capacidades. A interface SyncML não é nada mais que uma aplicação para o “SyncML Adapter”. “SyncML Adapter” é um processo conceitual que pode ser considerado como ponto de entrada e saída para a aplicação “A”.
Usando a representação de protocolo, SyncML é um protocolo de sincronização que define como inicializar, sincronizar e encerrar a
sincronização incluindo a troca de dados entre os dispositivos sincronizados. SyncML é programado considerando ele como um protocolo de sincronização comum, tendo cuidado nos casos onde os serviços de rede e os dispositivos de armazenamento de dados que estão começando a ser sincronizados estão em formatos diferentes ou sendo usados por diferentes programas. Há sete tipos diferentes de sincronização definidas pelo SyncML, dependendo de como a sincronização é inicializada pelo cliente eu servidor e a transferência de informação entre eles.
8. Two-Way Sync
9. Slow Sync
10. One-Way Sync from Client only
11. Refresh Sync from Client only
12. One-Way Sync from Server only
13. Refresh Sync from Server only
14. Server Alertd Sync
SyncML tenta conseguir potencialidades do Fastsync, requerendo que todos os dispositivos da rede possuam flags de status para cada registro. Isso pode causar uma demanda de memória muito grande. Onde a complexidade aumenta conforme o número de dispositivos em rede. Isso não é sustentável em redes com vários dispositivos.
CPISync
Há muitas instâncias de sincronização de dados onde há necessidade de sincronizar dados semelhantes em dispositivos diferentes. O CPISync, segundo Trachtenberg, Starobinbki, e Agarwal (2001,2002), que é uma abreviação de “Characteristc Polynominal Interpolation
4
Syncronization”, faz a complexidade do tempo da sincronização quase independente do tamanho do conjunto de dados a ser sincronizado, e somente dependente do número de diferenças entre os dois conjuntos de dados. Este é um contraste marcante em relação ao Slowsync que utiliza uma transferência de dados inteira entre os hosts enquanto sincronizando os dados, fazendo a sincronização dos dados um tempo linear em relação ao numero de registros no banco de dados.
CPISync é baseado em uma solução recente para um conjunto de problemas de reconcialização por Minsky, Trachtenberg e Zippel (2000) é escalável com o número de dispositivos na rede e o tamanho do banco de dados a ser sincronizado. Esta solução envolve mais recurso computacional comparado ao Slowsync, este recurso computacional pode ser distribuído assimetricamente entre os hosts. Isto significa que em casos onde os hosts tem capacidades computacionais diferentes (ex. PDA e PC), o CPISync pode transferir mais dos recursos computacionais para o pc, permitindo uma rápida execução do CPISync comparado a uma aproximação simétrica.
AMBIENTE EXPERIMENTAL E RESULTADOS OBTIDOS
Para nosso experimento utilizamos um cliente móvel que faz operações de consulta e atualizações em um banco de dados consolidado pertencente a um servidor.
Por motivos burocráticos não foi possível conseguir dispositivos recentes a tempo para nosso experimento, possuíamos apenas um dispositivo
portátil, um Palm M100, para fazer o papel de cliente.
Utilizamos um computador desktop rodando Windows como servidor e um Palm M100 funcionando como cliente móvel. O PalmOS Emulator (POSE) também foi utilizado funcionando como clientes móveis inexistentes.
A utilização do Emulador não é recomendada só para suprir a falta de um dispositivo, mas sim para testar aplicações antes de serem instaladas nos dispositivos físicos. No Emulador as aplicações rodam mais rápido e pode-se evitar um Hard Reset caso a aplicação desenvolvida possua algum erro.
Iniciando o Desenvolvimento na Plataforma PalmOS
Quando iniciamos nosso projeto, a previsão que havia era a de conseguir trabalhar com dois dispositivos portáteis adquiridos pela universidade, só que por vários motivos não conseguimos os dispositivos a tempo. Tínhamos em mãos um Palm M100 e algumas idéias formuladas.
As principais dúvidas que surgiram foram a de “Como começar a desenvolver?” e “Que ferramenta utilizar?”. Algumas dúvidas foram sendo esclarecidas ao longo de todo o estudo desenvolvido e serão apresentadas a seguir.
Protótipo Desenvolvido
Para verificar as funcionalidades de consulta e sincronização de dados através do Palm, criamos uma aplicação com um cadastro de clientes e um módulo para consulta de endereço
5
através do cep. A Figura 2 mostra a tela inicial da aplicação. Este sistema permite que usuários móveis compartilhem dados de clientes provenientes de um banco de dados consolidado, podendo também incluir, excluir e editar dados do servidor.
FIGURA 2 - Interface do Cliente
As réplicas dos dados provenientes do servidor ficam na memória RAM do dispositivo móvel, permitindo que o usuário trabalhe com estas réplicas em modo desconectado. A sincronização é feita assim que o cliente achar necessário.
O sistema como um todo pode ser visto da seguinte maneira:
- Aplicação Cliente: permite que o usuário faça consultas, inserções, atualizações e exclusões do banco de dados.
- Banco de Dados do Cliente: armazena as réplicas de dados provenientes do banco de dados consolidado ou de própria criação do cliente móvel.
- Protocolo de Sincronização: responsável por fazer a conexão dos
dispositivos e transferência dos dados. Para este sistema utilizamos o protocolo HotSync e testamos a funcionalidade de outros protocolos de sincronização disponíveis no mercado mas que não englobaram o sistema.
- Gerenciador de Sincronização: responsável por ativas os conduits disponíveis para sincronização.
- Banco de Dados Consolidado: base de dados fixa localizada no servidor.
O Programa Cliente
Nossa aplicação cliente tem por finalidade prover o acesso e gerenciar os dados disponíveis na unidade móvel. Tudo o que é feito sobre os dados locais repercutem nos dados localizados no servidor.
O usuário móvel tem acesso a todos os dados da base de Clientes localizada no servidor, podendo alterar as informações, incluir um novo cliente ou excluí-lo da base de dados, através da sincronização. Outra opção ao usuário é a consulta de endereço via cep, que foi englobada à nossa aplicação para verificação de consultas via cliente.
Protocolos de Sincronização Investigados
Dentre os protocolos estudados, conseguimos testar apenas 2, o HotSync e o
SyncML. Apesar de tentarmos encontrar os outros protocolos estudados, não encontramos nada de concreto sobre o CPISync e pouca coisa
6
sobre o Intellisync. Havia uma versão de teste do cliente Intellisync, mas o servidor de sincronização não encontrava-se disponível para download.
Nossos testes foram feitos utilizando os protocolos Hotsync e SyncML. O servidor de sincronização foi instalado em um computador Pentium 200MHz e o cliente de sincronização foi instalado no emulador POSE. Utilizamos um banco de dados contendo informação de aproximadamente 1800 clientes, totalizando 128 Kb de dados.
Alguns pontos relevantes foram levantados na análise:
Volume de Dados Transmitido
O SyncML transmitiu um volume de bytes consideravelmente maior que o HotSync para o mesmo volume de dados, como pode ser visto na Figura 3 e a 4. Sendo necessário para isso maior processamento e maior tempo de conexão. Considerando-se ambientes wireless, esta característica é muito importante, já que a comunicação pode ser fraca.
Processamento Envolvido
Não foi possível levantar essa característica já que estávamos utilizando o emulador.
050000
100000
150000200000250000300000350000
400000450000500000
bytes transferidos
slow sync hotsyncslow sync syncml
FIGURA 3 – Volume de Dados HotSync e SyncML (Slow)
0
2000
4000
6000
8000
10000
12000
14000
16000
18000
bytes transferidos
fast sync hotsyncnormal sync syncml
FIGURA 4 - Volume de Dados HotSync e SyncML (Fast e Normal)
Tamanho da Rede
Essa característica indica se com o aumento da rede o protocolo continua funcionando normalmente. Nesta categoria o FastSync torna-se mais fraco, pois sincroniza apenas dois nodos na rede. O SyncML é inadequado para grandes redes porque cada dispositivo tem que manter a informação de sincronização para todos os outros dispositivos da rede.
7
Memória
Na utilização dos protocolos estudados verificou-se que o SyncML é o que consome mais memória do dispositivo e do servidor para fazer a sincronização. Dados concretos não podem ser levantados devido à utilização do emulador. Dispositivos com pouca memória não são indicados para sincronizar via SyncML.
Nos últimos anos ocorreu um crescimento substancial das tecnologias que empregam computação móvel. Com este trabalho conseguimos mostrar como é trabalhar com computação móvel, os problemas enfrentados e que atitudes tomar. Mostramos um problema clássico de sincronização entre banco de dados e os protocolos empregados no experimento.
Existem diversos protocolos de sincronização no mercado, mas muitos deles não estão disponíveis para um estudo aprofundado. A decisão a ser tomada de que protocolo utilizar depende muito dos recursos disponíveis pelo usuário, principalmente no que se refere ao hardware disponível.
O assunto escolhido para este trabalho tem evidente tendência de crescimento futuro. Os PDAs estão cada vez menores e com maior desempenho, trazendo consigo novos problemas a serem enfrentados e os protocolos existentes não atendem a tudo que precisam.
Com base no levantamento bibliográfico feito neste trabalho foi possível observar as diversas abordagens de pesquisa com relação à computação móvel permitiram um estudo amplo para atender diversos
tipos de necessidades. Percebemos que há pouca coisa que nos fala sobre os protocolos de sincronização. Na maioria encontrada, nenhum documento toma um aprofundamento no assunto relevante o suficiente.
O estudo que ocorreu para o desenvolvimento deste trabalho nos trouxe um bom entendimento das deficiências e facilidades que a computação móvel nos traz. A implementação prática de um protótipo de sincronização contribuiu para o aprimoramento de métodos propostos na literatura e a descoberta de novos desafios para incentivar a continuidade deste e de outros trabalhos científicos.
REFERÊNCIAS BIBLIOGRÁFICAS
BADRINATH, B. R.; PHATAK, S. H.
Bounded Locking for Optimistic Concurrency Control. Department of Computer Science, University Rutgers, Piscatway, 1995.
BARBARÁ, D. Mobile Computing and Database: A Survey. IEEE Transactions on Knowledge and Data Engineering, p.1-14, 1999.
BREITBART, Y.; KOMONDOOR, R.; RASTOGI, R.; et al. Update Propagation Protocols for Replicated Databases. ACM SIGMOD International Conference on Management of Data, p.97-108, 1999.
DANTAS, M. Tecnologias de Redes de Comunicação e Computadores. Rio de Janeiro: Axcel Books, 2002.
FORMAN, G. H.; ZAHORJAN, J. The Challenges of Mobile
8
Computing. IEEE Computer, 27(6):38-47, Abril, 1994.
MATEUS, G.; LOUREIRO, A. Introdução a Computação Móvel. Rio de Janeiro: NCE/UFRJ, 11ª Escola de Computação, 1998.
MINSKY, Y. ; TRACHTENBERG, A. and ZIPPEL, R., Set Reconciliation with Nearly Optimal Communication Complexity. Tech. Rep. TR2000-1813, Cornell University, 2000.
PALMOS http://palmos.com/dev/support/do
cs/palmos/ReferenceTOC.html PITOURA, E.; SAMARAS, G. Data
Management for Mobile Computing. Kluwer Academic Publishers, 1998.
PUMATECH http://www.pumatech.com
SILBERSCHATZ, A.; KORTH H.; SUDARSHAN S. Sistemas de Banco de Dados. Makron Books, São Paulo, 1999.
SYNCML http://www.syncml.org/download
s.html TRACHTENBERG, A. ;
STAROBINBKI, D. and AGARWAL, S. Fast PDA Synchronization Using Characteristic Polynomial Interpolation. Tech. Rep. TR2001-03, Boston University, 2001.
TRACHTENBERG, A. ; STAROBINBKI, D. and AGARWAL, S. Fast PDA Synchronization Using Characteristic Polynomial Interpolation. Proceedings of the IEEE Infocom, 2002.
1
Código Fonte Programa Cliente program Cliente(Cmd: Word; CmdPBP: Pointer; LaunchFlags: Word): LongWord; {$CREATOR 'appl'} uses PalmOS, Cliente_rc, Cliente_evn, TableList in 'TableList.pas', PSIO in 'PSIO.pas', ClienteUI in 'ClienteUI.pas', ClienteList in 'ClienteList.pas', ClienteDB in 'ClienteDB.pas', CepDB in 'CepDB.pas', CepUI in 'CepUI.pas', CepList in 'CepList.pas'; function CheckROMVersion(RequiredVersion: UInt32): Boolean; var RomVersion: UInt32; begin FtrGet(sysFtrCreator, sysFtrNumROMVersion, RomVersion); Result := RomVersion >= RequiredVersion; end; function StartApplication: Boolean; begin Result := CheckROMVersion($3503000); // PalmOS version if not Result then begin FrmCustomAlert(AlertIncompatible, '3.5', nil, nil); Exit; end; ClienteDB.Open; CepDB.Open; FrmGotoForm(Pesquisa); end; procedure StopApplication; begin FrmCloseAllForms; CepDB.Close; ClienteDB.Close; end;
2
begin if Cmd = sysAppLaunchCmdNormalLaunch then if StartApplication then begin EventLoop; StopApplication; end; end. Unit CepDB; interface uses PalmOS, PSDatabase, PSUtils; const DatabaseName = 'Cep-DB'; DatabaseType = Rsc('STANDARD'); // Record Fields CepruaIdx=0; CepcidadeIdx=1; CepbairroIdx=2; CepcepIdx=3; CepufIdx=4; var FieldDefs: array [0..4] of TFieldDef = ( (DataType: ftString), // rua (DataType: ftString), // cidade (DataType: ftString), // bairro (DataType: ftString), // cep (DataType: ftString) // uf ); Database : TDatabase; function Open : Boolean; function Close : Boolean; procedure NewRecord; procedure Next; procedure Prior; procedure First; procedure Last;
3
function Bof : Boolean; function Eof : Boolean; implementation function Open : Boolean; begin Result := PSDatabase.Open(Database, DatabaseName, dmModeReadWrite); if not Result then begin Result := PSDatabase.CreateDatabase(DatabaseName, Creator, DatabaseType); if Result then Result := PSDatabase.Open(Database, DatabaseName, dmModeReadWrite); end; if not Result then begin ShowSystemError(PSDatabase.LastError); Exit; end; if Result then PSDatabase.SetFieldDefs(Database, FieldDefs[0], SizeOf(FieldDefs) div
SizeOf(FieldDefs[0])); end; function Close : Boolean; begin Result := PSDatabase.Close(Database); end; procedure NewRecord; // Create record with default values begin PSDatabase.Append(Database); PSDatabase.Post(Database); end; procedure Next; begin if (not Eof) then PSDatabase.Next(Database); end; procedure Prior; begin if (not Bof) then PSDatabase.Prior(Database);
4
end; procedure First; begin PSDatabase.First(Database); end; procedure Last; begin PSDatabase.Last(Database); end; function Bof : Boolean; begin Result := PSDatabase.Bof(Database); end; function Eof : Boolean; begin Result := PSDatabase.Eof(Database); end; end. Unit CepList; interface uses PalmOS, PSDatabase, PSTable, TableList, Cliente_rc, CepDb, CepUI; var CEPLista : TTableList; implementation const ColPos : array[0..5] of Integer = (0, 8, 18, 28, 38, 50);
5
procedure TableCallBack(tableP: Pointer; row, column: Int16; var bounds: RectangleType);
begin PSDatabase.MoveTo(CepDb.Database, TblGetItemInt(TableP, Row, Column)); // Draw fields in table row TableList.DrawTruncChars(FieldStringPtr(CepDb.Database, CepcepIdx), Bounds, 3,
160); { TableList.DrawTruncChars(FieldStringPtr(CepDb.Database, CepruaIdx), Bounds,
ColPos[1], ColPos[2]); TableList.DrawTruncChars(FieldStringPtr(CepDb.Database, CepbairroIdx), Bounds,
ColPos[2], ColPos[3]); TableList.DrawTruncChars(FieldStringPtr(CepDb.Database, CepcidadeIdx), Bounds,
ColPos[3], ColPos[4]); TableList.DrawTruncChars(FieldStringPtr(CepDb.Database, CepufIdx), Bounds,
ColPos[4], ColPos[5]); } end; initialization CEPLista.TableID := ListaCEP; CEPLista.TableDrawItemFunc := TableCallBack; CEPLista.Database := @CepDb.Database; CEPLista.TopVisibleRecord := 0; CEPLista.RepeatButtonUp := CepUp; CEPLista.RepeatButtonDown := CepDown; CEPLista.CompareFunction := TableList.Child; // Not child table - use default
function end. Unit CepUI; interface uses PalmOS, PSIO, PSDatabase, CepDB, Cliente_rc; procedure ReadData; procedure WriteData; var
6
DeleteRec : Boolean; implementation // Read data from database and put on screen procedure ReadData; begin DeleteRec := False; PSDatabase.Edit(CepDb.Database); PSIO.ReadToUIField(CepDb.Database, CepDb.CepruaIdx, Field2); PSIO.ReadToUIField(CepDb.Database, CepDb.CepcidadeIdx, Field4); PSIO.ReadToUIField(CepDb.Database, CepDb.CepbairroIdx, Field3); PSIO.ReadToUIField(CepDb.Database, CepDb.CepcepIdx, Field1); PSIO.ReadToUIField(CepDb.Database, CepDb.CepufIdx, Field5); end; // Write data from screen into database procedure WriteData; begin if DeleteRec then begin PSDatabase.Cancel(CepDb.Database); PSDatabase.Delete(CepDb.Database); exit; end; PSIO.WriteFromUIField(CepDb.Database, CepDb.CepruaIdx, Field2); PSIO.WriteFromUIField(CepDb.Database, CepDb.CepcidadeIdx, Field4); PSIO.WriteFromUIField(CepDb.Database, CepDb.CepbairroIdx, Field3); PSIO.WriteFromUIField(CepDb.Database, CepDb.CepcepIdx, Field1); PSIO.WriteFromUIField(CepDb.Database, CepDb.CepufIdx, Field5); PSDatabase.Post(CepDb.Database); end; initialization end. Unit ClienteDB; interface uses PalmOS, PSDatabase, PSUtils; const DatabaseName = 'Cliente-DB';
7
DatabaseType = Rsc('STANDARD'); // Record Fields Clientecd_clienteIdx=0; Clientenm_cliIdx=1; Clientelog_cliIdx=2; Clientecomp_cliIdx=3; Clientebairro_cliIdx=4; Clientecid_cliIdx=5; Clienteuf_cliIdx=6; var FieldDefs: array [0..6] of TFieldDef = ( (DataType: ftString), // cd_cliente (DataType: ftString), // nm_cli (DataType: ftString), // log_cli (DataType: ftString), // comp_cli (DataType: ftString), // bairro_cli (DataType: ftString), // cid_cli (DataType: ftString) // uf_cli ); Database : TDatabase; function Open : Boolean; function Close : Boolean; procedure NewRecord; implementation function Open : Boolean; begin Result := PSDatabase.Open(Database, DatabaseName, dmModeReadWrite); if not Result then begin Result := PSDatabase.CreateDatabase(DatabaseName, Creator, DatabaseType); if Result then Result := PSDatabase.Open(Database, DatabaseName, dmModeReadWrite); end; if not Result then begin ShowSystemError(PSDatabase.LastError); Exit; end;
8
if Result then PSDatabase.SetFieldDefs(Database, FieldDefs[0], SizeOf(FieldDefs) div
SizeOf(FieldDefs[0])); end; function Close : Boolean; begin Result := PSDatabase.Close(Database); end; procedure NewRecord; // Create record with default values begin PSDatabase.Append(Database); PSDatabase.Post(Database); end; end. Unit ClienteUI; interface uses PalmOS, PSIO, PSDatabase, ClienteDB, Cliente_rc; procedure ReadData; procedure WriteData; var DeleteRec : Boolean; implementation // Read data from database and put on screen procedure ReadData; begin DeleteRec := False; PSDatabase.Edit(ClienteDB.Database); PSIO.ReadToUIField(ClienteDB.Database, ClienteDB.Clientecd_clienteIdx,
ClienteEditFieldcd_cliente); PSIO.ReadToUIField(ClienteDB.Database, ClienteDB.Clientenm_cliIdx,
ClienteEditFieldnm_cli); PSIO.ReadToUIField(ClienteDB.Database, ClienteDB.Clientelog_cliIdx,
ClienteEditFieldlog_cli);
9
PSIO.ReadToUIField(ClienteDB.Database, ClienteDB.Clientecomp_cliIdx, ClienteEditFieldcomp_cli);
PSIO.ReadToUIField(ClienteDB.Database, ClienteDB.Clientebairro_cliIdx, ClienteEditFieldbairro_cli);
PSIO.ReadToUIField(ClienteDB.Database, ClienteDB.Clientecid_cliIdx, ClienteEditFieldcid_cli);
PSIO.ReadToUIField(ClienteDB.Database, ClienteDB.Clienteuf_cliIdx, ClienteEditFielduf_cli);
end; // Write data from screen into database procedure WriteData; begin if DeleteRec then begin PSDatabase.Cancel(ClienteDB.Database); PSDatabase.Delete(ClienteDB.Database); exit; end; PSIO.WriteFromUIField(ClienteDB.Database, ClienteDB.Clientecd_clienteIdx,
ClienteEditFieldcd_cliente); PSIO.WriteFromUIField(ClienteDB.Database, ClienteDB.Clientenm_cliIdx,
ClienteEditFieldnm_cli); PSIO.WriteFromUIField(ClienteDB.Database, ClienteDB.Clientelog_cliIdx,
ClienteEditFieldlog_cli); PSIO.WriteFromUIField(ClienteDB.Database, ClienteDB.Clientecomp_cliIdx,
ClienteEditFieldcomp_cli); PSIO.WriteFromUIField(ClienteDB.Database, ClienteDB.Clientebairro_cliIdx,
ClienteEditFieldbairro_cli); PSIO.WriteFromUIField(ClienteDB.Database, ClienteDB.Clientecid_cliIdx,
ClienteEditFieldcid_cli); PSIO.WriteFromUIField(ClienteDB.Database, ClienteDB.Clienteuf_cliIdx,
ClienteEditFielduf_cli); PSDatabase.Post(ClienteDB.Database); end; initialization end. // ---------------------------------------------------------------------------- // // Palm OS 5.0 declarations, Copyright (c) 2000-2002 Pocket Technologies, Inc. // // ---------------------------------------------------------------------------- unit PalmOS;
10
interface uses PalmTypes, CoreTraps, // libraries LibTraps, // system publics Rect, ErrorBase, AlarmMgr, Bitmap, Chars, ConnectionMgr, ConsoleMgr, Crc,
DataMgr, LocaleMgr, DateTime, DLServer, Encrypt, ExgMgr, ExgLib, FeatureMgr, FileStream, FloatMgr, Font, Graffiti, Helper, HelperServiceClass, ImcUtils, IntlMgr, KeyMgr, Localize, MemoryMgr, ModemMgr, PalmLocale, NotifyMgr, Password, PenMgr,
PceNativeCall_, SerialLinkMgr, SerialMgrOld, StringMgr, TimeMgr, Window, SysEvent, SysEvtMgr, SystemResources, SysUtils, TextMgr, TextServicesMgr, IrLib, // UI publics AboutBox, AttentionMgr, Clipboard, Control, Day, FatalAlert, Find_, FontSelect_, Field, GraffitiReference, GraffitiShift, UIControls, Keyboard, List, PrivateRecords, ScrollBar, SelDay, SelTime, SelTimeZone, Table, UIColor, UIResources, Form, Progress, Launcher, Event_, Category, Menu_, // hardware Hal, HwrMiscFlags, M68KHwr, // others SystemMgr, AppLaunchCmd, PhoneLookup, NetMgr, NetBitUtils, OverlayMgr,
Preferences, SoundMgr, InsPoint, SerialMgr, INetMgr, // libraries AddressSortLib, ExgLocalLib, FSLib, Lz77Mgr, TelephonyMgrTypes,
TelephonyMgr, TelephonyMgrUI, SmsLib, UDAMgr, ExpansionMgr, VFSMgr, PdiConst, PdiLib,
SlotDrvrLib, CPMLibCommon, CPMLib68KInterface, SslLib, SslLibAsn1, SslLibMac; implementation end. Unit PSIO; // DB Table Example v1.0 // Created by Clayton Powell // Evolutionary Systems - www.evolutionary.net
11
interface uses PalmOS, PSTypes, PSString, PSSlider, PSCheckbox, PSDatabase, PSField, PSButton, PSList; const BufSize = longDateStrLength + 1 + timeStringLength + 1; var PSIODecimalPlaces : UInt8 = 2; type TSelectorContext = record SelectorTriggerID : TSelectorTrigger; DateTime : DateTimeType; Buffer : array[0..BufSize] of char; end; procedure ReadToUIField(var Database : TDatabase; FieldIndex: Int16; Field: TField); procedure WriteFromUIField(var Database : TDatabase; FieldIndex: Int16; Field:
TField); procedure ReadToUISelector(var Database : TDatabase; FieldIndex: Int16; var
SelectorContext: TSelectorContext); procedure EditUISelector(var Database : TDatabase; FieldIndex: Int16; var
SelectorContext: TSelectorContext); procedure WriteFromUISelector(var Database : TDatabase; FieldIndex: Int16; var
SelectorContext: TSelectorContext); procedure ReadToUISlider(var Database : TDatabase; FieldIndex: Int16; Slider:
TSlider); procedure WriteFromUISlider(var Database : TDatabase; FieldIndex: Int16; Slider:
TSlider); procedure ReadToUICheckbox(var Database : TDatabase; FieldIndex: Int16;
Checkbox: TCheckbox); procedure WriteFromUICheckbox(var Database : TDatabase; FieldIndex: Int16;
Checkbox: TCheckbox); procedure ReadToUIDropList(var Database : TDatabase; FieldIndex: Int16; List: TList;
PopupTrigger: TPopupTrigger); procedure WriteFromUIDropList(var Database : TDatabase; FieldIndex: Int16; List:
TList; PopupTrigger: TPopupTrigger); implementation
12
const PSIOReadErrorAlert = AutoID; PSIOEditErrorAlert = AutoID; PSIOWriteErrorAlert = AutoID; PSIOErrorAlert = AutoID; resource ALERT PSIOReadErrorAlert ERROR BEGIN TITLE 'PSIO Read Error' MESSAGE 'The DB field of type ^1 cannot be put into a UI ^2' BUTTONS 'OK' END; ALERT PSIOEditErrorAlert ERROR BEGIN TITLE 'PSIO Edit Error' MESSAGE 'Cannot edit a UI ^2 of type ^1' BUTTONS 'OK' END; ALERT PSIOWriteErrorAlert ERROR BEGIN TITLE 'PSIO Write Error' MESSAGE 'Cannot write a UI ^2 to a DB field of type ^1' BUTTONS 'OK' END; ALERT PSIOErrorAlert ERROR BEGIN TITLE 'PSIO Error' MESSAGE '^1' BUTTONS 'OK' END; procedure FormatFloat(dst: PChar; f: Double; Decimals: UInt8); var w, i, Len, Offset : Int32; D : Double; buf : Array[0..maxStrIToALen] of char; begin dst[0] := #0; D := f; if D < 0 then begin D := -D; // Deal with negative numbers
13
StrCat(dst, '-'); end; for i := 1 to Decimals do D := D * 10; // Deal with decimal places w := round(D); // Get whole number portion of float if (w = $7FFFFFFF) then // Overflow begin FlpFToA(f, dst); // Use default draw proc exit; end; StrIToA(buf, w); // Convert whole number to string Len := StrLen(buf); if Len <= Decimals then StrCat(dst, '0') // zero before decimal point else StrNCat(dst, buf, StrLen(dst)+Len-Decimals+1); if Decimals > 0 then StrCat(dst, '.') // add decimal point else exit; // We're done! for i := 1 to Decimals - Len do // Fill missing zeroes after decimal point StrCat(dst, '0'); Offset := Len-decimals; if Offset < 0 then Offset := 0; StrCat(dst, @buf[Offset]); end; procedure FormatDate(var Date: DateType; var DateTime: DateTimeType; Buffer:
PChar); begin Buffer[0] := #0; DateTime.Year := 0; if Date.Bits = 0 then // Not set yet exit; DateTime.Year := 1904 + (Date.Bits shr 9); DateTime.Month := (Date.Bits and $01E0) shr 5; DateTime.Day := Date.Bits and $001F; DateToAscii(DateTime.Month, DateTime.Day, DateTime.Year, dfDMYLong,
Buffer); end;
14
procedure FormatTime(var Time : TimeType; var DateTime: DateTimeType; Buffer:
PChar); begin Buffer[0] := #0; DateTime.Hour := Time.Hours; DateTime.Minute := Time.Minutes; TimeToAscii(DateTime.Hour, DateTime.Minute, tfColonAMPM, Buffer); end; procedure FormatDateTime(var DateTime: DateTimeType; Buffer: PChar); var P : PChar; begin Buffer[0] := #0; if TimDateTimeToSeconds(@DateTime) = 0 then // Not set yet exit; DateToAscii(DateTime.Month, DateTime.Day, DateTime.Year, dfDMYLong,
Buffer); StrCat(Buffer, ' '); P := @Buffer[StrLen(Buffer)]; TimeToAscii(DateTime.Hour, DateTime.Minute, tfColonAMPM, P); end; procedure DropListSetSelection(ListID: UInt16; PopupTriggerID: UInt16; Selection :
Int16); var List : ListPtr; begin List := PSList.Ptr(ListID); LstSetSelection(List, Selection); LstMakeItemVisible(List, Selection); LstDrawList(List); CtlSetLabel(PSButton.Ptr(PopupTriggerID), LstGetSelectionText(List, Selection)); end; // Read data from database and put into Field on screen procedure ReadToUIField(var Database : TDatabase; FieldIndex: Int16; Field: TField); var Buffer : array[0..BufSize] of char; Date : DateType; Time : TimeType; DateTime : DateTimeType; begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : begin if PSDatabase.FieldBoolean(Database, FieldIndex) then PSField.SetText(Field, 'True')
15
else PSField.SetText(Field, 'False'); end; ftInt8 : begin StrIToA(Buffer, PSDatabase.FieldInt8(Database, FieldIndex)); PSField.SetText(Field, Buffer); end; ftInt16 : begin StrIToA(Buffer, PSDatabase.FieldInt16(Database, FieldIndex)); PSField.SetText(Field, Buffer); end; ftInt32 : begin StrIToA(Buffer, PSDatabase.FieldInt32(Database, FieldIndex)); PSField.SetText(Field, Buffer); end; ftUInt8 : begin StrIToA(Buffer, PSDatabase.FieldUInt8(Database, FieldIndex)); PSField.SetText(Field, Buffer); end; ftUInt16 : begin StrIToA(Buffer, PSDatabase.FieldUInt16(Database, FieldIndex)); PSField.SetText(Field, Buffer); end; ftUInt32 : begin StrIToA(Buffer, PSDatabase.FieldUInt32(Database, FieldIndex)); PSField.SetText(Field, Buffer); end; ftSingle : begin FormatFloat(Buffer, PSDatabase.FieldSingle(Database, FieldIndex),
PSIODecimalPlaces); PSField.SetText(Field, Buffer); end; ftDouble : begin FormatFloat(Buffer, PSDatabase.FieldDouble(Database, FieldIndex),
PSIODecimalPlaces); PSField.SetText(Field, Buffer); end; ftDate : begin PSDatabase.FieldDate(Database, FieldIndex, Date);
16
FormatDate(Date, DateTime, Buffer); PSField.SetText(Field, Buffer); end; ftTime : begin PSDatabase.FieldTime(Database, FieldIndex, Time); FormatTime(Time, DateTime, Buffer); PSField.SetText(Field, Buffer); end; ftDateTime : begin PSDatabase.FieldDateTime(Database, FieldIndex, DateTime); FormatDateTime(DateTime, Buffer); PSField.SetText(Field, Buffer); end; ftString : begin PSField.SetText(Field, PSDatabase.FieldStringPtr(Database, FieldIndex)); end; ftBinary : FrmCustomAlert(PSIOReadErrorAlert, 'Binary', 'Field', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; // Read data from database and put into Field on screen procedure WriteFromUIField(var Database : TDatabase; FieldIndex: Int16; Field:
TField); var Buffer : array[0..BufSize] of char; P : PChar; Size : UInt32; begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : begin PSField.Text(Field, Buffer, sizeof(Buffer)); if (Buffer[0] = 'T') or (Buffer[0] = 't') then PSDatabase.SetFieldBoolean(Database, FieldIndex, True) else PSDatabase.SetFieldBoolean(Database, FieldIndex, False); end; ftInt8 : begin PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldInt8(Database, FieldIndex, StrAToI(Buffer)); end; ftInt16 : begin
17
PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldInt16(Database, FieldIndex, StrAToI(Buffer)); end; ftInt32 : begin PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldInt32(Database, FieldIndex, StrAToI(Buffer)); end; ftUInt8 : begin PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldUInt8(Database, FieldIndex, StrAToI(Buffer)); end; ftUInt16 : begin PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldUInt16(Database, FieldIndex, StrAToI(Buffer)); end; ftUInt32 : begin PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldUInt32(Database, FieldIndex, StrAToI(Buffer)); end; ftSingle : begin PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldSingle(Database, FieldIndex, FlpAToF(Buffer)); end; ftDouble : begin PSField.Text(Field, Buffer, sizeof(Buffer)); PSDatabase.SetFieldDouble(Database, FieldIndex, FlpAToF(Buffer)); end; ftDate : FrmCustomAlert(PSIOWriteErrorAlert, 'Date', 'Field', ''); ftTime : FrmCustomAlert(PSIOWriteErrorAlert, 'Time', 'Field', ''); ftDateTime : FrmCustomAlert(PSIOWriteErrorAlert, 'DateTime', 'Field', ''); ftString : begin Size := TextLength(Field) + 1; P := MemPtrNew(Size); Text(Field, P, Size); PSDatabase.SetFieldString(Database, FieldIndex, P); MemPtrFree(P); end; ftBinary : FrmCustomAlert(PSIOWriteErrorAlert, 'Binary', 'Field', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', '');
18
end; end; procedure ReadToUISelector(var Database : TDatabase; FieldIndex: Int16; var
SelectorContext: TSelectorContext); var Date : DateType; Time : TimeType; P : PChar; begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : FrmCustomAlert(PSIOReadErrorAlert, 'Boolean', 'Selector', ''); ftInt8 : FrmCustomAlert(PSIOReadErrorAlert, 'Int8', 'Selector', ''); ftInt16 : FrmCustomAlert(PSIOReadErrorAlert, 'Int16', 'Selector', ''); ftInt32 : FrmCustomAlert(PSIOReadErrorAlert, 'Int32', 'Selector', ''); ftUInt8 : FrmCustomAlert(PSIOReadErrorAlert, 'UInt8', 'Selector', ''); ftUInt16 : FrmCustomAlert(PSIOReadErrorAlert, 'UInt16', 'Selector', ''); ftUInt32 : FrmCustomAlert(PSIOReadErrorAlert, 'UInt32', 'Selector', ''); ftSingle : FrmCustomAlert(PSIOReadErrorAlert, 'Single', 'Selector', ''); ftDouble : FrmCustomAlert(PSIOReadErrorAlert, 'Double', 'Selector', ''); ftDate : begin PSDatabase.FieldDate(Database, FieldIndex, Date); FormatDate(Date, SelectorContext.DateTime, SelectorContext.Buffer); PSButton.SetCaption(SelectorContext.SelectorTriggerID, SelectorContext.Buffer); end; ftTime : begin PSDatabase.FieldTime(Database, FieldIndex, Time); FormatTime(Time, SelectorContext.DateTime, SelectorContext.Buffer); PSButton.SetCaption(SelectorContext.SelectorTriggerID, SelectorContext.Buffer); end; ftDateTime : begin PSDatabase.FieldDateTime(Database, FieldIndex, SelectorContext.DateTime); FormatDateTime(SelectorContext.DateTime, SelectorContext.Buffer); PSButton.SetCaption(SelectorContext.SelectorTriggerID, SelectorContext.Buffer); end; ftString : FrmCustomAlert(PSIOReadErrorAlert, 'String', 'Selector', ''); ftBinary : FrmCustomAlert(PSIOReadErrorAlert, 'Binary', 'Selector', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure EditUISelector(var Database : TDatabase; FieldIndex: Int16; var
SelectorContext: TSelectorContext); var
19
NewDT : DateTimeType; P : PChar; begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : FrmCustomAlert(PSIOEditErrorAlert, 'Boolean', 'Selector', ''); ftInt8 : FrmCustomAlert(PSIOEditErrorAlert, 'Int8', 'Selector', ''); ftInt16 : FrmCustomAlert(PSIOEditErrorAlert, 'Int16', 'Selector', ''); ftInt32 : FrmCustomAlert(PSIOEditErrorAlert, 'Int32', 'Selector', ''); ftUInt8 : FrmCustomAlert(PSIOEditErrorAlert, 'UInt8', 'Selector', ''); ftUInt16 : FrmCustomAlert(PSIOEditErrorAlert, 'UInt16', 'Selector', ''); ftUInt32 : FrmCustomAlert(PSIOEditErrorAlert, 'UInt32', 'Selector', ''); ftSingle : FrmCustomAlert(PSIOEditErrorAlert, 'Single', 'Selector', ''); ftDouble : FrmCustomAlert(PSIOEditErrorAlert, 'Double', 'Selector', ''); ftDate : begin NewDT := SelectorContext.DateTime; if NewDT.Year = 0 then // Not set yet TimSecondsToDateTime(TimGetSeconds, @NewDT); // Default to current date if not SelectDay(selectDayByDay, NewDT.Month, NewDT.Day, NewDT.Year,
'Select Date') then exit; SelectorContext.DateTime := NewDT; DateToAscii(SelectorContext.DateTime.Month, SelectorContext.DateTime.Day,
SelectorContext.DateTime.Year, dfDMYLong, SelectorContext.Buffer); PSButton.SetCaption(SelectorContext.SelectorTriggerID, SelectorContext.Buffer); end; ftTime : begin NewDT := SelectorContext.DateTime; if not SelectOneTime(NewDT.Hour, NewDT.Minute, 'Select Time') then exit; SelectorContext.DateTime := NewDT; TimeToAscii(SelectorContext.DateTime.Hour, SelectorContext.DateTime.Minute,
tfColonAMPM, SelectorContext.Buffer); PSButton.SetCaption(SelectorContext.SelectorTriggerID, SelectorContext.Buffer); end; ftDateTime : begin NewDT := SelectorContext.DateTime; if TimDateTimeToSeconds(@NewDT) = 0 then // Not set yet TimSecondsToDateTime(TimGetSeconds, @NewDT); // Default to current
date/time
20
if not SelectDay(selectDayByDay, NewDT.Month, NewDT.Day, NewDT.Year, 'Select Date') then
exit; if not SelectOneTime(NewDT.Hour, NewDT.Minute, 'Select Time') then exit; SelectorContext.DateTime := NewDT; FormatDateTime(SelectorContext.DateTime, SelectorContext.Buffer); PSButton.SetCaption(SelectorContext.SelectorTriggerID, SelectorContext.Buffer); end; ftString : FrmCustomAlert(PSIOEditErrorAlert, 'String', 'Selector', ''); ftBinary : FrmCustomAlert(PSIOEditErrorAlert, 'Binary', 'Selector', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure WriteFromUISelector(var Database : TDatabase; FieldIndex: Int16; var
SelectorContext: TSelectorContext); var Date : DateType; Time : TimeType; begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : FrmCustomAlert(PSIOWriteErrorAlert, 'Boolean', 'Selector', ''); ftInt8 : FrmCustomAlert(PSIOWriteErrorAlert, 'Int8', 'Selector', ''); ftInt16 : FrmCustomAlert(PSIOWriteErrorAlert, 'Int16', 'Selector', ''); ftInt32 : FrmCustomAlert(PSIOWriteErrorAlert, 'Int32', 'Selector', ''); ftUInt8 : FrmCustomAlert(PSIOWriteErrorAlert, 'UInt8', 'Selector', ''); ftUInt16 : FrmCustomAlert(PSIOWriteErrorAlert, 'UInt16', 'Selector', ''); ftUInt32 : FrmCustomAlert(PSIOWriteErrorAlert, 'UInt32', 'Selector', ''); ftSingle : FrmCustomAlert(PSIOWriteErrorAlert, 'Single', 'Selector', ''); ftDouble : FrmCustomAlert(PSIOWriteErrorAlert, 'Double', 'Selector', ''); ftDate : begin if SelectorContext.DateTime.Year = 0 then Date.Bits := 0 else Date.Bits := ((SelectorContext.DateTime.Year-1904) shl 9) or (SelectorContext.DateTime.Month shl 5) or SelectorContext.DateTime.Day; PSDatabase.SetFieldDate(Database, FieldIndex, Date); end; ftTime : begin Time.Hours := SelectorContext.DateTime.Hour; Time.Minutes := SelectorContext.DateTime.Minute;
21
PSDatabase.SetFieldTime(Database, FieldIndex, Time); end; ftDateTime : begin PSDatabase.SetFieldDateTime(Database, FieldIndex, SelectorContext.DateTime); end; ftString : FrmCustomAlert(PSIOWriteErrorAlert, 'String', 'Selector', ''); ftBinary : FrmCustomAlert(PSIOWriteErrorAlert, 'Binary', 'Selector', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure ReadToUISlider(var Database : TDatabase; FieldIndex: Int16; Slider:
TSlider); begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : FrmCustomAlert(PSIOReadErrorAlert, 'Boolean', 'Slider', ''); ftInt8 : PSSlider.SetValue(Slider, PSDatabase.FieldInt8(Database, FieldIndex)); ftInt16 : PSSlider.SetValue(Slider, PSDatabase.FieldInt16(Database, FieldIndex)); ftInt32 : PSSlider.SetValue(Slider, PSDatabase.FieldInt32(Database, FieldIndex)); ftUInt8 : PSSlider.SetValue(Slider, PSDatabase.FieldUInt8(Database, FieldIndex)); ftUInt16 : PSSlider.SetValue(Slider, PSDatabase.FieldUInt16(Database, FieldIndex)); ftUInt32 : PSSlider.SetValue(Slider, PSDatabase.FieldUInt32(Database, FieldIndex)); ftSingle : PSSlider.SetValue(Slider, Round(PSDatabase.FieldSingle(Database,
FieldIndex))); ftDouble : PSSlider.SetValue(Slider, Round(PSDatabase.FieldSingle(Database,
FieldIndex))); ftDate : FrmCustomAlert(PSIOReadErrorAlert, 'Date', 'Slider', ''); ftTime : FrmCustomAlert(PSIOReadErrorAlert, 'Time', 'Slider', ''); ftDateTime : FrmCustomAlert(PSIOReadErrorAlert, 'DateTime', 'Slider', ''); ftString : PSSlider.SetValue(Slider, StrAToI(PSDatabase.FieldStringPtr(Database,
FieldIndex))); ftBinary : FrmCustomAlert(PSIOReadErrorAlert, 'Binary', 'Slider', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure WriteFromUISlider(var Database : TDatabase; FieldIndex: Int16; Slider:
TSlider); var Buffer : array[0..BufSize] of char;
22
begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : FrmCustomAlert(PSIOWriteErrorAlert, 'Boolean', 'Slider', ''); ftInt8 : PSDatabase.SetFieldInt8(Database, FieldIndex, PSSlider.Value(Slider)); ftInt16 : PSDatabase.SetFieldInt16(Database, FieldIndex, PSSlider.Value(Slider)); ftInt32 : PSDatabase.SetFieldInt32(Database, FieldIndex, PSSlider.Value(Slider)); ftUInt8 : PSDatabase.SetFieldUInt8(Database, FieldIndex, PSSlider.Value(Slider)); ftUInt16 : PSDatabase.SetFieldUInt16(Database, FieldIndex, PSSlider.Value(Slider)); ftUInt32 : PSDatabase.SetFieldUInt32(Database, FieldIndex, PSSlider.Value(Slider)); ftSingle : FrmCustomAlert(PSIOWriteErrorAlert, 'Single', 'Slider', ''); ftDouble : FrmCustomAlert(PSIOWriteErrorAlert, 'Double', 'Slider', ''); ftDate : FrmCustomAlert(PSIOWriteErrorAlert, 'Date', 'Slider', ''); ftTime : FrmCustomAlert(PSIOWriteErrorAlert, 'Time', 'Slider', ''); ftDateTime : FrmCustomAlert(PSIOWriteErrorAlert, 'DateTime', 'Slider', ''); ftString : begin StrIToA(Buffer, PSSlider.Value(Slider)); PSDatabase.SetFieldString(Database, FieldIndex, Buffer); end; ftBinary : FrmCustomAlert(PSIOWriteErrorAlert, 'Binary', 'Slider', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure ReadToUICheckbox(var Database : TDatabase; FieldIndex: Int16;
Checkbox: TCheckbox); var Buffer : array[0..BufSize] of char; begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : PSCheckbox.SetChecked(Checkbox, PSDatabase.FieldBoolean(Database,
FieldIndex)); ftInt8 : PSCheckbox.SetChecked(Checkbox, PSDatabase.FieldInt8(Database,
FieldIndex)<>0); ftInt16 : PSCheckbox.SetChecked(Checkbox, PSDatabase.FieldInt16(Database,
FieldIndex)<>0); ftInt32 : PSCheckbox.SetChecked(Checkbox, PSDatabase.FieldInt32(Database,
FieldIndex)<>0); ftUInt8 : PSCheckbox.SetChecked(Checkbox, PSDatabase.FieldUInt8(Database,
FieldIndex)<>0); ftUInt16 : PSCheckbox.SetChecked(Checkbox, PSDatabase.FieldUInt16(Database,
FieldIndex)<>0); ftUInt32 : PSCheckbox.SetChecked(Checkbox, PSDatabase.FieldUInt32(Database,
FieldIndex)<>0);
23
ftSingle : FrmCustomAlert(PSIOReadErrorAlert, 'Single', 'Checkbox', ''); ftDouble : FrmCustomAlert(PSIOReadErrorAlert, 'Double', 'Checkbox', ''); ftDate : FrmCustomAlert(PSIOReadErrorAlert, 'Date', 'Checkbox', ''); ftTime : FrmCustomAlert(PSIOReadErrorAlert, 'Time', 'Checkbox', ''); ftDateTime : FrmCustomAlert(PSIOReadErrorAlert, 'DateTime', 'Checkbox', ''); ftString : begin if PSDatabase.FieldStringPtr(Database, FieldIndex)[0] = 'T' then PSCheckbox.SetChecked(Checkbox, True) else PSCheckbox.SetChecked(Checkbox, False); end; ftBinary : FrmCustomAlert(PSIOReadErrorAlert, 'Binary', 'Slider', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure WriteFromUICheckbox(var Database : TDatabase; FieldIndex: Int16;
Checkbox: TCheckbox); var Buffer : array[0..BufSize] of char; begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : PSDatabase.SetFieldBoolean(Database, FieldIndex,
PSCheckbox.Checked(Checkbox)); ftInt8 : PSDatabase.SetFieldInt8(Database, FieldIndex,
Int8(PSCheckbox.Checked(Checkbox))); ftInt16 : PSDatabase.SetFieldInt16(Database, FieldIndex,
Int16(PSCheckbox.Checked(Checkbox))); ftInt32 : PSDatabase.SetFieldInt32(Database, FieldIndex,
Int32(PSCheckbox.Checked(Checkbox))); ftUInt8 : PSDatabase.SetFieldUInt8(Database, FieldIndex,
UInt8(PSCheckbox.Checked(Checkbox))); ftUInt16 : PSDatabase.SetFieldUInt16(Database, FieldIndex,
UInt16(PSCheckbox.Checked(Checkbox))); ftUInt32 : PSDatabase.SetFieldUInt32(Database, FieldIndex,
UInt32(PSCheckbox.Checked(Checkbox))); ftSingle : FrmCustomAlert(PSIOWriteErrorAlert, 'Single', 'Checkbox', ''); ftDouble : FrmCustomAlert(PSIOWriteErrorAlert, 'Double', 'Checkbox', ''); ftDate : FrmCustomAlert(PSIOWriteErrorAlert, 'Date', 'Checkbox', ''); ftTime : FrmCustomAlert(PSIOWriteErrorAlert, 'Time', 'Checkbox', ''); ftDateTime : FrmCustomAlert(PSIOWriteErrorAlert, 'DateTime', 'Checkbox', ''); ftString : begin if PSCheckbox.Checked(Checkbox) then
24
PSDatabase.SetFieldString(Database, FieldIndex, 'True') else PSDatabase.SetFieldString(Database, FieldIndex, 'False'); end; ftBinary : FrmCustomAlert(PSIOWriteErrorAlert, 'Binary', 'Checkbox', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure ReadToUIDropList(var Database : TDatabase; FieldIndex: Int16; List: TList;
PopupTrigger: TPopupTrigger); begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : DropListSetSelection(List, PopupTrigger,
Integer(PSDatabase.FieldBoolean(Database, FieldIndex))); ftInt8 : DropListSetSelection(List, PopupTrigger, PSDatabase.FieldInt8(Database,
FieldIndex)); ftInt16 : DropListSetSelection(List, PopupTrigger, PSDatabase.FieldInt16(Database,
FieldIndex)); ftInt32 : DropListSetSelection(List, PopupTrigger, PSDatabase.FieldInt32(Database,
FieldIndex)); ftUInt8 : DropListSetSelection(List, PopupTrigger, PSDatabase.FieldUInt8(Database,
FieldIndex)); ftUInt16 : DropListSetSelection(List, PopupTrigger,
PSDatabase.FieldUInt16(Database, FieldIndex)); ftUInt32 : DropListSetSelection(List, PopupTrigger,
PSDatabase.FieldUInt32(Database, FieldIndex)); ftSingle : FrmCustomAlert(PSIOReadErrorAlert, 'Single', 'DropList', ''); ftDouble : FrmCustomAlert(PSIOReadErrorAlert, 'Double', 'DropList', ''); ftDate : FrmCustomAlert(PSIOReadErrorAlert, 'Date', 'DropList', ''); ftTime : FrmCustomAlert(PSIOReadErrorAlert, 'Time', 'DropList', ''); ftDateTime : FrmCustomAlert(PSIOReadErrorAlert, 'DateTime', 'DropList', ''); ftString : DropListSetSelection(List, PopupTrigger,
StrAToI(PSDatabase.FieldStringPtr(Database, FieldIndex))); ftBinary : FrmCustomAlert(PSIOReadErrorAlert, 'Binary', 'DropList', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; procedure WriteFromUIDropList(var Database : TDatabase; FieldIndex: Int16; List:
TList; PopupTrigger: TPopupTrigger); var Buffer : array[0..BufSize] of char;
25
begin case Database.FieldDefs^[FieldIndex].DataType of ftBoolean : PSDatabase.SetFieldBoolean(Database, FieldIndex,
Boolean(PSList.SelectionIndex(List))); ftInt8 : PSDatabase.SetFieldInt8(Database, FieldIndex, PSList.SelectionIndex(List)); ftInt16 : PSDatabase.SetFieldInt16(Database, FieldIndex,
PSList.SelectionIndex(List)); ftInt32 : PSDatabase.SetFieldInt32(Database, FieldIndex,
PSList.SelectionIndex(List)); ftUInt8 : PSDatabase.SetFieldUInt8(Database, FieldIndex,
PSList.SelectionIndex(List)); ftUInt16 : PSDatabase.SetFieldUInt16(Database, FieldIndex,
PSList.SelectionIndex(List)); ftUInt32 : PSDatabase.SetFieldUInt32(Database, FieldIndex,
PSList.SelectionIndex(List)); ftSingle : FrmCustomAlert(PSIOWriteErrorAlert, 'Single', 'DropList', ''); ftDouble : FrmCustomAlert(PSIOWriteErrorAlert, 'Double', 'DropList', ''); ftDate : FrmCustomAlert(PSIOWriteErrorAlert, 'Date', 'DropList', ''); ftTime : FrmCustomAlert(PSIOWriteErrorAlert, 'Time', 'DropList', ''); ftDateTime : FrmCustomAlert(PSIOWriteErrorAlert, 'DateTime', 'DropList', ''); ftString : begin StrIToA(Buffer, PSList.SelectionIndex(List)); PSDatabase.SetFieldString(Database, FieldIndex, Buffer); end; ftBinary : FrmCustomAlert(PSIOWriteErrorAlert, 'Binary', 'DropList', ''); else FrmCustomAlert(PSIOErrorAlert, 'Unknown DB field datatype.', '', ''); end; end; end. Unit TableList; // DB Table Example v1.0 // Created by Clayton Powell // Evolutionary Solutions - www.evolutionary.net interface uses PalmOS, PSDatabase, PSTable; type IntString = Array[0..maxStrIToALen] of char;
26
DateTimeString = Array[0..longDateStrLength+timeStringLength+1] of char; DateString = Array[0..longDateStrLength+1] of char; TimeString = Array[0..timeStringLength+1] of char; TTableList = record TableID : UInt16; Database : ^TDatabase; CompareFunction : TCompare; // For Detail table - True if child of Master table RepeatButtonUp, RepeatButtonDown : UInt16; TopVisibleRecord: Integer; // number of first record shown in table AllowScrollUp, AllowScrollDown: Boolean; // Allow scroll in each direction? TableDrawItemFunc : TableDrawItemFuncType; end; function Child(var Database: TDatabase; CustomParam: Pointer): Boolean; procedure OpenTable(var aTableList: TTableList); procedure LoadTable(var aTableList: TTableList); procedure DrawTable(var aTableList: TTableList); procedure RefreshTable(var aTableList: TTableList); procedure ScrollUp(var aTableList: TTableList); procedure ScrollDown(var aTableList: TTableList); procedure DrawTruncInt32(Value : Int32; var bounds: RectangleType; Left, Right:
Int16); procedure DrawTruncUInt32Hex(Value : UInt32; var bounds: RectangleType; Left,
Right: Int16); procedure DrawTruncUInt32(Value : UInt32; var bounds: RectangleType; Left, Right:
Int16); procedure DrawTruncDateTime(var DT : DateTimeType; var bounds: RectangleType;
Left, Right: Int16); procedure DrawTruncDate(var DT : DateTimeType; var bounds: RectangleType; Left,
Right: Int16); procedure DrawTruncTime(var DT : DateTimeType; var bounds: RectangleType; Left,
Right: Int16); procedure DrawTruncChars(S : PChar; var bounds: RectangleType; Left, Right: Int16); procedure DrawChar(S : PChar; var bounds: RectangleType; Left, Right: Int16); implementation procedure DrawTruncInt32(Value : Int32; var bounds: RectangleType; Left, Right:
Int16); var S : IntString; begin StrIToA(S, Value);
27
WinDrawTruncChars(S, StrLen(S), Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-Left-5);
end; procedure DrawTruncUInt32Hex(Value : UInt32; var bounds: RectangleType; Left,
Right: Int16); var S : IntString; begin StrIToH(S, Value); WinDrawTruncChars(S, StrLen(S), Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-
Left-5); end; procedure DrawTruncUInt32(Value : UInt32; var bounds: RectangleType; Left, Right:
Int16); var S : IntString; begin StrIToA(S, Value); WinDrawTruncChars(S, StrLen(S), Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-
Left-5); end; procedure DrawTruncDateTime(var DT : DateTimeType; var bounds: RectangleType;
Left, Right: Int16); var S : DateTimeString; P : PChar; begin P := S; DateToAscii(dt.Month, dt.Day, dt.Year, dfDMYLong, P); StrCat(P, ' '); P := P + StrLen(S); TimeToAscii(dt.Hour, dt.Minute, tfColonAMPM, P); WinDrawTruncChars(S, StrLen(S), Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-
Left-5); end; procedure DrawTruncTime(var DT : DateTimeType; var bounds: RectangleType; Left,
Right: Int16); var S : TimeString; begin TimeToAscii(dt.Hour, dt.Minute, tfColonAMPM, S); WinDrawTruncChars(S, StrLen(S), Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-
Left-5); end;
28
procedure DrawTruncDate(var DT : DateTimeType; var bounds: RectangleType; Left,
Right: Int16); var S : DateString; begin DateToAscii(dt.Month, dt.Day, dt.Year, dfDMYLong, S); WinDrawTruncChars(S, StrLen(S), Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-
Left-5); end; procedure DrawTruncChars(S : PChar; var bounds: RectangleType; Left, Right: Int16); begin WinDrawTruncChars(S, StrLen(S), Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-
Left-5); end; procedure DrawChar(S : PChar; var bounds: RectangleType; Left, Right: Int16); begin WinDrawTruncChars(S, 1, Bounds.topLeft.x+Left, Bounds.topLeft.y, Right-Left); end; procedure UpdateScrollButtons(var aTableList: TTableList); var ScrollUp, ScrollDown: Integer; Form : FormPtr; begin Form := FrmGetActiveForm; ScrollUp := FrmGetObjectIndex(Form, aTableList.RepeatButtonUp); ScrollDown := FrmGetObjectIndex(Form, aTableList.RepeatButtonDown); FrmUpdateScrollers(Form, ScrollUp, ScrollDown, aTableList.AllowScrollUp,
aTableList.AllowScrollDown); end; procedure LoadTable(var aTableList: TTableList); var i: Integer; Table: TablePtr; RowCount : Integer; begin RowCount := PSTable.RowCount(aTableList.TableID); Table := PSTable.Ptr(aTableList.TableID); for i := 0 to RowCount-1 do // Clear table begin TblSetRowUsable(Table, i, False);
29
TblMarkRowInvalid(Table, i); end; // Position DB to top visible record PSDatabase.MoveTo(aTableList.Database^, aTableList.TopVisibleRecord); PSDatabase.Prior(aTableList.Database^); PSDatabase.FindNext(aTableList.Database^, aTableList.CompareFunction, nil); if PSDatabase.EOF(aTableList.Database^) then // Not valid so go to top of list PSDatabase.FindFirst(aTableList.Database^, aTableList.CompareFunction, nil); aTableList.TopVisibleRecord := PSDatabase.RecNo(aTableList.Database^); // Test if we can scroll up by seeing if a previous record exists aTableList.AllowScrollUp := False; if not PSDatabase.BOF(aTableList.Database^) then begin PSDatabase.FindPrior(aTableList.Database^, aTableList.CompareFunction, nil); if not PSDatabase.BOF(aTableList.Database^) then aTableList.AllowScrollUp := True; PSDatabase.FindNext(aTableList.Database^, aTableList.CompareFunction, nil); end; // Now load each table record until end of DB or table full i := 0; while not PSDatabase.EOF(aTableList.Database^) do begin TblSetItemStyle(Table, i, 0, customTableItem); TblSetItemInt(Table, i, 0, PSDatabase.RecNo(aTableList.Database^)); // Store rec
num for later rendering in callback TblSetRowUsable(Table, i, True); Inc(i); if i >= RowCount then break; // Table full PSDatabase.FindNext(aTableList.Database^, aTableList.CompareFunction, nil); end; // Test if we can scroll down by seeing if a next record exists aTableList.AllowScrollDown := False; if not PSDatabase.EOF(aTableList.Database^) then PSDatabase.FindNext(aTableList.Database^, aTableList.CompareFunction, nil); if not PSDatabase.EOF(aTableList.Database^) then aTableList.AllowScrollDown := True; UpdateScrollButtons(aTableList); end; procedure DrawTable(var aTableList: TTableList);
30
begin TblRedrawTable(PSTable.Ptr(aTableList.TableID)); end; procedure RefreshTable(var aTableList: TTableList); begin aTableList.TopVisibleRecord := 0; LoadTable(aTableList); DrawTable(aTableList); end; procedure ScrollUp(var aTableList : TTableList); begin if not aTableList.AllowScrollUp then begin SndPlaySystemSound(sndError); exit; end; PSDatabase.MoveTo(aTableList.Database^, aTableList.TopVisibleRecord); PSDatabase.FindPrior(aTableList.Database^, aTableList.CompareFunction, nil); aTableList.TopVisibleRecord := PSDatabase.RecNo(aTableList.Database^); LoadTable(aTableList); DrawTable(aTableList); end; procedure ScrollDown(var aTableList : TTableList); begin if not aTableList.AllowScrollDown then begin SndPlaySystemSound(sndError); exit; end; PSDatabase.MoveTo(aTableList.Database^, aTableList.TopVisibleRecord); PSDatabase.FindNext(aTableList.Database^, aTableList.CompareFunction, nil); aTableList.TopVisibleRecord := PSDatabase.RecNo(aTableList.Database^); LoadTable(aTableList); DrawTable(aTableList); end; // Default to all records as child of master for non detail tables function Child(var Database: TDatabase; CustomParam: Pointer): Boolean; begin Result := True; end;
31
procedure OpenTable(var aTableList: TTableList); var Table: TablePtr; begin // Load table and draw form Table := PSTable.Ptr(aTableList.TableID); TblSetCustomDrawProcedure(Table, 0, aTableList.TableDrawItemFunc); TblSetColumnUsable(Table, 0, True); end; end. ibrary PConduit; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes, Forms, UConduit in 'UConduit.pas' {DataModule1: TDataModule}; begin DataModule1 := TDataModule1.Create(Application); end. interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, TabdPalmConduit, Db, TabdConduitSync, DBTables; type TDataModule1 = class(TDataModule) TabdConduit: TTabdConduit;
32
TPalmCliente: TTabdConduitDb; TabCliente: TTable; TPalmCep: TTabdConduitDb; TabCep: TTable; qry_aux: TQuery; procedure TabdConduitOpenConduit(var Error: Integer); private procedure SincClienteNoDesktop; procedure IncluiClienteNoPalm; procedure EncontraEndereco; procedure IncluiCepNoPalm(cep:TStringList); public { Public declarations } end; var DataModule1: TDataModule1; implementation {$R *.DFM} procedure TDataModule1.SincClienteNoDesktop; type TRegistro = record Codigo: LongInt; Nome: string; Rua: string; Comp: string; Bairro: string; Cidade: string; Estado: string; end; var Registro: TRegistro; begin TPalmCliente.Open; TabCliente.open; try //encontrar registros modificados no palm while not TPalmCliente.Eof do begin //o registro está apagado? if (TPalmCliente.Attributes and sraRecAttrDeleted) > 0 then begin if TabCliente.FindKey([TPalmCliente.RecordId]) then
33
TabCliente.Delete; TPalmCliente.Next; end else //o registro não foi modificado? if (TPalmCliente.Attributes and sraRecAttrDirty) = 0 then begin TPalmCliente.Next; end else //o registro foi alterado.. begin //obtendo os valores dos campos da tabela do Palm Registro.Codigo := StrtoInt(Trim(TPalmCliente.Fields[0].ArrayValue[0])); Registro.Nome := VartoStr(Trim(TPalmCliente.Fields[1].ArrayValue[0])); Registro.Rua := VartoStr(Trim(TPalmCliente.Fields[2].ArrayValue[0])); Registro.Comp := VartoStr(Trim(TPalmCliente.Fields[3].ArrayValue[0])); Registro.Bairro := VartoStr(Trim(TPalmCliente.Fields[4].ArrayValue[0])); Registro.Cidade := VartoStr(Trim(TPalmCliente.Fields[5].ArrayValue[0])); Registro.Estado := VartoStr(Trim(TPalmCliente.Fields[6].ArrayValue[0])); //encontramos o registro na tabela local if TabCliente.FindKey([TPalmCliente.RecordId]) then TabCliente.Edit else TabCliente.Insert; with TabCliente do begin //gravamos as informações obtidas no banco local FieldByName('Num_Registro').AsInteger := TPalmCliente.RecordId; FieldByName('Cd_cliente').AsInteger := Registro.Codigo; FieldByName('Nm_cliente').AsString := Registro.Nome; FieldByName('Log_Cliente').AsString := Registro.Rua; FieldByName('Comp_Cli').AsString := Registro.Comp; FieldByName('Bairro_Cli').AsString := Registro.Bairro; FieldByName('Cid_Cli').AsString := Registro.Cidade; FieldByName('Uf_cli').AsString := Registro.Estado; FieldByName('Apagado').AsBoolean := False; FieldByName('Modificado').AsBoolean := False; FieldByName('Criado').AsBoolean := False; Post; end; //processar eventos pendentes TabdConduit.YieldCycles(1); TPalmCliente.Next; end;
34
end; //verificar se registros foram criados, modificados ou apagados no banco local TabCliente.First; while not TabCliente.Eof do begin //registro criado? if (TabCliente.FieldByName('Criado').AsBoolean) then IncluiClienteNoPalm; //registro modificado? if (TabCliente.FieldByName('Modificado').AsBoolean) then begin with TPalmCliente do try //ver se o registro está no palm Find(TPalmCliente.FieldByName('Num_Registro').AsInteger); Edit; FieldByName('Cd_Cliente').AsString :=
TabCliente.FieldByName('Cd_cliente').AsString; FieldByName('Nm_Cli').AsString :=
TabCliente.FieldByName('Nm_Cliente').AsString; FieldByName('Log_Cli').AsString :=
TabCliente.FieldByName('Log_cliente').AsString; FieldByName('Comp_Cli').AsString :=
TabCliente.FieldByName('Comp_cli').AsString; FieldByName('Bairro_Cli').AsString :=
TabCliente.FieldByName('Bairro_cli').AsString; FieldByName('Cid_Cli').AsString :=
TabCliente.FieldByName('Cid_cli').AsString; FieldByName('Uf_Cli').AsString :=
TabCliente.FieldByName('Uf_cli').AsString; Post; except //incluir no Palm se não encontrou IncluiClienteNoPalm; end; //zerar todos os flags TabCliente.Edit; TabCliente.FieldByName('Modificado').AsBoolean := False; TabCliente.FieldByName('Apagado').AsBoolean := False; TabCliente.Post; end; //registro apagado? if (TabCliente.FieldByName('Apagado').AsBoolean) then begin with TPalmCliente do
35
try //procura o registro no palm Find(TabCliente.FieldbyName('Num_Registro').AsInteger); Delete; //apaga também no banco local TabCliente.Delete; Continue; except //se não encontrar no palm, apaga somente no banco local TabCliente.Delete; Continue; end; end; Application.ProcessMessages; TabCliente.Next; end; finally //remover todos os arquivos apagados no palm TPalmCliente.PurgeDeletedRecords; //resetar todas as flags TPalmCliente.ResetSyncFlags; //fechar as tabelas.. TPalmCliente.Close; TabCliente.Close; end; end; procedure TDataModule1.IncluiClienteNoPalm; begin //incluir novo cliente no palm with TPalmCliente do begin Append; FieldByName('Cd_Cliente').AsString :=
TabCliente.FieldByName('Cd_cliente').AsString; FieldByName('Nm_Cli').AsString :=
TabCliente.FieldByName('Nm_Cliente').AsString; FieldByName('Log_Cli').AsString :=
TabCliente.FieldByName('Log_cliente').AsString; FieldByName('Comp_Cli').AsString :=
TabCliente.FieldByName('Comp_cli').AsString; FieldByName('Bairro_Cli').AsString :=
TabCliente.FieldByName('Bairro_cli').AsString; FieldByName('Cid_Cli').AsString := TabCliente.FieldByName('Cid_cli').AsString;
36
FieldByName('Uf_Cli').AsString := TabCliente.FieldByName('Uf_cli').AsString; Post; //pegar o id criado pelo palm Last; TabCliente.Edit; TabCliente.FieldByName('Num_Registro').AsInteger := RecordId; TabCliente.FieldByName('Criado').AsBoolean := False; TabCliente.FieldByName('Modificado').AsBoolean := False; TabCliente.FieldByName('Apagado').AsBoolean := False; TabCliente.Post; end; end; procedure TDataModule1.TabdConduitOpenConduit(var Error: Integer); begin Error := 0; //sincronizar as tabelas... SincClienteNoDesktop; EncontraEndereco; end; procedure TDataModule1.EncontraEndereco; type TRegistro = record logradouro: string; cidade: string; bairro: string; cep: string; uf: string; end; var Registro: TRegistro; Ceps_Busca : TSTringList; begin Ceps_Busca := TSTringList.Create; TPalmCep.Open; TabCep.open; //encontrar registros modificados no palm try TPalmCep.First; while not TPalmCep.Eof do begin //o registro não foi modificado desde a ultima consulta if (TPalmCep.Attributes and sraRecAttrDirty) = 0 then begin TPalmCep.Next;
37
end else if (TPalmCliente.Attributes and sraRecAttrDeleted) > 0 then begin TPalmCep.Next; end else begin //obtendo os valores dos campos da tabela do Palm Ceps_Busca.add(VartoStr(Trim(TPalmCep.Fields[3].ArrayValue[0]))); TPalmCep.Delete; TabdConduit.YieldCycles(1); TPalmCep.Next; end; end; finally IncluiCepNoPalm(Ceps_Busca); //remover todos os arquivos apagados no palm TPalmCep.PurgeDeletedRecords; //resetar todas as flags TPalmCep.ResetSyncFlags; //fechar as tabelas.. TPalmCep.Close; TabCep.Close; end; end; procedure TDataModule1.IncluiCepNoPalm(cep:TStringList); var i:integer; begin for i:=0 to (cep.Count -1) do begin with Qry_aux do begin Close; Sql.Clear; Sql.Add('Select * from ceps where cep8_log = ' + #39 + Trim(cep[i]) + #39); try open except on e: edatabaseerror do
38
begin //faça o tratamento// end; end; if RecordCount > 0 then begin TPalmCep.Append; TPalmCep.FieldByName('Rua').AsString := FieldByName('Nome_log').AsString; TPalmCep.FieldByName('Cidade').AsString :=
FieldByName('Local_Log').AsString; TPalmCep.FieldByName('Bairro').AsString := FieldByName
('Bair8_Log').AsString; TPalmCep.FieldByName('Cep').AsString := FieldByName('cep8_Log').AsSTring; TPalmCep.FieldByName('Uf').AsString := FieldByName('Uf_Log').AsString; TPalmCep.Post; end; end; end; end; end.