Skip to content

Data Storage

dxx114514-stack edited this page Oct 1, 2026 · 2 revisions

数据存储

目录位置

  1. 环境变量 CLIJUDGE_DATA_DIR 指定的目录(最高优先级)
  2. 否则为可执行文件同级的 data/

备份数据 = 拷贝整个目录(纯 JSON,无数据库)。

目录结构

data/
├── config.json          # current_lang + "judge" 评测设置
├── .clijudge.lock       # 跨进程修改锁(运行期自动创建)
├── langs/*.cjl          # 本地显示语言包(JSON)
├── problems/problem_N.json + problems.json   # 题目文件 + 题目索引
├── articles/article_N.json + articles.json   # 文章文件 + 文章索引
├── contests/contest_N.json + contests.json + contest_N_problem_M_submissions.json
└── submissions/submissions.json

自动迁移:旧版平铺在 data/ 根下的文件会在启动时自动迁移到对应子目录(幂等,顶层保留 config.json 与 langs/)。

config.json

{
  "current_lang": "en",
  "judge": {
    "compile_time_limit_ms": 10000,
    "max_judging_threads": 4,
    "custom_languages": { }
  }
}

并发安全

  • 原子写:题目/比赛/文章/提交索引与 config.json 写入 = 临时文件(*.tmp.<pid>)+ rename 原子替换,进程崩溃不会损坏已有数据;例外:.cjl 语言包与首装内置包用普通 writeFile(非原子)
  • 跨进程锁:data/.clijudge.lock — 修改类命令(建题/编辑/删除/导入/提交/rejudge/比赛操作/语言切换等)启动时排他持锁,读命令不加锁(读到的永远是完整快照);例外:problem testdata 子命令(含 list)按粗粒度归为修改类、实际会加锁;Windows 用 LockFileEx,Linux 用 flock,进程崩溃后锁自动释放,无需手工清理
  • 并发修改同一数据目录时,后到的修改命令会阻塞等待前一个完成

导入导出

内容 导出 导入
题目 problem export 1 p.zip / p.json problem import p.zip|p.json
测试数据 problem testdata 1 -zip t.zip problem testdata 1 -zip t.zip(追加)
比赛 contest export 1 c.cdf contest import c.cdf
  • 题目 zip/json 与 NoldOJ version 格式互通;CDF 为 LemonLime 兼容格式
  • 携带 SPJ/交互器/生成器/grader 的包导入时会输出信任告警(见 沙箱与安全)
  • 导入时重新分配编号,规则为 max(现有编号) + 1——不复用删除留下的空闲编号(删除 2 号后再导入得到 4 号)

返回 Home

Clone this wiki locally