Files
relspecgo/pkg/diff/types.go
Hein aad5db5175
Some checks failed
CI / Test (1.24) (push) Failing after -24m50s
CI / Test (1.25) (push) Failing after -24m42s
CI / Build (push) Successful in -25m49s
CI / Lint (push) Successful in -25m36s
fix: readers and linting issues
2025-12-19 22:28:24 +02:00

193 lines
6.6 KiB
Go

package diff
import "git.warky.dev/wdevs/relspecgo/pkg/models"
// DiffResult represents the complete difference analysis between two databases
type DiffResult struct {
Source string `json:"source"`
Target string `json:"target"`
Schemas *SchemaDiff `json:"schemas"`
}
// SchemaDiff represents differences at the schema level
type SchemaDiff struct {
Missing []*models.Schema `json:"missing"` // Schemas in source but not in target
Extra []*models.Schema `json:"extra"` // Schemas in target but not in source
Modified []*SchemaChange `json:"modified"` // Schemas that exist in both but differ
}
// SchemaChange represents changes within a schema
type SchemaChange struct {
Name string `json:"name"`
Tables *TableDiff `json:"tables,omitempty"`
Views *ViewDiff `json:"views,omitempty"`
Sequences *SequenceDiff `json:"sequences,omitempty"`
}
// TableDiff represents differences in tables
type TableDiff struct {
Missing []*models.Table `json:"missing"` // Tables in source but not in target
Extra []*models.Table `json:"extra"` // Tables in target but not in source
Modified []*TableChange `json:"modified"` // Tables that exist in both but differ
}
// TableChange represents changes within a table
type TableChange struct {
Name string `json:"name"`
Schema string `json:"schema"`
Columns *ColumnDiff `json:"columns,omitempty"`
Indexes *IndexDiff `json:"indexes,omitempty"`
Constraints *ConstraintDiff `json:"constraints,omitempty"`
Relationships *RelationshipDiff `json:"relationships,omitempty"`
}
// ColumnDiff represents differences in columns
type ColumnDiff struct {
Missing []*models.Column `json:"missing"` // Columns in source but not in target
Extra []*models.Column `json:"extra"` // Columns in target but not in source
Modified []*ColumnChange `json:"modified"` // Columns that exist in both but differ
}
// ColumnChange represents a modified column
type ColumnChange struct {
Name string `json:"name"`
Source *models.Column `json:"source"`
Target *models.Column `json:"target"`
Changes map[string]any `json:"changes"` // Map of field name to what changed
}
// IndexDiff represents differences in indexes
type IndexDiff struct {
Missing []*models.Index `json:"missing"` // Indexes in source but not in target
Extra []*models.Index `json:"extra"` // Indexes in target but not in source
Modified []*IndexChange `json:"modified"` // Indexes that exist in both but differ
}
// IndexChange represents a modified index
type IndexChange struct {
Name string `json:"name"`
Source *models.Index `json:"source"`
Target *models.Index `json:"target"`
Changes map[string]any `json:"changes"`
}
// ConstraintDiff represents differences in constraints
type ConstraintDiff struct {
Missing []*models.Constraint `json:"missing"` // Constraints in source but not in target
Extra []*models.Constraint `json:"extra"` // Constraints in target but not in source
Modified []*ConstraintChange `json:"modified"` // Constraints that exist in both but differ
}
// ConstraintChange represents a modified constraint
type ConstraintChange struct {
Name string `json:"name"`
Source *models.Constraint `json:"source"`
Target *models.Constraint `json:"target"`
Changes map[string]any `json:"changes"`
}
// RelationshipDiff represents differences in relationships
type RelationshipDiff struct {
Missing []*models.Relationship `json:"missing"` // Relationships in source but not in target
Extra []*models.Relationship `json:"extra"` // Relationships in target but not in source
Modified []*RelationshipChange `json:"modified"` // Relationships that exist in both but differ
}
// RelationshipChange represents a modified relationship
type RelationshipChange struct {
Name string `json:"name"`
Source *models.Relationship `json:"source"`
Target *models.Relationship `json:"target"`
Changes map[string]any `json:"changes"`
}
// ViewDiff represents differences in views
type ViewDiff struct {
Missing []*models.View `json:"missing"` // Views in source but not in target
Extra []*models.View `json:"extra"` // Views in target but not in source
Modified []*ViewChange `json:"modified"` // Views that exist in both but differ
}
// ViewChange represents a modified view
type ViewChange struct {
Name string `json:"name"`
Source *models.View `json:"source"`
Target *models.View `json:"target"`
Changes map[string]any `json:"changes"`
}
// SequenceDiff represents differences in sequences
type SequenceDiff struct {
Missing []*models.Sequence `json:"missing"` // Sequences in source but not in target
Extra []*models.Sequence `json:"extra"` // Sequences in target but not in source
Modified []*SequenceChange `json:"modified"` // Sequences that exist in both but differ
}
// SequenceChange represents a modified sequence
type SequenceChange struct {
Name string `json:"name"`
Source *models.Sequence `json:"source"`
Target *models.Sequence `json:"target"`
Changes map[string]any `json:"changes"`
}
// Summary provides counts for quick overview
type Summary struct {
Schemas SchemaSummary `json:"schemas"`
Tables TableSummary `json:"tables"`
Columns ColumnSummary `json:"columns"`
Indexes IndexSummary `json:"indexes"`
Constraints ConstraintSummary `json:"constraints"`
Relationships RelationshipSummary `json:"relationships"`
Views ViewSummary `json:"views"`
Sequences SequenceSummary `json:"sequences"`
}
type SchemaSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}
type TableSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}
type ColumnSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}
type IndexSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}
type ConstraintSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}
type RelationshipSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}
type ViewSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}
type SequenceSummary struct {
Missing int `json:"missing"`
Extra int `json:"extra"`
Modified int `json:"modified"`
}