数据迁移

This commit is contained in:
王一之 2025-04-24 17:22:02 +08:00
parent d9fdded7fb
commit 67ba515b2c
9 changed files with 217 additions and 110 deletions

View File

@ -1,6 +1,9 @@
import { getStorageName } from "@App/pkg/utils/utils";
import { db } from "./repo/dao"; import { db } from "./repo/dao";
import { Script, ScriptAndCode, ScriptCodeDAO, ScriptDAO } from "./repo/scripts"; import { Script, ScriptAndCode, ScriptCodeDAO, ScriptDAO } from "./repo/scripts";
import { Subscribe, SubscribeDAO } from "./repo/subscribe"; import { Subscribe, SubscribeDAO } from "./repo/subscribe";
import { Value, ValueDAO } from "./repo/value";
import { Permission, PermissionDAO } from "./repo/permission";
// 0.10.0重构,重命名字段,统一使用小峰驼 // 0.10.0重构,重命名字段,统一使用小峰驼
function renameField() { function renameField() {
@ -33,99 +36,197 @@ function renameField() {
// export是0.10.x时的兼容性处理 // export是0.10.x时的兼容性处理
export: "++id,&scriptId", export: "++id,&scriptId",
}); });
const v = 36;
// 将脚本数据迁移到chrome.storage // 将脚本数据迁移到chrome.storage
db.version(18).upgrade(async (tx) => { db.version(v).upgrade(() => {
// 迁移脚本 // 默认使用的事务这里加个延时用db.open()打开数据库后,再执行
const scripts = await tx.table("scripts").toArray(); setTimeout(async () => {
const scriptDAO = new ScriptDAO(); try {
const scriptCodeDAO = new ScriptCodeDAO(); // 迁移脚本
await Promise.all( const scripts = await db.table("scripts").toArray();
scripts.map((script: ScriptAndCode) => { const scriptDAO = new ScriptDAO();
const { const scriptCodeDAO = new ScriptCodeDAO();
uuid, console.log("开始迁移脚本数据", scripts.length);
name, await Promise.all(
namespace, scripts.map(async (script: ScriptAndCode) => {
author, const {
originDomain, uuid,
subscribeUrl, name,
type, namespace,
sort, author,
status, originDomain,
runStatus, subscribeUrl,
metadata, type,
createtime, sort,
checktime, status,
code, runStatus,
} = script; metadata,
return scriptDAO createtime,
.save({ checktime,
uuid,
name,
namespace,
author,
originDomain,
subscribeUrl,
type,
sort,
status,
runStatus,
metadata,
createtime,
checktime,
})
.then((s) =>
scriptCodeDAO.save({
uuid: s.uuid,
code, code,
checkUpdateUrl,
downloadUrl,
selfMetadata,
config,
error,
updatetime,
lastruntime,
nextruntime,
} = script;
const s = await scriptDAO.save({
uuid,
name,
namespace,
author,
originDomain,
origin,
checkUpdateUrl,
downloadUrl,
metadata,
selfMetadata,
subscribeUrl,
config,
type,
status,
sort,
runStatus,
error,
createtime,
updatetime,
checktime,
lastruntime,
nextruntime,
});
return scriptCodeDAO
.save({
uuid: s.uuid,
code,
})
.catch((e) => {
console.log("脚本代码迁移失败", e);
return Promise.reject(e);
});
})
);
// 迁移订阅
const subscribe = await db.table("subscribe").toArray();
const subscribeDAO = new SubscribeDAO();
if (subscribe.length) {
await Promise.all(
subscribe.map((s: Subscribe) => {
console.log("1234", s);
const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s;
return subscribeDAO.save({
url,
name,
code,
author,
scripts,
metadata,
status,
createtime,
updatetime,
checktime,
});
}) })
); );
}) }
); console.log("订阅数据迁移完成", subscribe.length);
// 迁移订阅 // 迁移value
const subscribe = await tx.table("subscribe").toArray(); interface MV2Value {
const subscribeDAO = new SubscribeDAO(); id: number;
await Promise.all( scriptId: number;
subscribe.map((s: Subscribe) => { storageName?: string;
const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s; key: string;
return subscribeDAO.save({ value: any;
url, createtime: number;
name, updatetime: number;
code, }
author, const values = await db.table("value").toArray();
scripts, const valueDAO = new ValueDAO();
metadata, const valueMap = new Map<string, Value>();
status, await Promise.all(
createtime, values.map((v: MV2Value) => {
updatetime, const { scriptId, storageName, key, value, createtime } = v;
checktime, return db
}); .table("scripts")
}) .where("id")
); .equals(scriptId)
// 迁移value .first((script: Script) => {
interface MV2Value { if (script) {
id: number; let data: { [key: string]: any } = {};
scriptId: number; if (!valueMap.has(script.uuid)) {
storageName?: string; valueMap.set(script.uuid, {
key: string; uuid: script.uuid,
value: any; storageName: getStorageName(script),
createtime: number; data: data,
updatetime: number; createtime,
} updatetime: 0,
const values = await tx.table("value").toArray(); });
const valueDAO = new ScriptCodeDAO(); } else {
await Promise.all( data = valueMap.get(script.uuid)!.data;
values.map((v) => { }
const { scriptId, storageName, key, value, createtime } = v; data[key] = value;
return valueDAO.save({ }
scriptId, });
storageName, })
key, );
value, // 保存到数据库
createtime, await Promise.all(
}); Array.from(valueMap.keys()).map((uuid) => {
}) const { storageName, data, createtime } = valueMap.get(uuid)!;
); return valueDAO.save(storageName!, {
// 迁移permission uuid,
storageName,
data,
createtime,
updatetime: 0,
});
})
);
console.log("脚本value数据迁移完成", values.length);
// 迁移permission
const permissions = await db.table("permission").toArray();
const permissionDAO = new PermissionDAO();
await Promise.all(
permissions.map((p: Permission & { scriptId: number }) => {
const { scriptId, permission, permissionValue, createtime, updatetime, allow } = p;
return db
.table("scripts")
.where("id")
.equals(scriptId)
.first((script: Script) => {
if (script) {
return permissionDAO.save({
uuid: script.uuid,
permission,
permissionValue,
createtime,
updatetime,
allow,
});
}
});
})
);
console.log("脚本permission数据迁移完成", permissions.length);
// 打开页面,告知数据储存+升级至了mv3重启一次扩展
setTimeout(async () => {
const scripts = await scriptDAO.all();
console.log("脚本数据迁移完成", scripts.length);
if (scripts.length > 0) {
chrome.tabs.create({
url: "https://docs.scriptcat.org/docs/change/v0.17/",
});
setTimeout(() => {
chrome.runtime.reload();
}, 1000);
}
}, 2000);
} catch (e) {
console.error("脚本数据迁移失败", e);
}
}, 200);
}); });
return db.open(); return db.open();
} }

View File

@ -20,6 +20,10 @@ export class OffscreenManager {
private serviceWorker = new ServiceWorkerClient(this.extensionMessage); private serviceWorker = new ServiceWorkerClient(this.extensionMessage);
constructor(private extensionMessage:MessageSend) {
}
logger(data: Logger) { logger(data: Logger) {
const dao = new LoggerDAO(); const dao = new LoggerDAO();
dao.save(data); dao.save(data);

View File

@ -1,20 +1,19 @@
import migrate from "./app/migrate"; import { MessageSend } from "@Packages/message/server";
import LoggerCore from "./app/logger/core"; import LoggerCore from "./app/logger/core";
import DBWriter from "./app/logger/db_writer"; import MessageWriter from "./app/logger/message_writer";
import { LoggerDAO } from "./app/repo/logger";
import { OffscreenManager } from "./app/service/offscreen"; import { OffscreenManager } from "./app/service/offscreen";
import { ExtensionMessageSend } from "@Packages/message/extension_message";
migrate();
function main() { function main() {
// 初始化日志组件 // 初始化日志组件
const extensionMessage: MessageSend = new ExtensionMessageSend();
const loggerCore = new LoggerCore({ const loggerCore = new LoggerCore({
writer: new DBWriter(new LoggerDAO()), writer: new MessageWriter(extensionMessage),
labels: { env: "offscreen" }, labels: { env: "offscreen" },
}); });
loggerCore.logger().debug("offscreen start"); loggerCore.logger().debug("offscreen start");
// 初始化管理器 // 初始化管理器
const manager = new OffscreenManager(); const manager = new OffscreenManager(extensionMessage);
manager.initManager(); manager.initManager();
} }

View File

@ -8,12 +8,12 @@ import "@App/index.css";
import { Provider } from "react-redux"; import { Provider } from "react-redux";
import { store } from "@App/pages/store/store.ts"; import { store } from "@App/pages/store/store.ts";
import LoggerCore from "@App/app/logger/core.ts"; import LoggerCore from "@App/app/logger/core.ts";
import { LoggerDAO } from "@App/app/repo/logger.ts"; import MessageWriter from "@App/app/logger/message_writer.ts";
import DBWriter from "@App/app/logger/db_writer.ts"; import { message } from "../store/global.ts";
// 初始化日志组件 // 初始化日志组件
const loggerCore = new LoggerCore({ const loggerCore = new LoggerCore({
writer: new DBWriter(new LoggerDAO()), writer: new MessageWriter(message),
labels: { env: "confirm" }, labels: { env: "confirm" },
}); });

View File

@ -8,12 +8,12 @@ import "@App/index.css";
import { Provider } from "react-redux"; import { Provider } from "react-redux";
import { store } from "@App/pages/store/store.ts"; import { store } from "@App/pages/store/store.ts";
import LoggerCore from "@App/app/logger/core.ts"; import LoggerCore from "@App/app/logger/core.ts";
import { LoggerDAO } from "@App/app/repo/logger.ts"; import MessageWriter from "@App/app/logger/message_writer.ts";
import DBWriter from "@App/app/logger/db_writer.ts"; import { message } from "../store/global.ts";
// 初始化日志组件 // 初始化日志组件
const loggerCore = new LoggerCore({ const loggerCore = new LoggerCore({
writer: new DBWriter(new LoggerDAO()), writer: new MessageWriter(message),
labels: { env: "import" }, labels: { env: "import" },
}); });

View File

@ -8,12 +8,12 @@ import "@App/index.css";
import { Provider } from "react-redux"; import { Provider } from "react-redux";
import { store } from "@App/pages/store/store.ts"; import { store } from "@App/pages/store/store.ts";
import LoggerCore from "@App/app/logger/core.ts"; import LoggerCore from "@App/app/logger/core.ts";
import { LoggerDAO } from "@App/app/repo/logger.ts"; import MessageWriter from "@App/app/logger/message_writer.ts";
import DBWriter from "@App/app/logger/db_writer.ts"; import { message } from "../store/global.ts";
// 初始化日志组件 // 初始化日志组件
const loggerCore = new LoggerCore({ const loggerCore = new LoggerCore({
writer: new DBWriter(new LoggerDAO()), writer: new MessageWriter(message),
labels: { env: "install" }, labels: { env: "install" },
}); });

View File

@ -13,6 +13,9 @@ import { LoggerDAO } from "@App/app/repo/logger.ts";
import DBWriter from "@App/app/logger/db_writer.ts"; import DBWriter from "@App/app/logger/db_writer.ts";
import registerEditor from "@App/pkg/utils/monaco-editor.ts"; import registerEditor from "@App/pkg/utils/monaco-editor.ts";
import storeSubscribe from "../store/subscribe.ts"; import storeSubscribe from "../store/subscribe.ts";
import migrate from "@App/app/migrate.ts";
migrate();
registerEditor(); registerEditor();
// 初始化日志组件 // 初始化日志组件

View File

@ -2,18 +2,18 @@ import React from "react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import App from "./App.tsx"; import App from "./App.tsx";
import LoggerCore from "@App/app/logger/core.ts"; import LoggerCore from "@App/app/logger/core.ts";
import { LoggerDAO } from "@App/app/repo/logger.ts";
import DBWriter from "@App/app/logger/db_writer.ts";
import "@arco-design/web-react/dist/css/arco.css"; import "@arco-design/web-react/dist/css/arco.css";
import "@App/locales/locales"; import "@App/locales/locales";
import "@App/index.css"; import "@App/index.css";
import "./index.css"; import "./index.css";
import { Provider } from "react-redux"; import { Provider } from "react-redux";
import { store } from "../store/store.ts"; import { store } from "../store/store.ts";
import MessageWriter from "@App/app/logger/message_writer.ts";
import { message } from "../store/global.ts";
// 初始化日志组件 // 初始化日志组件
const loggerCore = new LoggerCore({ const loggerCore = new LoggerCore({
writer: new DBWriter(new LoggerDAO()), writer: new MessageWriter(message),
labels: { env: "install" }, labels: { env: "install" },
}); });

View File

@ -48,14 +48,14 @@ async function setupOffscreenDocument() {
} }
async function main() { async function main() {
// 初始化管理器
const message = new ExtensionMessage(true);
// 初始化日志组件 // 初始化日志组件
const loggerCore = new LoggerCore({ const loggerCore = new LoggerCore({
writer: new DBWriter(new LoggerDAO()), writer: new DBWriter(new LoggerDAO()),
labels: { env: "service_worker" }, labels: { env: "service_worker" },
}); });
loggerCore.logger().debug("service worker start"); loggerCore.logger().debug("service worker start");
// 初始化管理器
const message = new ExtensionMessage(true);
const server = new Server("serviceWorker", message); const server = new Server("serviceWorker", message);
const messageQueue = new MessageQueue(); const messageQueue = new MessageQueue();
const manager = new ServiceWorkerManager(server, messageQueue, new ServiceWorkerMessageSend()); const manager = new ServiceWorkerManager(server, messageQueue, new ServiceWorkerMessageSend());