Como funciona?

Sua aplicação utilizará uma versão modificada da biblioteca SQLite, contendo o código do LiteSync, para acessar o banco de dados.

As modificações na biblioteca do SQLite são internas e a interface é a mesma.

As bibliotecas do LiteSync comunicarão umas com as outras trocando dados de transação.






Replicação

Na primeira vez que a aplicação for aberta, ela conectará com outro(s) nó(s) e baixará uma cópia limpa do banco de dados.

Em uma topologia centralizada, o nó primário enviará a cópia do banco de dados para os nós secundários.

Assim que for baixado, o nó iniciará a sincronização.



Sincronização

Assim que os nós possuírem o mesmo banco de dados, eles compartilharão as transações que foram executadas quando eles estavam off-line.

Logo que estiverem em modo on-line e uma transação for executada em um nó, ela será transferida para ser executada em nós conectados.

Se um nó estiver off-line, a transação será armazenada em um log local para ser compartilhada posteriormente.



EU PRECISO ALTERAR O CÓDIGO DE MINHA APLICAÇÃO?

Exitem alguns passos, mas devemos alterar basicamente a URI de abertura do banco de dados, do cógido abaixo:

“file:/path/to/app.db”

para algo como:

“file:/path/to/app.db?node=secondary&connect=tcp://server.ip:1234”

A boa notícia é que o LiteSync utiliza a interface nativa do SQLite3. Isso significa que não precisaremos utilizar outra API.



Conexão

Cada nó tem 2 opções:

ligar com um endereço
conectar com o endereço de um ponto

Assim, você poderá escolher qual ponto se conectará a outro. Isso é útil quando um deles está atrás de um roteador ou de um firewall.



Topologias Suportadas


Centralizada, Topologia Estrela


Nessa topologia, temos um nó com o qual todos os outros nós se conectarão, então ele precisa estar on-line para que a sincronização aconteça.

Aqui estão alguns exemplos de configuração:


O nó primário pode ligar-se a um endereço e um nó secundário conectar-se a ele.

Nó primário:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234"

Nó secundário: (em outro dispositivo)

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"


O nó primário pode também conectar-se a nós secundários.

Nó primário:

"file:/home/user/app.db?node=primary&connect=tcp://address1:port1,tcp://address2:port2"

Nós secundários: (cada um em um dispositivo separado)

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"


Podemos também utilizar um misto das 2 opções.

Nó primário:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234&connect=tcp://address1:port1"

Nó secundário 1:

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"

Nó secundário 2:

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"



Status de Sincronização

Podemos checar o status de sincronização utilizando o seguinte comando:

PRAGMA sync_status

Ele retorna uma string JSON.



Checando se o banco de dados está pronto

Se a aplicação está sendo aberta pela primeira vez em um determinado dispositivo, ela pode baixar uma cópia do banco de dados de outro dispositivo. Até que essa ação seja realizada, não podemos acessar o banco de dados.

Podemos recuperar o status de sincronização e checar a variável db_is_ready.

Verifique os exemplos básicos de aplicações abaixo:



Como utilizar em minha aplicação?

Existem 3 passos:

1  Substitua a biblioteca SQLite com uma contendo o LiteSync

2  Altere a URI de conexão

3  Verifique pelo status ready do banco de dados

Quando compilar aplicações em C e C++, você precisa ligá-las à biblioteca LiteSync.

Para outras linguagens, você precisar ter o wrapper apropriado instalado.



Exemplo de nó primário

O nó primário pode ser uma aplicação normal, exatamente a mesma dos nós secundários, mas utilizando uma URI diferente.

Ou podemos utilizar uma aplicação dedicada ao nó primário.

Uma aplicação isolada, utilizada apenas com o propósito de manter um nó de banco de dados, seria como no exemplo a seguir:

Select a language -->



Exemplo básico de aplicação

Uma aplicação básica, que escreve em um banco de dados local, seria como no exemplo a seguir:

Select a language -->



LIMITAÇÕES ATUAIS

1  Evite utilizar funções que retornem valores diferentes cada vez que são acionadas, como random() e date('now').

2  A palavra-chave AUTOINCREMENT não é suportada.

3  Devemos utilizar uma única conexão para cada arquivo de banco de dados. Não permita que várias aplicações acessem o mesmo banco de dados. Cada instância deve utilizar seu próprio banco de dados, e eles devem ser replicados e sincronizados utilizando o LiteSync.