{"record":{"id":"bdec121b0065e13e","repo":"siyuan-note/siyuan","slug":"unsupported-template-database-mode-s","errorCode":null,"errorMessage":"unsupported template database mode [%s]","messagePattern":"unsupported template database mode \\[(.+?)\\]","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/template.go","lineNumber":271,"sourceCode":"}\n\nfunc DocSaveAsTemplate(id, name string, overwrite bool) (code int, err error) {\n\treturn DocSaveAsTemplateWithDatabaseMode(id, name, overwrite, TemplateDatabaseModeCopy)\n}\n\nfunc DocSaveAsTemplateWithDatabaseMode(id, name string, overwrite bool, databaseMode TemplateDatabaseMode) (code int, err error) {\n\treturn DocSaveAsTemplateInDirectory(id, name, \"\", overwrite, databaseMode)\n}\n\nfunc DocSaveAsTemplateInDirectory(id, name, directory string, overwrite bool, databaseMode TemplateDatabaseMode) (code int, err error) {\n\tif err = validateTemplateRelativePath(directory, true); err != nil {\n\t\treturn\n\t}\n\tif databaseMode == \"\" {\n\t\tdatabaseMode = TemplateDatabaseModeCopy\n\t}\n\tif TemplateDatabaseModeCopy != databaseMode && TemplateDatabaseModeReference != databaseMode {\n\t\treturn 0, fmt.Errorf(\"unsupported template database mode [%s]\", databaseMode)\n\t}\n\n\tbt := treenode.GetBlockTree(id)\n\tif nil == bt {\n\t\treturn\n\t}\n\n\ttree := prepareExportTree(bt)\n\tmarkTemplateAttributeViewModes(tree.Root, databaseMode)\n\taddBlockIALNodes(tree, true)\n\n\tast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus {\n\t\tif !entering {\n\t\t\treturn ast.WalkContinue\n\t\t}\n\n\t\t// Content in templates is not properly escaped\n\t\t// https://github.com/siyuan-note/siyuan/issues/9649","sourceCodeStart":253,"sourceCodeEnd":289,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/model/template.go#L253-L289","documentation":"DocSaveAsTemplateInDirectory saves the current document as a template and decides how embedded attribute views (databases) are handled. databaseMode must be exactly TemplateDatabaseModeCopy (copy) or TemplateDatabaseModeReference (reference); empty defaults to copy. Any other string aborts with this error before any file is written.","triggerScenarios":"Calling DocSaveAsTemplateInDirectory / DocSaveAsTemplateWithDatabaseMode / the docSaveAsTemplate API with databaseMode set to values like Copy, ref, link, duplicate, or a misspelled variant.","commonSituations":"API clients guessing mode strings, UI plugins passing translated labels instead of the enum value, or stale code written against an older parameter set.","solutions":["Use the constants: model.TemplateDatabaseModeCopy or model.TemplateDatabaseModeReference","Pass the exact lowercase strings copy or reference when calling over the HTTP API","Pass an empty string to get the default (copy) behavior instead of inventing a value"],"exampleFix":"// before\nmodel.DocSaveAsTemplateWithDatabaseMode(id, dir, 'ref')\n// after\nmodel.DocSaveAsTemplateWithDatabaseMode(id, dir, model.TemplateDatabaseModeReference)","handlingStrategy":"validation","validationCode":"mode := strings.TrimSpace(databaseMode)\nif mode != '' && mode != 'copy' && mode != 'reference' {\n    return fmt.Errorf('unsupported template database mode %q', mode)\n}","typeGuard":"func validDBMode(m model.TemplateDatabaseMode) bool {\n    return m == model.TemplateDatabaseModeCopy || m == model.TemplateDatabaseModeReference || m == ''\n}","tryCatchPattern":"id, err := model.DocSaveAsTemplateWithDatabaseMode(id, dir, mode)\nif err != nil {\n    if strings.Contains(err.Error(), 'unsupported template database mode') {\n        return fmt.Errorf('mode must be copy or reference, got %q', mode)\n    }\n    return err\n}","preventionTips":["Only use exported TemplateDatabaseMode* constants in Go callers","In JS clients, hard-code the exact lowercase literals copy/reference","Treat empty string as valid (defaults to copy) rather than substituting your own default word"],"tags":["go","api","enum","siyuan"],"backgroundTag":"invalid-enum-value","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}