56 lines
2.3 KiB
TypeScript
56 lines
2.3 KiB
TypeScript
import { normalizeExternalSqlPath } from "@/lib/sql/sqlFileOpen";
|
|
|
|
export const EXTERNAL_SQL_FILE_TARGETS_STORAGE_KEY = "dbx-external-sql-file-targets-v1";
|
|
export const MAX_EXTERNAL_SQL_FILE_TARGETS = 200;
|
|
|
|
export interface ExternalSqlFileTarget {
|
|
connectionId: string;
|
|
database: string;
|
|
catalog?: string;
|
|
}
|
|
|
|
export function unassociatedExternalSqlFileTarget(): ExternalSqlFileTarget {
|
|
return { connectionId: "", database: "", catalog: undefined };
|
|
}
|
|
|
|
interface StoredExternalSqlFileTarget extends ExternalSqlFileTarget {
|
|
path: string;
|
|
updatedAt: number;
|
|
}
|
|
|
|
function loadExternalSqlFileTargets(): StoredExternalSqlFileTarget[] {
|
|
try {
|
|
const parsed = JSON.parse(localStorage.getItem(EXTERNAL_SQL_FILE_TARGETS_STORAGE_KEY) || "[]");
|
|
if (!Array.isArray(parsed)) return [];
|
|
return parsed
|
|
.filter((item) => typeof item?.path === "string" && typeof item?.connectionId === "string" && typeof item?.database === "string" && (item?.catalog === undefined || typeof item.catalog === "string") && typeof item?.updatedAt === "number")
|
|
.map((item) => ({ ...item, catalog: item.catalog })) as StoredExternalSqlFileTarget[];
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
function saveExternalSqlFileTargets(targets: StoredExternalSqlFileTarget[]) {
|
|
try {
|
|
localStorage.setItem(EXTERNAL_SQL_FILE_TARGETS_STORAGE_KEY, JSON.stringify(targets));
|
|
} catch {}
|
|
}
|
|
|
|
export function rememberExternalSqlFileTarget(path: string, target: ExternalSqlFileTarget) {
|
|
const normalizedPath = normalizeExternalSqlPath(path);
|
|
if (!normalizedPath) return;
|
|
const remaining = loadExternalSqlFileTargets().filter((item) => item.path !== normalizedPath);
|
|
if (!target.connectionId) {
|
|
saveExternalSqlFileTargets(remaining);
|
|
return;
|
|
}
|
|
saveExternalSqlFileTargets([{ path: normalizedPath, ...target, updatedAt: Date.now() }, ...remaining].slice(0, MAX_EXTERNAL_SQL_FILE_TARGETS));
|
|
}
|
|
|
|
export function resolveExternalSqlFileTarget(path: string, connectionExists: (connectionId: string) => boolean, fallback: ExternalSqlFileTarget): ExternalSqlFileTarget {
|
|
const normalizedPath = normalizeExternalSqlPath(path);
|
|
const saved = loadExternalSqlFileTargets().find((item) => item.path === normalizedPath);
|
|
if (!saved || !connectionExists(saved.connectionId)) return fallback;
|
|
return { connectionId: saved.connectionId, database: saved.database, catalog: saved.catalog };
|
|
}
|