fix(mysql): improve create database permission hint

This commit is contained in:
zipg authored and GitHub committed 2026-07-21 11:22:51 +08:00
1 parent 5847f242de
commit 7d41e4123f
10 files changed
+63 -5

No files matched your search

@@ -0,0 +1,31 @@
import { describe, expect, it } from "vitest";
import { appendCreateDatabaseErrorHint } from "@/lib/database/createDatabaseErrorHints";
const hint = "Use an account with GRANT OPTION to grant CREATE permission.";
const t = (key: string) => (key === "contextMenu.mysqlCreateDatabasePermissionHint" ? hint : key);
describe("appendCreateDatabaseErrorHint", () => {
it("adds guidance for MySQL error 1044", () => {
const message = appendCreateDatabaseErrorHint("mysql", "ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'pro'", t);
expect(message).toContain("ERROR 1044");
expect(message).toContain(hint);
});
it("recognizes access-denied messages when the driver omits the error code", () => {
const message = appendCreateDatabaseErrorHint("mysql", "Access denied for user 'app'@'%' to database 'pro'", t);
expect(message).toContain(hint);
});
it("does not alter unrelated or non-MySQL errors", () => {
expect(appendCreateDatabaseErrorHint("mysql", "ERROR 1007: Can't create database; database exists", t)).toBe("ERROR 1007: Can't create database; database exists");
expect(appendCreateDatabaseErrorHint("postgres", "ERROR 1044: permission denied", t)).toBe("ERROR 1044: permission denied");
});
it("does not append the same hint twice", () => {
const original = `ERROR 1044: Access denied\n\n${hint}`;
expect(appendCreateDatabaseErrorHint("mysql", original, t)).toBe(original);
});
});
@@ -0,0 +1,13 @@
import type { DatabaseType } from "@/types/database";
type Translate = (key: string) => string;
function isMysqlCreateDatabaseAccessDenied(message: string): boolean {
return /\b1044\b/i.test(message) || /access denied for user[\s\S]*to database/i.test(message);
}
export function appendCreateDatabaseErrorHint(databaseType: DatabaseType | undefined, message: string, t: Translate): string {
if (databaseType !== "mysql" || !isMysqlCreateDatabaseAccessDenied(message)) return message;
const hint = t("contextMenu.mysqlCreateDatabasePermissionHint");
return message.includes(hint) ? message : `${message}\n\n${hint}`;
}