node.js

A interface node.js é baseada no node-sqlite3. Você também pode utilizar o sqlite3-wrapper em torno dela.



Instalação no Linux

1. Instalar o LiteSync

Você pode tanto compilá-lo ou utilizar os arquivos binários pré-compilados. Você pode solicitá-los por e-mail para fins de teste.


2. Construa e instale o node-sqlite3

npm install sqlite3 --build-from-source --sqlite=/usr



Para Executar:

Podemos utilizar tanto a variável de ambiente LD_LIBRARY_PATH, desta forma:

LD_LIBRARY_PATH=/usr/lib node your-code.js


Ou realizar um patch no módulo, para utilizar o LiteSync ao invés do SQLite presente no sistema:

patchelf --set-rpath /usr/lib node_modules/sqlite3/lib/binding/node-v48-linux-x64/node_sqlite3.node

E então executar o seu código:

node your-code.js





Instalação no Windows

1. Instalar o LiteSync

Você pode tanto compilá-lo ou utilizar os arquivos binários pré-compilados. Você pode solicitá-los por e-mail para fins de teste.


2. Instalar o Windows Build Tools

npm install --global --production windows-build-tools

3. Construa e instale o node-sqlite3

npm install sqlite3 --build-from-source --sqlite=C:\litesync --sqlite_libname=litesync-0.1.lib --toolset=v141

OU

Se você não quiser compilar o node-sqlite3 a partir do código-fonte, você pode instalar o pacote padrão:

npm install sqlite3

E então substituir o arquivo binário na sub-pasta lib/binding/ pelo localizado em node-v64-win32-ia32.zip.

Ambas as opções acima utilizam bibliotecas 32-bit, então você precisará utilizar o node.js v10.15.1 32-bit





Testando a Replicação

Configuração para o nó primário:

{
  "uri": "file:app.db?node=primary&bind=tcp://0.0.0.0:1234",
  "node": "primary"
}

Configuração para o nó secundário:

{
  "uri": "file:app.db?node=secondary&connect=tcp://127.0.0.1:1234",
  "node": "secondary"
}

Aplicação:

var config = require('./config.json');
var sqlite3 = require('sqlite3').verbose();

var db = new sqlite3.Database(config.uri);

function start_access() {

  db.serialize(function() {

    db.exec("CREATE TABLE IF NOT EXISTS t1 (name)", function(err) {
      if (err) console.log('db.exec: ' + err);
    });

    var stmt = db.prepare("INSERT INTO t1 VALUES (?)");
    for (var i = 1; i <= 3; i++) {
        stmt.run(["row " + i + " from " + config.node + " node"]);
    }
    //stmt.finalize();

    setInterval(function() {
      db.each("SELECT * FROM t1", function(err, row) {
        if (err) console.log('db.each: ' + err);
        else console.log(row.name);
      }, function(err,count) {
        if (err) console.log('db.each complete: ' + err);
        console.log("retrieved rows: " + count + "\n\n");
        //db.close();
      });
    }, 4000);

  });

}

// check if the db is ready
var id = setInterval(function() {

  db.get("PRAGMA sync_status", function(err, res) {
      if (err) return console.log('getting synchronization status: ' + err);
      var status = JSON.parse(res.sync_status);
      if (status.db_is_ready) {
        clearTimeout(id);
        start_access();
      }
  });

}, 1000);

Crie 2 pastas, salve a aplicação e um arquivo de configuração em cada uma, abra 2 terminais, mude o diretório para cada pasta e execute a aplicação em ambas.

Você pode fazer o mesmo em dispositivos separados, alterando o endereço TCP nas configurações.