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, )
| 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. |
| 1147 | func 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, |
no test coverage detected