数据库解析器
当前状态
数据库语法校验器(mysql-parser、postgresql-parser、mariadb-parser、sqlite-parser、mongodb-parser 和 redis-parser)不在目录中。API 会以 E006 拒绝这些语言。
它们来自项目的早期版本,尚未基于 libkrun 重建。仓库中现有的内容:
- guest 的执行器(
internal/guest/executor.go)仍保留这些条目,它们用一个校验脚本调用/usr/local/bin/node(/usr/local/bin/mysql-run、psql-run、mariadb-run、sqlite-run、mongodb-run、redis-run),SQL 解析器还会设置NODE_PATH=/opt/sql-parser/node_modules; - 每个解析器的脚本和 Dockerfile 位于仓库根目录的
docker/<parser>/中;SQL 解析器使用node-sql-parser。
可执行的 SQLite(sqlite)仍在目录中;见 SQLite。
重新启用一个解析器需要什么
每个解析器需要两样东西:一个专用镜像,以及 languages.yaml 中的一个新条目。
1. 专用镜像
镜像构建通过 go-containerregistry 从 registry 下载 OCI 镜像;不使用本地 Docker。因此解析器的镜像需要:
- 在
/usr/local/bin/node包含 Node.js; - 在执行器预期的路径上包含解析器脚本(例如
/usr/local/bin/mysql-run); - 对于 SQL 解析器,在
/opt/sql-parser/node_modules中包含node-sql-parser; - 发布到运行构建的 host 能访问的 registry。
docker/<parser>/ 中的 Dockerfile 描述了这些内容,可以作为生成和发布镜像的起点。
2. languages.yaml 中的条目
目录嵌入在二进制中,位于 internal/adapters/catalog/languages.yaml。新条目的格式如下:
- name: mysql-parser
image: <registry>/<imagem do parser>:<tag>
cpus: 1
memory_mib: 256
warmup: ""
name必须与 guest 执行器中使用的名字完全一致。cpus和memory_mib是防止滥用的上限;请通过实测解析器来选定。- 如果镜像已经包含一切,
warmup可以留空。
之后:
task build
task image:build -- --stack mysql-parser
rc run --stack mysql-parser --code 'SELECT 1;'
3. 测试
每个重新启用的解析器都必须加入端到端测试,带一条有效查询和一条无效查询,以证明校验能拒绝应当拒绝的内容。
未验证
截至本文档编写时,还没有任何解析器在 libkrun 上重建。上述步骤描述的是当前代码的要求;尚未端到端执行过。