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.