数据迁移

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,14 +36,19 @@ 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()打开数据库后,再执行
setTimeout(async () => {
try {
// 迁移脚本 // 迁移脚本
const scripts = await tx.table("scripts").toArray(); const scripts = await db.table("scripts").toArray();
const scriptDAO = new ScriptDAO(); const scriptDAO = new ScriptDAO();
const scriptCodeDAO = new ScriptCodeDAO(); const scriptCodeDAO = new ScriptCodeDAO();
console.log("开始迁移脚本数据", scripts.length);
await Promise.all( await Promise.all(
scripts.map((script: ScriptAndCode) => { scripts.map(async (script: ScriptAndCode) => {
const { const {
uuid, uuid,
name, name,
@ -56,36 +64,57 @@ function renameField() {
createtime, createtime,
checktime, checktime,
code, code,
checkUpdateUrl,
downloadUrl,
selfMetadata,
config,
error,
updatetime,
lastruntime,
nextruntime,
} = script; } = script;
return scriptDAO const s = await scriptDAO.save({
.save({
uuid, uuid,
name, name,
namespace, namespace,
author, author,
originDomain, originDomain,
subscribeUrl, origin,
type, checkUpdateUrl,
sort, downloadUrl,
status,
runStatus,
metadata, metadata,
selfMetadata,
subscribeUrl,
config,
type,
status,
sort,
runStatus,
error,
createtime, createtime,
updatetime,
checktime, checktime,
}) lastruntime,
.then((s) => nextruntime,
scriptCodeDAO.save({ });
return scriptCodeDAO
.save({
uuid: s.uuid, uuid: s.uuid,
code, code,
}) })
); .catch((e) => {
console.log("脚本代码迁移失败", e);
return Promise.reject(e);
});
}) })
); );
// 迁移订阅 // 迁移订阅
const subscribe = await tx.table("subscribe").toArray(); const subscribe = await db.table("subscribe").toArray();
const subscribeDAO = new SubscribeDAO(); const subscribeDAO = new SubscribeDAO();
if (subscribe.length) {
await Promise.all( await Promise.all(
subscribe.map((s: Subscribe) => { subscribe.map((s: Subscribe) => {
console.log("1234", s);
const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s; const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s;
return subscribeDAO.save({ return subscribeDAO.save({
url, url,
@ -101,6 +130,8 @@ function renameField() {
}); });
}) })
); );
}
console.log("订阅数据迁移完成", subscribe.length);
// 迁移value // 迁移value
interface MV2Value { interface MV2Value {
id: number; id: number;
@ -111,21 +142,91 @@ function renameField() {
createtime: number; createtime: number;
updatetime: number; updatetime: number;
} }
const values = await tx.table("value").toArray(); const values = await db.table("value").toArray();
const valueDAO = new ScriptCodeDAO(); const valueDAO = new ValueDAO();
const valueMap = new Map<string, Value>();
await Promise.all( await Promise.all(
values.map((v) => { values.map((v: MV2Value) => {
const { scriptId, storageName, key, value, createtime } = v; const { scriptId, storageName, key, value, createtime } = v;
return valueDAO.save({ return db
scriptId, .table("scripts")
storageName, .where("id")
key, .equals(scriptId)
value, .first((script: Script) => {
if (script) {
let data: { [key: string]: any } = {};
if (!valueMap.has(script.uuid)) {
valueMap.set(script.uuid, {
uuid: script.uuid,
storageName: getStorageName(script),
data: data,
createtime, createtime,
updatetime: 0,
});
} else {
data = valueMap.get(script.uuid)!.data;
}
data[key] = value;
}
}); });
}) })
); );
// 保存到数据库
await Promise.all(
Array.from(valueMap.keys()).map((uuid) => {
const { storageName, data, createtime } = valueMap.get(uuid)!;
return valueDAO.save(storageName!, {
uuid,
storageName,
data,
createtime,
updatetime: 0,
});
})
);
console.log("脚本value数据迁移完成", values.length);
// 迁移permission // 迁移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());