migrate.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import fs from 'fs';
  2. import path from 'path';
  3. import { Low, JSONFile } from 'lowdb';
  4. import initSqlJs from 'sql.js';
  5. import PQueue from 'p-queue';
  6. // Configuración de rutas
  7. const databaseAnterPath = path.join(process.cwd(), 'databaseAnter'); // Carpeta de la base de datos anterior
  8. const databasePath = path.join(process.cwd(), 'database'); // Carpeta de la nueva base de datos
  9. // Rutas de las categorías importantes en la base de datos anterior
  10. const paths = {
  11. users: path.join(databaseAnterPath, 'users'),
  12. chats: path.join(databaseAnterPath, 'chats'),
  13. settings: path.join(databaseAnterPath, 'settings'),
  14. };
  15. // Configuración de SQL.js
  16. const wasmPath = path.join(process.cwd(), 'node_modules', 'sql.js', 'dist', 'sql-wasm.wasm');
  17. const SQL = await initSqlJs({
  18. locateFile: () => wasmPath,
  19. });
  20. const categories = ['users', 'chats', 'settings']; // Solo estas categorías se migrarán
  21. const databases = {};
  22. // Inicializar bases de datos SQL.js
  23. async function initializeDatabases() {
  24. console.log('Inicializando bases de datos SQL.js...');
  25. if (!fs.existsSync(databasePath)) {
  26. fs.mkdirSync(databasePath); // Crear la carpeta "database" si no existe
  27. }
  28. for (const category of categories) {
  29. const dbFile = path.join(databasePath, `${category}.db`);
  30. let db;
  31. try {
  32. const fileBuffer = fs.readFileSync(dbFile);
  33. db = new SQL.Database(fileBuffer);
  34. console.log(`Base de datos "${category}" cargada desde ${dbFile}`);
  35. } catch (e) {
  36. db = new SQL.Database();
  37. console.log(`Nueva base de datos "${category}" creada.`);
  38. }
  39. databases[category] = db;
  40. db.run(`
  41. CREATE TABLE IF NOT EXISTS data (
  42. id TEXT PRIMARY KEY,
  43. data TEXT
  44. )
  45. `);
  46. saveDatabase(category);
  47. }
  48. console.log('Bases de datos SQL.js inicializadas.');
  49. }
  50. // Guardar una base de datos SQL.js en disco
  51. function saveDatabase(category) {
  52. const data = databases[category].export();
  53. fs.writeFileSync(path.join(databasePath, `${category}.db`), Buffer.from(data));
  54. console.log(`Base de datos "${category}" guardada.`);
  55. }
  56. // Leer datos de LowDB
  57. async function readLowDBData(category, id) {
  58. const filePath = path.join(paths[category], `${id}.json`);
  59. const db = new Low(new JSONFile(filePath));
  60. await db.read();
  61. return db.data || {};
  62. }
  63. // Escribir datos en SQL.js
  64. async function writeSQLData(category, id, data) {
  65. const db = databases[category];
  66. const stmt = db.prepare(`
  67. INSERT INTO data (id, data)
  68. VALUES (?, ?)
  69. ON CONFLICT(id) DO UPDATE SET data = ?
  70. `);
  71. stmt.run([id, JSON.stringify(data), JSON.stringify(data)]);
  72. stmt.free();
  73. saveDatabase(category);
  74. }
  75. // Migrar datos de LowDB a SQL.js
  76. async function migrateData() {
  77. console.log('Iniciando migración de datos...');
  78. await initializeDatabases();
  79. const queue = new PQueue({ concurrency: 5 });
  80. for (const category of categories) {
  81. console.log(`Procesando categoría: ${category}...`);
  82. if (!fs.existsSync(paths[category])) {
  83. console.log(`La carpeta ${paths[category]} no existe. Saltando...`);
  84. continue;
  85. }
  86. const files = fs.readdirSync(paths[category]);
  87. console.log(`Encontrados ${files.length} archivos en ${category}.`);
  88. for (const file of files) {
  89. const id = path.basename(file, '.json');
  90. if (category === 'users' && (id.includes('@newsletter') || id.includes('lid'))) continue;
  91. if (category === 'chats' && id.includes('@newsletter')) continue;
  92. await queue.add(async () => {
  93. try {
  94. console.log(`Migrando: ${category}/${id}...`);
  95. const data = await readLowDBData(category, id);
  96. await writeSQLData(category, id, data);
  97. console.log(`Migrado con éxito: ${category}/${id}`);
  98. } catch (error) {
  99. console.error(`Error migrando ${category}/${id}:`, error);
  100. }
  101. });
  102. }
  103. }
  104. console.log('Migración completada.');
  105. }
  106. // Ejecutar la migración
  107. migrateData()
  108. .then(() => {
  109. console.log('¡Migración finalizada con éxito!');
  110. })
  111. .catch((error) => {
  112. console.error('Error durante la migración:', error);
  113. });