Untitled

mail@pastecode.io avatar
unknown
plain_text
2 months ago
4.4 kB
2
Indexable
Never
const express = require('express');
const app = express();
const mysql = require('mysql');
const { Pool } = require('pg');
const _ = require('lodash');

// Konfiguracja połączenia z bazą MySQL (baza A)
const mysqlConnection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'twoje_haslo',
  database: 'baza_a'
});

// Konfiguracja połączenia z bazą PostgreSQL (baza B)
const pgPool = new Pool({
  user: 'twoj_uzytkownik',
  password: 'twoje_haslo',
  host: 'localhost',
  database: 'baza_b'
});

// Funkcja do obsługi błędów
function handleError(err, res) {
  console.error(err);
  res.status(500).json({ message: 'Wystąpił błąd', error: err.message });
}

// Funkcja do pobierania JSONów z bazy MySQL
function getJSONsFromMySql() {
  return new Promise((resolve, reject) => {
    mysqlConnection.query('SELECT json_data FROM twoja_tabela', (err, results) => {
      if (err) {
        reject(err);
      } else {
        resolve(results.map(result => JSON.parse(result.json_data)));
      }
    });
  });
}

// Funkcja do pobierania JSONów z bazy PostgreSQL
async function getJSONsFromPostgres() {
  try {
    const { rows } = await pgPool.query('SELECT json_data FROM twoja_tabela');
    return rows.map(row => row.json_data);
  } catch (err) {
    throw err;
  }
}

// Funkcja do łączenia JSONów po kluczu
function mergeJSONsByKey(mysqlJSONs, postgresJSONs, key) {
  const merged = {};
  mysqlJSONs.forEach(json => {
    merged[json[key]] = { mysql: json };
  });
  postgresJSONs.forEach(json => {
    if (merged[json[key]]) {
      merged[json[key]].postgres = json;
    } else {
      merged[json[key]] = { postgres: json };
    }
  });
  return merged;
}

// Funkcja do porównywania JSONów
function compareJSONs(merged) {
  const differences = {};
  Object.entries(merged).forEach(([key, value]) => {
    const { mysql, postgres } = value;
    if (!_.isEqual(mysql, postgres)) {
      differences[key] = { mysql, postgres };
    }
  });
  return differences;
}

// Funkcja do zapisu różnic w bazie PostgreSQL
async function saveDifferencesToPostgres(differences) {
  const client = await pgPool.connect();
  try {
    await client.query('BEGIN');
    const query = 'INSERT INTO twoja_tabela_roznic (klucz, json_mysql, json_postgres) VALUES ($1, $2, $3)';
    const promises = Object.entries(differences).map(([key, value]) =>
      client.query(query, [key, JSON.stringify(value.mysql), JSON.stringify(value.postgres)])
    );
    await Promise.all(promises);
    await client.query('COMMIT');
  } catch (err) {
    await client.query('ROLLBACK');
    throw err;
  } finally {
    client.release();
  }
}

// Endpoint API do uruchamiania procesu porównywania
// app.get('/compare', async (req, res) => {
//   try {
//     const mysqlJSONs = await getJSONsFromMySql();
//     const postgresJSONs = await getJSONsFromPostgres();
//     const merged = mergeJSONsByKey(mysqlJSONs, postgresJSONs, 'klucz');
//     const differences = compareJSONs(merged);
//     await saveDifferencesToPostgres(differences);
//     res.json({ message: 'Porównywanie zakończone', differences });
//   } catch (err) {
//     handleError(err, res);
//   }
// });

// test bez dostępu do bazy B
app.get('/compare', async (req, res) => {
  try {
    const mysqlJSONs = await getJSONsFromMySql();
    const postgresJSONs = await getJSONsFromPostgres();
    const merged = mergeJSONsByKey(mysqlJSONs, postgresJSONs, 'klucz');
    const differences = compareJSONs(merged);

    // Wyświetl różnice w konsoli
    console.log('Znalezione różnice:');
    console.log(differences);

    // Alternatywnie, zapisz różnice do pliku
    const fs = require('fs');
    fs.writeFileSync('differences.json', JSON.stringify(differences, null, 2));

    res.json({ message: 'Porównywanie zakończone' });
  } catch (err) {
    handleError(err, res);
  }
});

app.listen(3000, () => {
  console.log('Serwer działa na porcie 3000');
});

// Obsługa błędów połączenia z bazą MySQL
mysqlConnection.connect(err => {
  if (err) {
    console.error('Błąd połączenia z bazą MySQL:', err);
    process.exit(1); // Zakończ proces, jeśli wystąpi błąd połączenia
  }
});

// Obsługa błędów z pool połączeń PostgreSQL
pgPool.on('error', (err, client) => {
  console.error('Błąd z pool połączeń PostgreSQL:', err);
  if (client) {
    client.release(); // Zwolnij klienta z pool
  }
});
Leave a Comment