Skip to content

Commit efab894

Browse files
committed
Add engine to save format (v4) and engine-aware import/export
1 parent b1af4e1 commit efab894

4 files changed

Lines changed: 25 additions & 9 deletions

File tree

src/App.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -592,11 +592,14 @@ function App() {
592592

593593
output += "/* --- BEGIN Metadata --- */\n";
594594
output += "/* --- BEGIN Save Format Version --- */\n";
595-
output += "-- 3\n";
595+
output += "-- 4\n";
596596
output += "/* --- END Save Format Version --- */\n";
597597
output += "/* --- BEGIN Save Language --- */\n";
598598
output += `-- ${lang}\n`;
599599
output += "/* --- END Save Language --- */\n";
600+
output += "/* --- BEGIN Save Engine --- */\n";
601+
output += `-- ${engine}\n`;
602+
output += "/* --- END Save Engine --- */\n";
600603
output += "/* --- END Metadata --- */\n";
601604

602605
output += "/* --- BEGIN Validation --- */\n";
@@ -704,7 +707,7 @@ function App() {
704707
const a = document.createElement("a");
705708
const formattedTimestamp = formatFns(new Date(), "yyyyMMdd_HHmm");
706709
a.href = url;
707-
a.download = `validator_${lang}_${formattedTimestamp}.sql`;;
710+
a.download = `validator_${lang}_${engine}_${formattedTimestamp}.sql`;
708711
document.body.appendChild(a);
709712
a.click();
710713
document.body.removeChild(a);
@@ -768,7 +771,7 @@ function App() {
768771
}
769772
const parsed = parseImportFile(data);
770773
setPendingImportData(parsed);
771-
const local = getLocalData(lang);
774+
const local = getLocalData(lang, engine);
772775
const analysis = detectConflicts(local, parsed);
773776
importDialogRef.current?.open(analysis);
774777
};

src/ImportDialog.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function SqlBlock({ code, changedLines, variant }: { code: string; changedLines?
8080

8181
const ImportDialog = forwardRef<ImportDialogHandle, ImportDialogProps>(
8282
({ importedData, onOverwrite, onMergeApply }, ref) => {
83-
const { t, lang, questions } = useLanguage();
83+
const { t, lang, engine, questions } = useLanguage();
8484
const [isOpen, setIsOpen] = useState(false);
8585
const [step, setStep] = useState<"choose" | "resolve">("choose");
8686
const [analysis, setAnalysis] = useState<MergeAnalysis | null>(null);
@@ -169,6 +169,11 @@ const ImportDialog = forwardRef<ImportDialogHandle, ImportDialogProps>(
169169
{t("languageMismatchWarning", { fileLang: importedData.language })}
170170
</p>
171171
)}
172+
{importedData && importedData.engine !== engine && (
173+
<p className="text-sm text-yellow-600 dark:text-yellow-400 mt-1">
174+
{t("engineMismatchWarning", { fileEngine: importedData.engine })}
175+
</p>
176+
)}
172177
<div className="flex gap-3 mt-2">
173178
<Button onClick={handleOverwrite} variant="destructive">
174179
{t("overwriteAll")}

src/i18n/ui-strings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ export const uiStrings: Record<string, Record<string, string>> = {
115115
settingLineNumbers: "Radnummer",
116116
settingHighlightActiveLine: "Markera aktiv rad",
117117
sqlReferencePostgresql: "PostgreSQL-dokumentation",
118+
engineMismatchWarning: "Varning: Denna sparfil skapades med en annan databasmotor ({{fileEngine}}). Import kan orsaka problem.",
118119
},
119120

120121
en: {
@@ -228,5 +229,6 @@ export const uiStrings: Record<string, Record<string, string>> = {
228229
settingLineNumbers: "Line Numbers",
229230
settingHighlightActiveLine: "Highlight Active Line",
230231
sqlReferencePostgresql: "PostgreSQL Documentation",
232+
engineMismatchWarning: "Warning: This save file was created with a different database engine ({{fileEngine}}). Importing may cause issues.",
231233
},
232234
};

src/mergeUtils.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export interface ParsedSaveData {
77
correctQuestionIds: number[];
88
views: View[];
99
language: string;
10+
engine: string;
1011
}
1112

1213
export interface MergeConflict {
@@ -41,6 +42,11 @@ export function parseImportFile(data: string): ParsedSaveData {
4142
const commentLangMatch = data.match(/^-- Language: (\w+)$/m);
4243
const language = structuredLangMatch ? structuredLangMatch[1] : (commentLangMatch ? commentLangMatch[1] : "sv");
4344

45+
const structuredEngineMatch = data.match(
46+
/\/\*\s--- BEGIN Save Engine --- \*\/\n--\s(\w+)\n\/\*\s--- END Save Engine --- \*\//
47+
);
48+
const engine = structuredEngineMatch ? structuredEngineMatch[1] : "sqlite";
49+
4450
const rawQueriesMatch = data.match(
4551
/\/\*\s--- BEGIN Raw Queries --- \*\/\n\/\*\n([\s\S]*?)\n\*\/\n\/\*\s--- END Raw Queries --- \*\//
4652
);
@@ -78,11 +84,11 @@ export function parseImportFile(data: string): ParsedSaveData {
7884
}
7985
}
8086

81-
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language };
87+
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language, engine };
8288
}
8389

84-
export function getLocalData(langPrefix: string = "sv"): ParsedSaveData {
85-
const pfx = `${langPrefix}:`;
90+
export function getLocalData(lang: string = "sv", engine: string = "sqlite"): ParsedSaveData {
91+
const pfx = `${lang}:${engine}:`;
8692
const writtenQuestionIds: number[] = JSON.parse(
8793
localStorage.getItem(`${pfx}writtenQuestions`) || "[]"
8894
);
@@ -104,7 +110,7 @@ export function getLocalData(langPrefix: string = "sv"): ParsedSaveData {
104110

105111
const views: View[] = JSON.parse(localStorage.getItem(`${pfx}views`) || "[]");
106112

107-
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language: langPrefix };
113+
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language: lang, engine };
108114
}
109115

110116
export function detectConflicts(
@@ -281,5 +287,5 @@ export function buildMergedData(
281287
new Set([...local.correctQuestionIds, ...imported.correctQuestionIds])
282288
).filter((id) => String(id) in correctQueries);
283289

284-
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language: local.language };
290+
return { rawQueries, correctQueries, writtenQuestionIds, correctQuestionIds, views, language: local.language, engine: local.engine };
285291
}

0 commit comments

Comments
 (0)