| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import fs from 'fs';
- import path from 'path';
- import { Low, JSONFile } from 'lowdb';
- import initSqlJs from 'sql.js';
- import PQueue from 'p-queue';
- // Configuración de rutas
- const databaseAnterPath = path.join(process.cwd(), 'databaseAnter'); // Carpeta de la base de datos anterior
- const databasePath = path.join(process.cwd(), 'database'); // Carpeta de la nueva base de datos
- // Rutas de las categorías importantes en la base de datos anterior
- const paths = {
- users: path.join(databaseAnterPath, 'users'),
- chats: path.join(databaseAnterPath, 'chats'),
- settings: path.join(databaseAnterPath, 'settings'),
- };
- // Configuración de SQL.js
- const wasmPath = path.join(process.cwd(), 'node_modules', 'sql.js', 'dist', 'sql-wasm.wasm');
- const SQL = await initSqlJs({
- locateFile: () => wasmPath,
- });
- const categories = ['users', 'chats', 'settings']; // Solo estas categorías se migrarán
- const databases = {};
- // Inicializar bases de datos SQL.js
- async function initializeDatabases() {
- console.log('Inicializando bases de datos SQL.js...');
- if (!fs.existsSync(databasePath)) {
- fs.mkdirSync(databasePath); // Crear la carpeta "database" si no existe
- }
- for (const category of categories) {
- const dbFile = path.join(databasePath, `${category}.db`);
- let db;
- try {
- const fileBuffer = fs.readFileSync(dbFile);
- db = new SQL.Database(fileBuffer);
- console.log(`Base de datos "${category}" cargada desde ${dbFile}`);
- } catch (e) {
- db = new SQL.Database();
- console.log(`Nueva base de datos "${category}" creada.`);
- }
- databases[category] = db;
- db.run(`
- CREATE TABLE IF NOT EXISTS data (
- id TEXT PRIMARY KEY,
- data TEXT
- )
- `);
- saveDatabase(category);
- }
- console.log('Bases de datos SQL.js inicializadas.');
- }
- // Guardar una base de datos SQL.js en disco
- function saveDatabase(category) {
- const data = databases[category].export();
- fs.writeFileSync(path.join(databasePath, `${category}.db`), Buffer.from(data));
- console.log(`Base de datos "${category}" guardada.`);
- }
- // Leer datos de LowDB
- async function readLowDBData(category, id) {
- const filePath = path.join(paths[category], `${id}.json`);
- const db = new Low(new JSONFile(filePath));
- await db.read();
- return db.data || {};
- }
- // Escribir datos en SQL.js
- async function writeSQLData(category, id, data) {
- const db = databases[category];
- const stmt = db.prepare(`
- INSERT INTO data (id, data)
- VALUES (?, ?)
- ON CONFLICT(id) DO UPDATE SET data = ?
- `);
- stmt.run([id, JSON.stringify(data), JSON.stringify(data)]);
- stmt.free();
- saveDatabase(category);
- }
- // Migrar datos de LowDB a SQL.js
- async function migrateData() {
- console.log('Iniciando migración de datos...');
- await initializeDatabases();
- const queue = new PQueue({ concurrency: 5 });
- for (const category of categories) {
- console.log(`Procesando categoría: ${category}...`);
- if (!fs.existsSync(paths[category])) {
- console.log(`La carpeta ${paths[category]} no existe. Saltando...`);
- continue;
- }
- const files = fs.readdirSync(paths[category]);
- console.log(`Encontrados ${files.length} archivos en ${category}.`);
- for (const file of files) {
- const id = path.basename(file, '.json');
- if (category === 'users' && (id.includes('@newsletter') || id.includes('lid'))) continue;
- if (category === 'chats' && id.includes('@newsletter')) continue;
- await queue.add(async () => {
- try {
- console.log(`Migrando: ${category}/${id}...`);
- const data = await readLowDBData(category, id);
- await writeSQLData(category, id, data);
- console.log(`Migrado con éxito: ${category}/${id}`);
- } catch (error) {
- console.error(`Error migrando ${category}/${id}:`, error);
- }
- });
- }
- }
- console.log('Migración completada.');
- }
- // Ejecutar la migración
- migrateData()
- .then(() => {
- console.log('¡Migración finalizada con éxito!');
- })
- .catch((error) => {
- console.error('Error durante la migración:', error);
- });
|