From 5500169701d2a64b6954e0bf5a248ad246dabcd0 Mon Sep 17 00:00:00 2001 From: mapan Date: Tue, 1 Sep 2026 15:33:34 +0800 Subject: [PATCH] fix(xugu): accept scheduler job object sources --- crates/dbx-core/src/object_source_sql.rs | 4 ++++ crates/dbx-core/src/schema.rs | 13 +++++++++++++ crates/dbx-core/src/transfer.rs | 1 + crates/dbx-core/src/types.rs | 9 +++++++++ 4 files changed, 27 insertions(+) diff --git a/crates/dbx-core/src/object_source_sql.rs b/crates/dbx-core/src/object_source_sql.rs index 3fc052b957..1f2a464559 100644 --- a/crates/dbx-core/src/object_source_sql.rs +++ b/crates/dbx-core/src/object_source_sql.rs @@ -350,6 +350,7 @@ fn object_type_keyword(object_type: &ObjectSourceKind) -> &'static str { ObjectSourceKind::Event => "EVENT", ObjectSourceKind::Sequence => "SEQUENCE", ObjectSourceKind::Synonym => "SYNONYM", + ObjectSourceKind::Job => "JOB", ObjectSourceKind::Package => "PACKAGE", ObjectSourceKind::PackageBody => "PACKAGE BODY", ObjectSourceKind::Type => "TYPE", @@ -947,6 +948,8 @@ fn parse_object_source_kind(value: &str) -> Option { Some(ObjectSourceKind::Sequence) } else if value.eq_ignore_ascii_case("SYNONYM") { Some(ObjectSourceKind::Synonym) + } else if value.eq_ignore_ascii_case("JOB") { + Some(ObjectSourceKind::Job) } else if value.eq_ignore_ascii_case("PACKAGE") { Some(ObjectSourceKind::Package) } else if value.eq_ignore_ascii_case("PACKAGE BODY") || value.eq_ignore_ascii_case("PACKAGE_BODY") { @@ -1736,6 +1739,7 @@ mod tests { fn parses_programmable_metadata_object_kinds() { assert_eq!(parse_object_source_kind("TRIGGER"), Some(ObjectSourceKind::Trigger)); assert_eq!(parse_object_source_kind("SYNONYM"), Some(ObjectSourceKind::Synonym)); + assert_eq!(parse_object_source_kind("JOB"), Some(ObjectSourceKind::Job)); assert_eq!(parse_object_source_kind("TYPE"), Some(ObjectSourceKind::Type)); assert_eq!(parse_object_source_kind("TYPE_BODY"), Some(ObjectSourceKind::TypeBody)); assert_eq!(parse_object_source_kind("PACKAGE BODY"), Some(ObjectSourceKind::PackageBody)); diff --git a/crates/dbx-core/src/schema.rs b/crates/dbx-core/src/schema.rs index f3e9e5e73d..4d3323a2cf 100644 --- a/crates/dbx-core/src/schema.rs +++ b/crates/dbx-core/src/schema.rs @@ -8154,6 +8154,7 @@ fn sqlite_object_type(kind: &db::ObjectSourceKind) -> &'static str { | db::ObjectSourceKind::Event | db::ObjectSourceKind::Sequence | db::ObjectSourceKind::Synonym + | db::ObjectSourceKind::Job | db::ObjectSourceKind::Package | db::ObjectSourceKind::PackageBody | db::ObjectSourceKind::Type @@ -8170,6 +8171,7 @@ fn sqlserver_object_type_filter(kind: &db::ObjectSourceKind) -> &'static str { db::ObjectSourceKind::Event | db::ObjectSourceKind::Sequence | db::ObjectSourceKind::Synonym + | db::ObjectSourceKind::Job | db::ObjectSourceKind::Package | db::ObjectSourceKind::PackageBody | db::ObjectSourceKind::Type @@ -8415,6 +8417,7 @@ fn postgres_object_source_sql_inner( db::ObjectSourceKind::Trigger | db::ObjectSourceKind::Event | db::ObjectSourceKind::Synonym + | db::ObjectSourceKind::Job | db::ObjectSourceKind::Package | db::ObjectSourceKind::PackageBody | db::ObjectSourceKind::Type @@ -8423,6 +8426,12 @@ fn postgres_object_source_sql_inner( } pub fn oracle_object_source_sql(schema: &str, name: &str, kind: &db::ObjectSourceKind) -> String { + // Scheduler jobs are currently an Xugu-specific Agent object. Do not + // manufacture an Oracle DBMS_METADATA request for a kind Oracle does not + // expose through this generic source-SQL helper. + if matches!(kind, db::ObjectSourceKind::Job) { + return String::new(); + } let object_type = match kind { db::ObjectSourceKind::View => "VIEW", db::ObjectSourceKind::MaterializedView => "MATERIALIZED_VIEW", @@ -8432,6 +8441,7 @@ pub fn oracle_object_source_sql(schema: &str, name: &str, kind: &db::ObjectSourc db::ObjectSourceKind::Event => "EVENT", db::ObjectSourceKind::Sequence => "SEQUENCE", db::ObjectSourceKind::Synonym => "SYNONYM", + db::ObjectSourceKind::Job => "", db::ObjectSourceKind::Package => "PACKAGE", db::ObjectSourceKind::PackageBody => "PACKAGE_BODY", db::ObjectSourceKind::Type => "TYPE", @@ -8489,6 +8499,7 @@ pub fn mysql_object_source_sql(database: &str, name: &str, kind: &db::ObjectSour db::ObjectSourceKind::Event => format!("SHOW CREATE EVENT {qualified_name}"), db::ObjectSourceKind::Sequence | db::ObjectSourceKind::Synonym + | db::ObjectSourceKind::Job | db::ObjectSourceKind::Package | db::ObjectSourceKind::PackageBody | db::ObjectSourceKind::Type @@ -8525,6 +8536,7 @@ pub(crate) fn mysql_object_source_ddl_column_index(kind: &db::ObjectSourceKind) | db::ObjectSourceKind::Trigger | db::ObjectSourceKind::Sequence | db::ObjectSourceKind::Synonym + | db::ObjectSourceKind::Job | db::ObjectSourceKind::Package | db::ObjectSourceKind::PackageBody | db::ObjectSourceKind::Type @@ -9736,6 +9748,7 @@ mod object_source_tests { oracle_object_source_sql("HR", "ORDER_SEQ", &ObjectSourceKind::Sequence), "SELECT DBMS_METADATA.GET_DDL('SEQUENCE', 'ORDER_SEQ', 'HR') FROM DUAL" ); + assert_eq!(oracle_object_source_sql("HR", "NIGHTLY_JOB", &ObjectSourceKind::Job), ""); } #[test] diff --git a/crates/dbx-core/src/transfer.rs b/crates/dbx-core/src/transfer.rs index b6372e668b..1a0dcd0b99 100644 --- a/crates/dbx-core/src/transfer.rs +++ b/crates/dbx-core/src/transfer.rs @@ -8103,6 +8103,7 @@ where } db::ObjectSourceKind::Sequence | db::ObjectSourceKind::Synonym + | db::ObjectSourceKind::Job | db::ObjectSourceKind::Package | db::ObjectSourceKind::PackageBody => object.source.clone(), db::ObjectSourceKind::Trigger diff --git a/crates/dbx-core/src/types.rs b/crates/dbx-core/src/types.rs index 56a7e5331e..8d4279cb9a 100644 --- a/crates/dbx-core/src/types.rs +++ b/crates/dbx-core/src/types.rs @@ -158,6 +158,7 @@ pub enum ObjectSourceKind { Event, Sequence, Synonym, + Job, Package, PackageBody, Type, @@ -837,4 +838,12 @@ mod tests { assert_eq!(kind, ObjectSourceKind::Synonym); assert_eq!(serde_json::to_string(&kind).unwrap(), "\"SYNONYM\""); } + + #[test] + fn object_source_kind_accepts_job_wire_value() { + let kind: ObjectSourceKind = serde_json::from_str("\"JOB\"").unwrap(); + + assert_eq!(kind, ObjectSourceKind::Job); + assert_eq!(serde_json::to_string(&kind).unwrap(), "\"JOB\""); + } }