add vault name into dbs
This commit is contained in:
+161
-33
@@ -9,7 +9,8 @@ export type LocalForage = typeof localforage;
|
||||
import * as origLog from "loglevel";
|
||||
const log = origLog.getLogger("rs-default");
|
||||
|
||||
export const DEFAULT_DB_VERSION_NUMBER: number = 20211114;
|
||||
const DB_VERSION_NUMBER_IN_HISTORY = [20211114, 20220108];
|
||||
export const DEFAULT_DB_VERSION_NUMBER: number = 20220108;
|
||||
export const DEFAULT_DB_NAME = "remotelysavedb";
|
||||
export const DEFAULT_TBL_VERSION = "schemaversion";
|
||||
export const DEFAULT_TBL_DELETE_HISTORY = "filefolderoperationhistory";
|
||||
@@ -25,6 +26,7 @@ export interface FileFolderHistoryRecord {
|
||||
actionType: "delete" | "rename";
|
||||
keyType: "folder" | "file";
|
||||
renameTo: string;
|
||||
vaultRandomID: string;
|
||||
}
|
||||
|
||||
interface SyncMetaMappingRecord {
|
||||
@@ -37,12 +39,14 @@ interface SyncMetaMappingRecord {
|
||||
remoteExtraKey: string;
|
||||
remoteType: SUPPORTED_SERVICES_TYPE;
|
||||
keyType: "folder" | "file";
|
||||
vaultRandomID: string;
|
||||
}
|
||||
|
||||
interface SyncPlanRecord {
|
||||
ts: number;
|
||||
remoteType: string;
|
||||
syncPlan: string;
|
||||
vaultRandomID: string;
|
||||
}
|
||||
|
||||
export interface InternalDBs {
|
||||
@@ -52,7 +56,103 @@ export interface InternalDBs {
|
||||
syncPlansTbl: LocalForage;
|
||||
}
|
||||
|
||||
export const prepareDBs = async () => {
|
||||
/**
|
||||
* This migration mainly aims to assign vault name or vault id into all tables.
|
||||
* @param db
|
||||
* @param vaultRandomID
|
||||
*/
|
||||
const migrateDBsFrom20211114To20220108 = async (
|
||||
db: InternalDBs,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
const oldVer = 20211114;
|
||||
const newVer = 20220108;
|
||||
log.debug(`start upgrading internal db from ${oldVer} to ${newVer}`);
|
||||
|
||||
const allPromisesToWait: Promise<any>[] = [];
|
||||
|
||||
log.debug("assign vault id to any delete history");
|
||||
const keysInDeleteHistoryTbl = await db.deleteHistoryTbl.keys();
|
||||
for (const key of keysInDeleteHistoryTbl) {
|
||||
if (key.startsWith(vaultRandomID)) {
|
||||
continue;
|
||||
}
|
||||
const value = (await db.deleteHistoryTbl.getItem(
|
||||
key
|
||||
)) as FileFolderHistoryRecord;
|
||||
if (value === null || value === undefined) {
|
||||
continue;
|
||||
}
|
||||
if (value.vaultRandomID === undefined || value.vaultRandomID === "") {
|
||||
value.vaultRandomID = vaultRandomID;
|
||||
}
|
||||
const newKey = `${vaultRandomID}\t${key}`;
|
||||
allPromisesToWait.push(db.deleteHistoryTbl.setItem(newKey, value));
|
||||
allPromisesToWait.push(db.deleteHistoryTbl.removeItem(key));
|
||||
}
|
||||
|
||||
log.debug("assign vault id to any sync mapping");
|
||||
const keysInSyncMappingTbl = await db.syncMappingTbl.keys();
|
||||
for (const key of keysInSyncMappingTbl) {
|
||||
if (key.startsWith(vaultRandomID)) {
|
||||
continue;
|
||||
}
|
||||
const value = (await db.syncMappingTbl.getItem(
|
||||
key
|
||||
)) as SyncMetaMappingRecord;
|
||||
if (value === null || value === undefined) {
|
||||
continue;
|
||||
}
|
||||
if (value.vaultRandomID === undefined || value.vaultRandomID === "") {
|
||||
value.vaultRandomID = vaultRandomID;
|
||||
}
|
||||
const newKey = `${vaultRandomID}\t${key}`;
|
||||
allPromisesToWait.push(db.syncMappingTbl.setItem(newKey, value));
|
||||
allPromisesToWait.push(db.syncMappingTbl.removeItem(key));
|
||||
}
|
||||
|
||||
log.debug("assign vault id to any sync plan records");
|
||||
const keysInSyncPlansTbl = await db.syncPlansTbl.keys();
|
||||
for (const key of keysInSyncPlansTbl) {
|
||||
if (key.startsWith(vaultRandomID)) {
|
||||
continue;
|
||||
}
|
||||
const value = (await db.syncPlansTbl.getItem(key)) as SyncPlanRecord;
|
||||
if (value === null || value === undefined) {
|
||||
continue;
|
||||
}
|
||||
if (value.vaultRandomID === undefined || value.vaultRandomID === "") {
|
||||
value.vaultRandomID = vaultRandomID;
|
||||
}
|
||||
const newKey = `${vaultRandomID}\t${key}`;
|
||||
allPromisesToWait.push(db.syncPlansTbl.setItem(newKey, value));
|
||||
allPromisesToWait.push(db.syncPlansTbl.removeItem(key));
|
||||
}
|
||||
|
||||
log.debug("finally update version if everything is ok");
|
||||
await Promise.all(allPromisesToWait);
|
||||
await db.versionTbl.setItem("version", newVer);
|
||||
|
||||
log.debug(`finish upgrading internal db from ${oldVer} to ${newVer}`);
|
||||
};
|
||||
|
||||
const migrateDBs = async (
|
||||
db: InternalDBs,
|
||||
oldVer: number,
|
||||
newVer: number,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
if (oldVer === newVer) {
|
||||
return;
|
||||
}
|
||||
if (oldVer === 20211114 && newVer === 20220108) {
|
||||
return await migrateDBsFrom20211114To20220108(db, vaultRandomID);
|
||||
}
|
||||
// not implemented
|
||||
throw Error(`not supported internal db changes from ${oldVer} to ${newVer}`);
|
||||
};
|
||||
|
||||
export const prepareDBs = async (vaultRandomID: string) => {
|
||||
const db = {
|
||||
versionTbl: localforage.createInstance({
|
||||
name: DEFAULT_DB_NAME,
|
||||
@@ -74,11 +174,22 @@ export const prepareDBs = async () => {
|
||||
|
||||
const originalVersion = (await db.versionTbl.getItem("version")) as number;
|
||||
if (originalVersion === null) {
|
||||
log.debug(
|
||||
`no internal db version, setting it to ${DEFAULT_DB_VERSION_NUMBER}`
|
||||
);
|
||||
await db.versionTbl.setItem("version", DEFAULT_DB_VERSION_NUMBER);
|
||||
} else if (originalVersion === DEFAULT_DB_VERSION_NUMBER) {
|
||||
// do nothing
|
||||
} else {
|
||||
await migrateDBs(db, originalVersion, DEFAULT_DB_VERSION_NUMBER);
|
||||
log.debug(
|
||||
`trying to upgrade db version from ${originalVersion} to ${DEFAULT_DB_VERSION_NUMBER}`
|
||||
);
|
||||
await migrateDBs(
|
||||
db,
|
||||
originalVersion,
|
||||
DEFAULT_DB_VERSION_NUMBER,
|
||||
vaultRandomID
|
||||
);
|
||||
}
|
||||
|
||||
log.info("db connected");
|
||||
@@ -103,33 +214,32 @@ export const destroyDBs = async () => {
|
||||
};
|
||||
};
|
||||
|
||||
const migrateDBs = async (db: InternalDBs, oldVer: number, newVer: number) => {
|
||||
if (oldVer === newVer) {
|
||||
return;
|
||||
}
|
||||
// not implemented
|
||||
throw Error(`not supported internal db changes from ${oldVer} to ${newVer}`);
|
||||
};
|
||||
|
||||
export const loadDeleteRenameHistoryTable = async (db: InternalDBs) => {
|
||||
export const loadDeleteRenameHistoryTableByVault = async (
|
||||
db: InternalDBs,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
const records = [] as FileFolderHistoryRecord[];
|
||||
await db.deleteHistoryTbl.iterate((value, key, iterationNumber) => {
|
||||
records.push(value as FileFolderHistoryRecord);
|
||||
if (key.startsWith(`${vaultRandomID}\t`)) {
|
||||
records.push(value as FileFolderHistoryRecord);
|
||||
}
|
||||
});
|
||||
records.sort((a, b) => a.actionWhen - b.actionWhen); // ascending
|
||||
return records;
|
||||
};
|
||||
|
||||
export const clearDeleteRenameHistoryOfKey = async (
|
||||
export const clearDeleteRenameHistoryOfKeyAndVault = async (
|
||||
db: InternalDBs,
|
||||
key: string
|
||||
key: string,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
await db.deleteHistoryTbl.removeItem(key);
|
||||
await db.deleteHistoryTbl.removeItem(`${vaultRandomID}\t${key}`);
|
||||
};
|
||||
|
||||
export const insertDeleteRecord = async (
|
||||
export const insertDeleteRecordByVault = async (
|
||||
db: InternalDBs,
|
||||
fileOrFolder: TAbstractFile
|
||||
fileOrFolder: TAbstractFile,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
// log.info(fileOrFolder);
|
||||
let k: FileFolderHistoryRecord;
|
||||
@@ -143,6 +253,7 @@ export const insertDeleteRecord = async (
|
||||
actionType: "delete",
|
||||
keyType: "file",
|
||||
renameTo: "",
|
||||
vaultRandomID: vaultRandomID,
|
||||
};
|
||||
} else if (fileOrFolder instanceof TFolder) {
|
||||
// key should endswith "/"
|
||||
@@ -158,15 +269,17 @@ export const insertDeleteRecord = async (
|
||||
actionType: "delete",
|
||||
keyType: "folder",
|
||||
renameTo: "",
|
||||
vaultRandomID: vaultRandomID,
|
||||
};
|
||||
}
|
||||
await db.deleteHistoryTbl.setItem(k.key, k);
|
||||
await db.deleteHistoryTbl.setItem(`${vaultRandomID}\t${k.key}`, k);
|
||||
};
|
||||
|
||||
export const insertRenameRecord = async (
|
||||
export const insertRenameRecordByVault = async (
|
||||
db: InternalDBs,
|
||||
fileOrFolder: TAbstractFile,
|
||||
oldPath: string
|
||||
oldPath: string,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
// log.info(fileOrFolder);
|
||||
let k: FileFolderHistoryRecord;
|
||||
@@ -180,6 +293,7 @@ export const insertRenameRecord = async (
|
||||
actionType: "rename",
|
||||
keyType: "file",
|
||||
renameTo: fileOrFolder.path,
|
||||
vaultRandomID: vaultRandomID,
|
||||
};
|
||||
} else if (fileOrFolder instanceof TFolder) {
|
||||
const key = oldPath.endsWith("/") ? oldPath : `${oldPath}/`;
|
||||
@@ -195,12 +309,13 @@ export const insertRenameRecord = async (
|
||||
actionType: "rename",
|
||||
keyType: "folder",
|
||||
renameTo: renameTo,
|
||||
vaultRandomID: vaultRandomID,
|
||||
};
|
||||
}
|
||||
await db.deleteHistoryTbl.setItem(k.key, k);
|
||||
await db.deleteHistoryTbl.setItem(`${vaultRandomID}\t${k.key}`, k);
|
||||
};
|
||||
|
||||
export const upsertSyncMetaMappingData = async (
|
||||
export const upsertSyncMetaMappingDataByVault = async (
|
||||
serviceType: SUPPORTED_SERVICES_TYPE,
|
||||
db: InternalDBs,
|
||||
localKey: string,
|
||||
@@ -209,7 +324,8 @@ export const upsertSyncMetaMappingData = async (
|
||||
remoteKey: string,
|
||||
remoteMTime: number,
|
||||
remoteSize: number,
|
||||
remoteExtraKey: string /* ETag from s3 */
|
||||
remoteExtraKey: string,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
const aggregratedInfo: SyncMetaMappingRecord = {
|
||||
localKey: localKey,
|
||||
@@ -221,19 +337,24 @@ export const upsertSyncMetaMappingData = async (
|
||||
remoteExtraKey: remoteExtraKey,
|
||||
remoteType: serviceType,
|
||||
keyType: localKey.endsWith("/") ? "folder" : "file",
|
||||
vaultRandomID: vaultRandomID,
|
||||
};
|
||||
await db.syncMappingTbl.setItem(remoteKey, aggregratedInfo);
|
||||
await db.syncMappingTbl.setItem(
|
||||
`${vaultRandomID}\t${remoteKey}`,
|
||||
aggregratedInfo
|
||||
);
|
||||
};
|
||||
|
||||
export const getSyncMetaMappingByRemoteKey = async (
|
||||
export const getSyncMetaMappingByRemoteKeyAndVault = async (
|
||||
serviceType: SUPPORTED_SERVICES_TYPE,
|
||||
db: InternalDBs,
|
||||
remoteKey: string,
|
||||
remoteMTime: number,
|
||||
remoteExtraKey: string
|
||||
remoteExtraKey: string,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
const potentialItem = (await db.syncMappingTbl.getItem(
|
||||
remoteKey
|
||||
`${vaultRandomID}\t${remoteKey}`
|
||||
)) as SyncMetaMappingRecord;
|
||||
|
||||
if (potentialItem === null) {
|
||||
@@ -258,26 +379,33 @@ export const clearAllSyncMetaMapping = async (db: InternalDBs) => {
|
||||
await db.syncMappingTbl.clear();
|
||||
};
|
||||
|
||||
export const insertSyncPlanRecord = async (
|
||||
export const insertSyncPlanRecordByVault = async (
|
||||
db: InternalDBs,
|
||||
syncPlan: SyncPlanType
|
||||
syncPlan: SyncPlanType,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
const record = {
|
||||
ts: syncPlan.ts,
|
||||
vaultRandomID: vaultRandomID,
|
||||
remoteType: syncPlan.remoteType,
|
||||
syncPlan: JSON.stringify(syncPlan /* directly stringify */, null, 2),
|
||||
} as SyncPlanRecord;
|
||||
await db.syncPlansTbl.setItem(`${syncPlan.ts}`, record);
|
||||
await db.syncPlansTbl.setItem(`${vaultRandomID}\t${syncPlan.ts}`, record);
|
||||
};
|
||||
|
||||
export const clearAllSyncPlanRecords = async (db: InternalDBs) => {
|
||||
await db.syncPlansTbl.clear();
|
||||
};
|
||||
|
||||
export const readAllSyncPlanRecordTexts = async (db: InternalDBs) => {
|
||||
export const readAllSyncPlanRecordTextsByVault = async (
|
||||
db: InternalDBs,
|
||||
vaultRandomID: string
|
||||
) => {
|
||||
const records = [] as SyncPlanRecord[];
|
||||
await db.syncPlansTbl.iterate((value, key, iterationNumber) => {
|
||||
records.push(value as SyncPlanRecord);
|
||||
if (key.startsWith(`${vaultRandomID}\t`)) {
|
||||
records.push(value as SyncPlanRecord);
|
||||
}
|
||||
});
|
||||
records.sort((a, b) => -(a.ts - b.ts)); // descending
|
||||
|
||||
|
||||
Reference in New Issue
Block a user