MCPcopy Index your code
hub / github.com/bytebase/bytebase / doExport

Function doExport

backend/api/v1/sql_service.go:1147–1253  ·  view source on GitHub ↗

doExport performs SQL Editor exports with masking applied. This is used for ad-hoc exports where users have the EXPORTER role. For approved DATABASE_EXPORT tasks, see data_export_executor.go which exports without masking.

(
	ctx context.Context,
	stores *store.Store,
	dbFactory *dbfactory.DBFactory,
	licenseService *enterprise.LicenseService,
	request *v1pb.ExportRequest,
	user *store.UserMessage,
	instance *store.InstanceMessage,
	database *store.DatabaseMessage,
	optionalAccessCheck accessCheckFunc,
	schemaSyncer *schemasync.Syncer,
	dataSource *storepb.DataSource,
	skipMasking bool,
)

Source from the content-addressed store, hash-verified

1145// This is used for ad-hoc exports where users have the EXPORTER role.
1146// For approved DATABASE_EXPORT tasks, see data_export_executor.go which exports without masking.
1147func doExport(
1148 ctx context.Context,
1149 stores *store.Store,
1150 dbFactory *dbfactory.DBFactory,
1151 licenseService *enterprise.LicenseService,
1152 request *v1pb.ExportRequest,
1153 user *store.UserMessage,
1154 instance *store.InstanceMessage,
1155 database *store.DatabaseMessage,
1156 optionalAccessCheck accessCheckFunc,
1157 schemaSyncer *schemasync.Syncer,
1158 dataSource *storepb.DataSource,
1159 skipMasking bool,
1160) ([]byte, time.Duration, error) {
1161 if dataSource == nil {
1162 return nil, 0, connect.NewError(connect.CodeNotFound, errors.Errorf("cannot found valid data source"))
1163 }
1164 driver, err := dbFactory.GetDataSourceDriver(ctx, instance, dataSource, db.ConnectionContext{
1165 DatabaseName: database.DatabaseName,
1166 DataShare: database.Metadata.GetDatashare(),
1167 ReadOnly: true,
1168 })
1169 if err != nil {
1170 return nil, 0, connect.NewError(connect.CodeInternal, errors.Errorf("failed to get database driver: %v", err))
1171 }
1172 defer driver.Close(ctx)
1173
1174 sqlDB := driver.GetDB()
1175 var conn *sql.Conn
1176 if sqlDB != nil {
1177 conn, err = sqlDB.Conn(ctx)
1178 if err != nil {
1179 return nil, 0, err
1180 }
1181 defer conn.Close()
1182 }
1183 queryRestriction := getEffectiveQueryDataPolicy(
1184 ctx,
1185 stores,
1186 licenseService,
1187 request.Limit,
1188 database.ProjectID,
1189 )
1190 queryContext := buildExportQueryContext(queryRestriction, user.Email, request.Schema, skipMasking)
1191
1192 // Split the statement for span analysis
1193 statements, err := parserbase.SplitMultiSQL(instance.Metadata.GetEngine(), request.Statement)
1194 if err != nil {
1195 // Fall back to single statement for engines without splitter support
1196 statements = []parserbase.Statement{{Text: request.Statement}}
1197 }
1198
1199 results, spans, duration, queryErr := queryRetry(
1200 ctx,
1201 stores,
1202 user,
1203 instance,
1204 database,

Callers 1

ExportMethod · 0.85

Calls 15

MaskResultsMethod · 0.95
buildExportQueryContextFunction · 0.85
queryRetryFunction · 0.85
hasMultipleStatementsFunction · 0.85
NewQueryResultMaskerFunction · 0.85
exportResultToZipFunction · 0.85
ErrorfMethod · 0.80
GetDataSourceDriverMethod · 0.80
CloseMethod · 0.65

Tested by

no test coverage detected