- 类别:
common别名:— 优先级:— - 作者:X1r0z
- 依赖:
derby:org.apache.derby.jdbc.EmbeddedDriver - 实现:
Gadget
生成 Derby 内存数据库连接信息和一条设置 derby.database.classpath 的 SQL。
- 入口
tags:DerbyJdbcUrl、JdbcUrlChains、END - 衔接
nextTags:无 excludes:无
关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:
public Map<String, Object> getObject() {
String url = "jdbc:derby:memory:" + this.database + ";create=true";
ArrayList<String> sqlList = new ArrayList<String>();
sqlList.add("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP." + this.className + "')");
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(ContextTag.JDBC_DRIVER, this.driverClassName);
map.put(ContextTag.JDBC_URL, url);
map.put(ContextTag.JDBC_URL_SQL_LIST, sqlList);
return map;
}
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
Map<String, Object> jdbcMap = this.getObject();
context.put(ContextTag.DRIVER_CLASS_NAME_KEY, this.driverClassName);
return jdbcMap;
}getObject() 返回 Map,包含 ContextTag.JDBC_DRIVER、ContextTag.JDBC_URL 和 ContextTag.JDBC_URL_SQL_LIST。URL 固定为 jdbc:derby:memory:<database>;create=true,SQL 为 CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(...)。
它不是单独完成执行的 sink,而是 Derby 多阶段 JDBC 链中的一个步骤:前置步骤把 jar 安装到 Derby schema 后,本步骤把 APP.<className> 加入数据库 classpath,供后续 CREATE PROCEDURE 找到类。
invoke() 把 org.apache.derby.jdbc.EmbeddedDriver 写入 DRIVER_CLASS_NAME_KEY,使外层 DataSource/JNDI 包装器能正确配置驱动。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
database |
数据库名 | — | "dbtest" |
— |
className |
Jar包内的className | 在DerbyInstallJar时可通过Context上下文输出进行获取 | — | — |
- 注解描述:适用于HikariCP和TomcatJDBC仅能执行单条SQL情况 CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP." + className + "')
- 依赖条件:
derby:org.apache.derby.jdbc.EmbeddedDriver。 - 面向只能执行单条初始化 SQL 的 JDBC 包装场景;
className需要与前面 Derby install jar 阶段实际写入的类名一致。 END标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。
检测 SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY、derby.database.classpath、jdbc:derby:memory: 同时出现。
自由构件,未直接出现在预设链中。
- 机器可读元数据:
index/gadgets.json。 - 完整反编译源码:。