From d5ec6bdb59c0ad4498a8c2e07de50e4f5693ad90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20BERSAC?= Date: Wed, 10 Sep 2025 19:27:03 +0200 Subject: [PATCH] catalog: Move schema in object path segment --- internal/catalog/path.go | 26 +++++++++++++------------- internal/catalog/roles.go | 4 +--- internal/catalog/routines.go | 18 +++--------------- internal/catalog/schema.go | 2 +- internal/catalog/sequence.go | 9 ++------- internal/catalog/table.go | 11 +++++------ internal/catalog/view.go | 3 ++- internal/mysql/jobs.go | 3 +-- internal/mysql/links.go | 3 +-- internal/oracle/jobs.go | 5 ++--- internal/oracle/links.go | 5 ++--- internal/oracle/packages.go | 3 ++- internal/oracle/routines.go | 16 +++++++++------- internal/oracle/views.go | 4 +++- 14 files changed, 47 insertions(+), 65 deletions(-) diff --git a/internal/catalog/path.go b/internal/catalog/path.go index 690d06694..fb2f714b2 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 6873ac685..92df9d350 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 b629a6620..293782efb 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 5719c1119..519340b5b 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 0c1fc84e3..725e680b2 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 f26714996..8a8ce55c0 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 ad5cc2ad3..810b3ee26 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 796a85b7a..7b956e1dd 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 c9c97254f..ca6928fd2 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 845c17e54..2c44c9f03 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 27cdeea21..cf62fd2a5 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 0c4470323..1acf9062b 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 94fb06c76..3afef2712 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 1c0084ea9..29d0f8542 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 { -- GitLab