Advertisement
Guest User

Untitled

a guest
Nov 27th, 2024
651
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import sqlite3 from "sqlite3";
  2.  
  3. const oldDb = new sqlite3.Database("old.db");
  4. const newDb = new sqlite3.Database("new.db");
  5.  
  6. async function migrateData() {
  7.   try {
  8.     const oldData = await new Promise((resolve, reject) => {
  9.       oldDb.all(
  10.         `
  11.         SELECT
  12.           p.Name AS PersonName,
  13.           p.NormalizedName AS PersonNormalizedName,
  14.           s.ID AS SeriesId,
  15.           p.Role
  16.         FROM Person AS p
  17.         JOIN PersonSeriesMetadata AS psm
  18.           ON p.Id = psm.PeopleId
  19.         JOIN Series AS s
  20.           ON psm.SeriesMetadatasId = s.ID
  21.       `,
  22.         (err, rows) => {
  23.           if (err) reject(err);
  24.           resolve(rows);
  25.         },
  26.       );
  27.     });
  28.  
  29.     await new Promise((resolve, reject) => {
  30.       newDb.serialize(() => {
  31.         newDb.run("BEGIN TRANSACTION");
  32.  
  33.         const insertPersonStmt = newDb.prepare(`
  34.           INSERT OR IGNORE INTO Person (Name, NormalizedName)
  35.           VALUES (?, ?)
  36.         `);
  37.  
  38.         const selectPersonIdStmt = newDb.prepare(`
  39.           SELECT Id FROM Person WHERE Name = ? AND NormalizedName = ?;
  40.         `);
  41.  
  42.         const insertSeriesMetadataPeopleStmt = newDb.prepare(`
  43.           INSERT INTO SeriesMetadataPeople (SeriesMetadataId, PersonId, Role)
  44.           VALUES (?, ?, ?)
  45.         `);
  46.  
  47.         let remaining = 0;
  48.  
  49.         for (const row of oldData) {
  50.           ++remaining;
  51.  
  52.           const updateSeries = (Id) => {
  53.             insertSeriesMetadataPeopleStmt.run(
  54.               row.SeriesId,
  55.               Id,
  56.               row.Role,
  57.               () => {
  58.                 --remaining;
  59.  
  60.                 if (!remaining) {
  61.                   insertPersonStmt.finalize();
  62.                   insertSeriesMetadataPeopleStmt.finalize();
  63.                   selectPersonIdStmt.finalize();
  64.                 }
  65.               },
  66.             );
  67.           };
  68.  
  69.           selectPersonIdStmt.get(
  70.             row.PersonName,
  71.             row.PersonNormalizedName,
  72.             (err, personRow) => {
  73.               if (personRow) updateSeries(personRow.Id);
  74.               else {
  75.                 insertPersonStmt.run(
  76.                   row.PersonName,
  77.                   row.PersonNormalizedName,
  78.                   function () {
  79.                     updateSeries(this.lastId);
  80.                   },
  81.                 );
  82.               }
  83.             },
  84.           );
  85.         }
  86.  
  87.         newDb.run("COMMIT", (err) => {
  88.           if (err) reject(err);
  89.           resolve();
  90.         });
  91.       });
  92.     });
  93.  
  94.     console.log("Data migration successful!");
  95.   } catch (error) {
  96.     newDb.run("ROLLBACK");
  97.     console.error("Error migrating data:", error);
  98.   } finally {
  99.     oldDb.close();
  100.     newDb.close();
  101.   }
  102. }
  103.  
  104. migrateData();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement