数据迁移
This commit is contained in:
parent
d9fdded7fb
commit
67ba515b2c
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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" },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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" },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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" },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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();
|
||||||
// 初始化日志组件
|
// 初始化日志组件
|
||||||
|
@ -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" },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user