MCPcopy Create free account
hub / github.com/bytebase/bytebase / doGenerate

Function doGenerate

backend/plugin/parser/pg/restore.go:86–166  ·  view source on GitHub ↗
(ctx context.Context, rCtx base.RestoreContext, sqlForComment string, node ast.Node, backupItem *storepb.PriorBackupDetail_Item, prependStatements string)

Source from the content-addressed store, hash-verified

84}
85
86func doGenerate(ctx context.Context, rCtx base.RestoreContext, sqlForComment string, node ast.Node, backupItem *storepb.PriorBackupDetail_Item, prependStatements string) (string, error) {
87 _, sourceDatabase, err := common.GetInstanceDatabaseID(backupItem.SourceTable.Database)
88 if err != nil {
89 return "", errors.Wrapf(err, "failed to get source database ID for %s", backupItem.SourceTable.Database)
90 }
91
92 if rCtx.GetDatabaseMetadataFunc == nil {
93 return "", errors.Errorf("GetDatabaseMetadataFunc is required")
94 }
95
96 _, metadata, err := rCtx.GetDatabaseMetadataFunc(ctx, rCtx.InstanceID, sourceDatabase)
97 if err != nil {
98 return "", errors.Wrapf(err, "failed to get database metadata for %s", sourceDatabase)
99 }
100
101 if metadata == nil {
102 return "", errors.Errorf("database metadata not found for %s", sourceDatabase)
103 }
104
105 schema := backupItem.SourceTable.Schema
106 if schema == "" {
107 schema = "public"
108 }
109 schemaMetadata := metadata.GetSchemaMetadata(schema)
110 if schemaMetadata == nil {
111 return "", errors.Errorf("schema metadata not found for %s", schema)
112 }
113
114 tableMetadata := schemaMetadata.GetTable(backupItem.SourceTable.Table)
115 if tableMetadata == nil {
116 return "", errors.Errorf("table metadata not found for %s.%s", schema, backupItem.SourceTable.Table)
117 }
118
119 backupSchema := backupItem.TargetTable.Schema
120 backupTable := backupItem.TargetTable.Table
121 originalSchema := schema
122 originalTable := backupItem.SourceTable.Table
123 quotedColumnList := quotePGColumns(restorableColumns(tableMetadata))
124
125 var result string
126 switch n := node.(type) {
127 case *ast.DeleteStmt:
128 result = fmt.Sprintf(`INSERT INTO "%s"."%s" (%s) SELECT %s FROM "%s"."%s";`, originalSchema, originalTable, quotedColumnList, quotedColumnList, backupSchema, backupTable)
129 case *ast.UpdateStmt:
130 fields := extractSetFieldNames(n)
131 uk, err := findDisjointUniqueKey(tableMetadata, fields)
132 if err != nil {
133 return "", err
134 }
135
136 var buf strings.Builder
137 if _, err := fmt.Fprintf(&buf, `INSERT INTO "%s"."%s" (%s) SELECT %s FROM "%s"."%s" ON CONFLICT ON CONSTRAINT "%s" DO UPDATE SET `, originalSchema, originalTable, quotedColumnList, quotedColumnList, backupSchema, backupTable, uk); err != nil {
138 return "", errors.Wrapf(err, "failed to generate update statement")
139 }
140 for i, field := range fields {
141 if i > 0 {
142 if _, err := fmt.Fprint(&buf, ", "); err != nil {
143 return "", errors.Wrapf(err, "failed to generate update statement")

Callers 1

GenerateRestoreSQLFunction · 0.70

Calls 10

GetInstanceDatabaseIDFunction · 0.92
quotePGColumnsFunction · 0.85
restorableColumnsFunction · 0.85
extractSetFieldNamesFunction · 0.85
findDisjointUniqueKeyFunction · 0.85
ErrorfMethod · 0.80
GetSchemaMetadataMethod · 0.80
StringMethod · 0.65
GetTableMethod · 0.45

Tested by

no test coverage detected