diff --git a/internal/catalog/path.go b/internal/catalog/path.go index 690d066940cfdeaa66b65626521f50260011fe94..fb2f714b2c868d990b9078c53d2161ba6b352bad 100644 --- a/internal/catalog/path.go +++ b/internal/catalog/path.go @@ -9,6 +9,13 @@ import ( "gitlab.com/dalibo/pg_migrate/internal/errorlist" ) +func qualifiedName(schema, name string) string { + if schema == "" { + return name + } + return fmt.Sprintf("%s.%s", schema, name) +} + // Find object by path // // Uses reflection to browse deep object. @@ -26,14 +33,6 @@ func Find[T any](object any, path string) T { var zero T haystack := reflect.ValueOf(object) - schema, path, _ := strings.Cut(path, "/") - if path == "" { - path = fmt.Sprintf("Schemas/%s", schema) - schema = "" - } - if schema == "-" { - schema = "" - } var v string pathloop: @@ -51,16 +50,17 @@ pathloop: return zero } case reflect.Slice: // Search for item with v as Name. + schema, v, ok := strings.Cut(v, ".") + if !ok { + v = schema // revert + } for i := range haystack.Len() { item := haystack.Index(i) if item.Kind() != reflect.Struct { return zero } - if schema != "" { - if item.FieldByName("Schema").String() != schema { - continue - } - schema = "" + if schema != "" && item.FieldByName("Schema").String() != schema { + continue } name := item.FieldByName("Name").String() if name == v { diff --git a/internal/catalog/roles.go b/internal/catalog/roles.go index 6873ac6856e40e412ec6912db4bd4988573febc6..92df9d350f54ca58194672b6968eec58db206468 100644 --- a/internal/catalog/roles.go +++ b/internal/catalog/roles.go @@ -23,9 +23,7 @@ func (r Role) String() string { } func (r Role) BuildPath(tail ...string) string { - segments := []string{"-/Roles", r.Name} - segments = append(segments, tail...) - return strings.Join(segments, "/") + return strings.Join(append([]string{"Roles", r.Name}, tail...), "/") } func (r *Role) Scan(rw *sql.Rows) error { diff --git a/internal/catalog/routines.go b/internal/catalog/routines.go index b629a66202eae1394446910efd1f9e49f7de0b23..293782efb7933304b430593dc9b66a4dbdc47715 100644 --- a/internal/catalog/routines.go +++ b/internal/catalog/routines.go @@ -218,11 +218,7 @@ func (p Procedure) BuildSignature() string { } func (p Procedure) BuildPath(tail ...string) string { - var elem []string - if p.Schema != "" { - elem = append(elem, p.Schema) - } - elem = append(elem, "Procedures", p.Name) + elem := []string{"Procedures", qualifiedName(p.Schema, p.Name)} elem = append(elem, tail...) return strings.Join(elem, "/") } @@ -246,11 +242,7 @@ func (f Function) String() string { } func (f Function) BuildPath(tail ...string) string { - var elem []string - if f.Schema != "" { - elem = append(elem, f.Schema) - } - elem = append(elem, "Functions", f.Name) + elem := []string{"Functions", qualifiedName(f.Schema, f.Name)} elem = append(elem, tail...) return strings.Join(elem, "/") } @@ -283,11 +275,7 @@ func (t Trigger) String() string { } func (t Trigger) BuildPath(tail ...string) string { - var elem []string - if t.Schema != "" { - elem = append(elem, t.Schema) - } - elem = append(elem, "Triggers", t.Name) + elem := []string{"Triggers", qualifiedName(t.Schema, t.Name)} elem = append(elem, tail...) return strings.Join(elem, "/") } diff --git a/internal/catalog/schema.go b/internal/catalog/schema.go index 5719c11194a660e73cf810905925d2256d087404..519340b5baa5bbcf9ca74fe3e7249ffe0abf3c2c 100644 --- a/internal/catalog/schema.go +++ b/internal/catalog/schema.go @@ -36,7 +36,7 @@ type Schema struct { } func (s Schema) BuildPath(tail ...string) string { - return strings.Join(append([]string{s.Name}, tail...), "/") + return strings.Join(append([]string{"Schemas", s.Name}, tail...), "/") } func (s Schema) String() string { diff --git a/internal/catalog/sequence.go b/internal/catalog/sequence.go index 0c1fc84e35141842327449054160e400356ceca4..725e680b290d4074b7e8c7d3198de556866d555d 100644 --- a/internal/catalog/sequence.go +++ b/internal/catalog/sequence.go @@ -38,13 +38,8 @@ func (s Sequence) String() string { // // Use catalog.Find() to fetch by path the object in a model struct. func (s Sequence) BuildPath(tail ...string) string { - var segments []string - if s.Schema != "" { - segments = append(segments, s.Schema, s.ObjectType+"s") - } - segments = append(segments, s.Name) - segments = append(segments, tail...) - return strings.Join(segments, "/") + elems := []string{"Sequences", qualifiedName(s.Schema, s.Name)} + return strings.Join(append(elems, tail...), "/") } func (s *Sequence) Scan(r *sql.Rows) error { diff --git a/internal/catalog/table.go b/internal/catalog/table.go index f2671499618746d0842f11cc0b964950e6631726..8a8ce55c0f06155bc2682b9d51bb783f2e906234 100644 --- a/internal/catalog/table.go +++ b/internal/catalog/table.go @@ -42,15 +42,14 @@ type Table struct { // // e.g.: parent.BuildPath(partition.BuildPath()). func (t Table) BuildPath(tail ...string) string { - var segments []string + var elems []string if t.Schema != "" { - segments = append(segments, t.Schema, "Tables") + elems = append(elems, "Tables", qualifiedName(t.Schema, t.Name)) } else { - segments = append(segments, "Partitions") + elems = append(elems, "Partitions", t.Name) } - segments = append(segments, t.Name) - segments = append(segments, tail...) - return strings.Join(segments, "/") + elems = append(elems, tail...) + return strings.Join(elems, "/") } // Priority compute table processing order diff --git a/internal/catalog/view.go b/internal/catalog/view.go index ad5cc2ad377ae4a8cd93c3e4fde2b0fcd5c57e96..810b3ee26bcfb3b3ba6fac968c92162f1185ee4d 100644 --- a/internal/catalog/view.go +++ b/internal/catalog/view.go @@ -22,7 +22,8 @@ func (v View) String() string { } func (v View) BuildPath(tail ...string) string { - return strings.Join(append([]string{v.Schema, "Views", v.Name}, tail...), "/") + elems := []string{"Views", qualifiedName(v.Schema, v.Name)} + return strings.Join(append(elems, tail...), "/") } func (v *View) Scan(r *sql.Rows) error { diff --git a/internal/mysql/jobs.go b/internal/mysql/jobs.go index 796a85b7a209a8d199383aac5940d33a004f4c67..7b956e1dd647ae201a9c28275433174d142be037 100644 --- a/internal/mysql/jobs.go +++ b/internal/mysql/jobs.go @@ -5,7 +5,6 @@ import ( "database/sql" "fmt" "log/slog" - "strings" "time" "gitlab.com/dalibo/pg_migrate/internal/catalog" @@ -42,7 +41,7 @@ func (j job) String() string { } func (j job) BuildPath() string { - return strings.Join([]string{j.Schema, "Jobs", j.Name}, "/") + return fmt.Sprintf("Jobs/%s.%s", j.Schema, j.Name) } func (j *job) Scan(r *sql.Rows) error { diff --git a/internal/mysql/links.go b/internal/mysql/links.go index c9c97254fc9b5b979aa818630df4eafbc19bbddc..ca6928fd25520ae65f77d1e7a4b39d3a850e67fd 100644 --- a/internal/mysql/links.go +++ b/internal/mysql/links.go @@ -5,7 +5,6 @@ package mysql import ( "database/sql" "fmt" - "strings" "gitlab.com/dalibo/pg_migrate/internal/catalog" ) @@ -26,7 +25,7 @@ func (d databaseLink) String() string { } func (d databaseLink) BuildPath() string { - return strings.Join([]string{d.Schema, "DatabaseLinks", d.Name}, "/") + return fmt.Sprintf("DatabaseLinks/%s.%s", d.Schema, d.Name) } func (d *databaseLink) Scan(r *sql.Rows) error { diff --git a/internal/oracle/jobs.go b/internal/oracle/jobs.go index 845c17e54238fb4d3fec79dea16ac9ac0ff4c326..2c44c9f03aaf5fb8d22b8a056d21b85d1a615423 100644 --- a/internal/oracle/jobs.go +++ b/internal/oracle/jobs.go @@ -5,7 +5,6 @@ import ( "database/sql" "fmt" "log/slog" - "strings" "time" "gitlab.com/dalibo/pg_migrate/internal/catalog" @@ -50,7 +49,7 @@ func (j job) String() string { } func (j job) BuildPath() string { - return strings.Join([]string{j.Schema, "Jobs", j.Name}, "/") + return fmt.Sprintf("Jobs/%s.%s", j.Schema, j.Name) } func (j *job) Scan(r *sql.Rows) error { @@ -85,7 +84,7 @@ func (j schedulerJob) String() string { } func (j schedulerJob) BuildPath() string { - return strings.Join([]string{j.Schema, "SchedulerJobs", j.Name}, "/") + return fmt.Sprintf("SchedulerJobs/%s.%s", j.Schema, j.Name) } func (j *schedulerJob) Scan(r *sql.Rows) error { diff --git a/internal/oracle/links.go b/internal/oracle/links.go index 27cdeea2178e44231554c350c159709846f06624..cf62fd2a5d88d9ad27599d9e5e41736deea869b9 100644 --- a/internal/oracle/links.go +++ b/internal/oracle/links.go @@ -3,7 +3,6 @@ package oracle import ( "database/sql" "fmt" - "strings" "gitlab.com/dalibo/pg_migrate/internal/catalog" ) @@ -22,7 +21,7 @@ func (d databaseLink) String() string { } func (d databaseLink) BuildPath() string { - return strings.Join([]string{d.Schema, "DatabaseLinks", d.Name}, "/") + return fmt.Sprintf("DatabaseLinks/%s.%s", d.Schema, d.Name) } func (d *databaseLink) Scan(r *sql.Rows) error { @@ -60,7 +59,7 @@ func (s synonym) String() string { } func (s synonym) BuildPath() string { - return strings.Join([]string{s.Schema, "Synonyms", s.Name}, "/") + return fmt.Sprintf("Synonyms/%s.%s", s.Schema, s.Name) } func (s *synonym) Scan(r *sql.Rows) error { diff --git a/internal/oracle/packages.go b/internal/oracle/packages.go index 0c4470323a38f60f3d0ea5805b5a528008183c69..1acf9062be7bc233d7777c408d20dba43ee3a86c 100644 --- a/internal/oracle/packages.go +++ b/internal/oracle/packages.go @@ -71,7 +71,8 @@ func (p Package) String() string { } func (p Package) BuildPath(tail ...string) string { - return strings.Join(append([]string{p.Schema, "Packages", p.Name}, tail...), "/") + elems := []string{"Packages", fmt.Sprintf("%s.%s", p.Schema, p.Name)} + return strings.Join(append(elems, tail...), "/") } func (p *Package) inspectAST(root ast.Node) { diff --git a/internal/oracle/routines.go b/internal/oracle/routines.go index 94fb06c7613958023eb6e52bdbb381036791c852..3afef271226d00114acee7cf6a921e1aa2d0e6db 100644 --- a/internal/oracle/routines.go +++ b/internal/oracle/routines.go @@ -136,12 +136,7 @@ type Type struct { } func (t *Type) BuildPath() string { - var elems []string - if t.Schema != "" { - elems = append(elems, t.Schema) - } - elems = append(elems, "Types", t.Name) - return strings.Join(elems, "/") + return strings.Join([]string{"Types", qualifiedName(t.Schema, t.Name)}, "/") } func (t *Type) Scan(r *sql.Rows) error { @@ -186,7 +181,7 @@ func (j javaSource) String() string { } func (j javaSource) BuildPath() string { - return fmt.Sprintf("%s/JavaSources/%s", j.Schema, j.Name) + return fmt.Sprintf("JavaSources/%s.%s", j.Schema, j.Name) } func (j *javaSource) FromSource(schema, name, source string) { @@ -245,3 +240,10 @@ func parseSignature(source any) (params []catalog.Parameter, ret catalog.DataTyp err = errs.Value() return } + +func qualifiedName(schema, name string) string { + if schema == "" { + return name + } + return fmt.Sprintf("%s.%s", schema, name) +} diff --git a/internal/oracle/views.go b/internal/oracle/views.go index 1c0084ea923d27e8e3848bf2878e2fa1638f0ad4..29d0f8542a8f5d6c1c985717710f3ad8814f0f96 100644 --- a/internal/oracle/views.go +++ b/internal/oracle/views.go @@ -104,7 +104,9 @@ func (mv MaterializedView) String() string { } func (mv *MaterializedView) BuildPath(tail ...string) string { - return strings.Join(append([]string{mv.Schema, "MaterializedViews", mv.Name}, tail...), "/") + elems := []string{"MaterializedViews", fmt.Sprintf("%s.%s", mv.Schema, mv.Name)} + elems = append(elems, tail...) + return strings.Join(elems, "/") } func (mv MaterializedView) Match(schema, name string) bool {