From e27167a4a370028ee54afced3571c678e3ea986e Mon Sep 17 00:00:00 2001 From: Paul Trowbridge Date: Wed, 22 Apr 2026 22:01:59 -0400 Subject: [PATCH] Add `pipekit drivers register` for seeding JDBC driver rows. Registers a driver-table row from the CLI. Kind is validated against the code-level driver registry; JDBC class names default from a built-in table (db2, pg, mssql). Refuses to double-register a kind unless --force is passed. Co-Authored-By: Claude Opus 4.7 --- pipekit/cli.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/pipekit/cli.py b/pipekit/cli.py index 7f5b6af..66ddd30 100644 --- a/pipekit/cli.py +++ b/pipekit/cli.py @@ -45,6 +45,48 @@ def cmd_drivers_list(args) -> int: return 0 +_DEFAULT_JDBC_CLASSES = { + "db2": "com.ibm.as400.access.AS400JDBCDriver", + "pg": "org.postgresql.Driver", + "mssql": "com.microsoft.sqlserver.jdbc.SQLServerDriver", +} + + +def cmd_drivers_register(args) -> int: + try: + drivers.get_driver(args.kind) + except ValueError as e: + print(f"error: {e}") + return 1 + + existing = [d for d in repo.list_drivers() if d["kind"] == args.kind] + if existing and not args.force: + print(f"driver kind {args.kind!r} already registered as " + f"{existing[0]['name']!r} (id={existing[0]['id']}). " + f"Use --force to add a second row.") + return 0 + + class_name = args.class_name or _DEFAULT_JDBC_CLASSES.get(args.kind) + if not class_name: + print(f"error: no built-in JDBC class for kind {args.kind!r}; " + f"pass --class explicitly") + return 1 + + import os + if not os.path.exists(args.jar): + print(f"warning: jar {args.jar!r} does not exist " + f"(registering anyway)") + + name = args.name or f"{args.kind}-jdbc" + row = repo.create_driver( + name=name, kind=args.kind, jar_file=args.jar, + class_name=class_name, url_template=args.url_template, + ) + print(f"registered driver id={row['id']} name={row['name']!r} " + f"kind={row['kind']!r}") + return 0 + + def cmd_drivers_show(args) -> int: try: d = drivers.get_driver(args.kind) @@ -150,6 +192,21 @@ def main(argv: list[str] | None = None) -> int: p_drv_show.add_argument("kind", help="one of the kinds from `pipekit drivers list`") p_drv_show.set_defaults(func=cmd_drivers_show) + p_drv_reg = drv_sub.add_parser( + "register", help="add a driver row to the database") + p_drv_reg.add_argument("kind", help="driver kind (db2, pg, mssql)") + p_drv_reg.add_argument("--jar", required=True, + help="absolute path to the JDBC jar") + p_drv_reg.add_argument("--name", + help="registry name (default: -jdbc)") + p_drv_reg.add_argument("--class", dest="class_name", + help="JDBC Driver class (default: built-in per kind)") + p_drv_reg.add_argument("--url-template", + help="optional JDBC URL template for the wizard") + p_drv_reg.add_argument("--force", action="store_true", + help="register even if a row for this kind exists") + p_drv_reg.set_defaults(func=cmd_drivers_register) + p_run = sub.add_parser("run", help="run a module by name (synchronous)") p_run.add_argument("module", help="module name") p_run.add_argument("--dry-run", action="store_true",