• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

airbusgeo / godal / 16421382756

21 Jul 2025 03:34PM UTC coverage: 97.59% (+0.004%) from 97.586%
16421382756

Pull #146

github

matteiben-onx
updating test
Pull Request #146: Adding raster thread-safe flag

41 of 41 new or added lines in 4 files covered. (100.0%)

59 existing lines in 3 files now uncovered.

3725 of 3817 relevant lines covered (97.59%)

28.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.04
/errors.go
1
// Copyright 2021 Airbus Defence and Space
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14

15
package godal
16

17
import (
18
        "bytes"
19
        "errors"
20
        "sync"
21
)
22

23
var errorHandlerMu sync.Mutex
24
var errorHandlerIndex int
25

26
// ErrorHandler is a function that can be used to override godal's default behavior
27
// of treating all messages with severity >= CE_Warning as errors. When an ErrorHandler
28
// is passed as an option to a godal function, all logs/errors emitted by gdal will be passed
29
// to this function, which can decide wether the parameters correspond to an actual error
30
// or not.
31
//
32
// If the ErrorHandler returns nil, the parent function will not return an error. It is up
33
// to the ErrorHandler to log the message if needed.
34
//
35
// If the ErrorHandler returns an error, that error will be returned as-is to the caller
36
// of the parent function
37
type ErrorHandler func(ec ErrorCategory, code int, msg string) error
38

39
type errorHandlerWrapper struct {
40
        fn  ErrorHandler
41
        err error
42
}
43

44
var errorHandlers = make(map[int]*errorHandlerWrapper)
45

46
func registerErrorHandler(fn ErrorHandler) int {
143✔
47
        errorHandlerMu.Lock()
143✔
48
        defer errorHandlerMu.Unlock()
143✔
49
        for errorHandlerIndex == 0 || errorHandlers[errorHandlerIndex] != nil {
144✔
50
                errorHandlerIndex++
1✔
51
        }
1✔
52
        errorHandlers[errorHandlerIndex] = &errorHandlerWrapper{fn: fn}
143✔
53
        return errorHandlerIndex
143✔
54
}
55

56
func getErrorHandler(i int) *errorHandlerWrapper {
244✔
57
        errorHandlerMu.Lock()
244✔
58
        defer errorHandlerMu.Unlock()
244✔
59
        return errorHandlers[i]
244✔
60
}
244✔
61

62
func unregisterErrorHandler(i int) {
143✔
63
        errorHandlerMu.Lock()
143✔
64
        defer errorHandlerMu.Unlock()
143✔
65
        delete(errorHandlers, i)
143✔
66
}
143✔
67

68
type errorAndLoggingOpts struct {
69
        eh     ErrorHandler
70
        config []string
71
}
72

73
type errorCallback struct {
74
        fn ErrorHandler
75
}
76

77
type errorAndLoggingOption interface {
78
        setErrorAndLoggingOpt(elo *errorAndLoggingOpts)
79
}
80

81
// ErrLogger is an option to override default error handling.
82
//
83
// See ErrorHandler.
84
func ErrLogger(fn ErrorHandler) interface {
85
        errorAndLoggingOption
86
        AddGeometryOption
87
        BandCreateMaskOption
88
        BandIOOption
89
        BoundsOption
90
        BufferOption
91
        BuildOverviewsOption
92
        BuildVRTOption
93
        ClearOverviewsOption
94
        CloseOption
95
        CopyLayerOption
96
        CreateFeatureOption
97
        CreateLayerOption
98
        CreateSpatialRefOption
99
        DatasetCreateMaskOption
100
        DatasetCreateOption
101
        DatasetIOOption
102
        DatasetTranslateOption
103
        DatasetVectorTranslateOption
104
        DatasetWarpIntoOption
105
        DatasetWarpOption
106
        DeleteFeatureOption
107
        DifferenceOption
108
        FeatureCountOption
109
        FillBandOption
110
        FillNoDataOption
111
        GeoJSONOption
112
        GeometryTransformOption
113
        GeometryReprojectOption
114
        GeometryWKBOption
115
        GeometryWKTOption
116
        GetGeoTransformOption
117
        GMLExportOption
118
        HistogramOption
119
        IntersectsOption
120
        IntersectionOption
121
        MetadataOption
122
        NewFeatureOption
123
        NewGeometryOption
124
        OpenOption
125
        PolygonizeOption
126
        RasterizeGeometryOption
127
        RasterizeOption
128
        RasterizeIntoOption
129
        SetColorInterpOption
130
        SetColorTableOption
131
        SetDescriptionOption
132
        SetGeometryOption
133
        SetFieldValueOption
134
        SetNoDataOption
135
        SetScaleOffsetOption
136
        SetGeoTransformOption
137
        SetGeometryColumnNameOption
138
        SetProjectionOption
139
        SetSpatialRefOption
140
        SieveFilterOption
141
        SimplifyOption
142
        SpatialRefValidateOption
143
        SubGeometryOption
144
        TransformOption
145
        UnionOption
146
        UpdateFeatureOption
147
        VSIHandlerOption
148
        VSIOpenOption
149
        VSIUnlinkOption
150
        WKTExportOption
151
        StatisticsOption
152
        SetStatisticsOption
153
        ClearStatisticsOption
154
        GridOption
155
        NearblackOption
156
        DemOption
157
        ViewshedOption
158
        SetGCPsOption
159
        GCPsToGeoTransformOption
160
        RegisterPluginOption
161
        ExecuteSQLOption
162
        StartTransactionOption
163
        CloseResultSetOption
164
        RollbackTransactionOption
165
        CommitTransactionOption
166
} {
128✔
167
        return errorCallback{fn}
128✔
168
}
128✔
169

170
func (ec errorCallback) setErrorAndLoggingOpt(elo *errorAndLoggingOpts) {
5✔
171
        elo.eh = ec.fn
5✔
172
}
5✔
173
func (ec errorCallback) setAddGeometryOpt(ao *addGeometryOpts) {
1✔
174
        ao.errorHandler = ec.fn
1✔
175
}
1✔
176
func (ec errorCallback) setBandCreateMaskOpt(o *bandCreateMaskOpts) {
1✔
177
        o.errorHandler = ec.fn
1✔
178
}
1✔
179
func (ec errorCallback) setBandIOOpt(o *bandIOOpts) {
3✔
180
        o.errorHandler = ec.fn
3✔
181
}
3✔
182
func (ec errorCallback) setBoundsOpt(o *boundsOpts) {
1✔
183
        o.errorHandler = ec.fn
1✔
184
}
1✔
185
func (ec errorCallback) setBufferOpt(o *bufferOpts) {
1✔
186
        o.errorHandler = ec.fn
1✔
187
}
1✔
188
func (ec errorCallback) setBuildOverviewsOpt(o *buildOvrOpts) {
1✔
189
        o.errorHandler = ec.fn
1✔
190
}
1✔
191
func (ec errorCallback) setBuildVRTOpt(o *buildVRTOpts) {
1✔
192
        o.errorHandler = ec.fn
1✔
193
}
1✔
194
func (ec errorCallback) setClearOverviewsOpt(o *clearOvrOpts) {
2✔
195
        o.errorHandler = ec.fn
2✔
196
}
2✔
197
func (ec errorCallback) setCloseOpt(o *closeOpts) {
2✔
198
        o.errorHandler = ec.fn
2✔
199
}
2✔
200
func (ec errorCallback) setCopyLayerOpt(o *copyLayerOpts) {
1✔
201
        o.errorHandler = ec.fn
1✔
202
}
1✔
203
func (ec errorCallback) setCreateFeatureOpt(cfo *createFeatureOpts) {
1✔
204
        cfo.errorHandler = ec.fn
1✔
205
}
1✔
206
func (ec errorCallback) setCreateLayerOpt(o *createLayerOpts) {
1✔
207
        o.errorHandler = ec.fn
1✔
208
}
1✔
209
func (ec errorCallback) setCreateSpatialRefOpt(o *createSpatialRefOpts) {
6✔
210
        o.errorHandler = ec.fn
6✔
211
}
6✔
212
func (ec errorCallback) setDatasetCreateMaskOpt(o *dsCreateMaskOpts) {
1✔
213
        o.errorHandler = ec.fn
1✔
214
}
1✔
215
func (ec errorCallback) setDatasetCreateOpt(o *dsCreateOpts) {
3✔
216
        o.errorHandler = ec.fn
3✔
217
}
3✔
218
func (ec errorCallback) setDatasetIOOpt(o *datasetIOOpts) {
3✔
219
        o.errorHandler = ec.fn
3✔
220
}
3✔
221
func (ec errorCallback) setDatasetTranslateOpt(o *dsTranslateOpts) {
1✔
222
        o.errorHandler = ec.fn
1✔
223
}
1✔
224
func (ec errorCallback) setDatasetVectorTranslateOpt(o *dsVectorTranslateOpts) {
2✔
225
        o.errorHandler = ec.fn
2✔
226
}
2✔
227
func (ec errorCallback) setDatasetWarpIntoOpt(o *dsWarpIntoOpts) {
3✔
228
        o.errorHandler = ec.fn
3✔
229
}
3✔
230
func (ec errorCallback) setDatasetWarpOpt(o *dsWarpOpts) {
1✔
231
        o.errorHandler = ec.fn
1✔
232
}
1✔
233
func (ec errorCallback) setDeleteFeatureOpt(o *deleteFeatureOpts) {
2✔
234
        o.errorHandler = ec.fn
2✔
235
}
2✔
236
func (ec errorCallback) setDifferenceOpt(do *differenceOpts) {
1✔
237
        do.errorHandler = ec.fn
1✔
238
}
1✔
239
func (ec errorCallback) setFeatureCountOpt(o *featureCountOpts) {
2✔
240
        o.errorHandler = ec.fn
2✔
241
}
2✔
242
func (ec errorCallback) setFillBandOpt(o *fillBandOpts) {
1✔
243
        o.errorHandler = ec.fn
1✔
244
}
1✔
245
func (ec errorCallback) setFillnodataOpt(o *fillnodataOpts) {
1✔
246
        o.errorHandler = ec.fn
1✔
247
}
1✔
248
func (ec errorCallback) setGeojsonOpt(o *geojsonOpts) {
1✔
249
        o.errorHandler = ec.fn
1✔
250
}
1✔
251
func (ec errorCallback) setGeometryColumnNameOpt(o *setGeometryColumnNameOpts) {
2✔
252
        o.errorHandler = ec.fn
2✔
253
}
2✔
254
func (ec errorCallback) setGeometryTransformOpt(o *geometryTransformOpts) {
2✔
255
        o.errorHandler = ec.fn
2✔
256
}
2✔
257
func (ec errorCallback) setGeometryReprojectOpt(o *geometryReprojectOpts) {
1✔
258
        o.errorHandler = ec.fn
1✔
259
}
1✔
260
func (ec errorCallback) setGeometryWKBOpt(o *geometryWKBOpts) {
1✔
261
        o.errorHandler = ec.fn
1✔
262
}
1✔
263
func (ec errorCallback) setGeometryWKTOpt(o *geometryWKTOpts) {
1✔
264
        o.errorHandler = ec.fn
1✔
265
}
1✔
266
func (ec errorCallback) setGetGeoTransformOpt(o *getGeoTransformOpts) {
2✔
267
        o.errorHandler = ec.fn
2✔
268
}
2✔
269
func (ec errorCallback) setGMLExportOpt(o *gmlExportOpts) {
1✔
270
        o.errorHandler = ec.fn
1✔
271
}
1✔
272
func (ec errorCallback) setHistogramOpt(o *histogramOpts) {
2✔
273
        o.errorHandler = ec.fn
2✔
274
}
2✔
275
func (ec errorCallback) setIntersectsOpt(o *intersectsOpts) {
3✔
276
        o.errorHandler = ec.fn
3✔
277
}
3✔
278
func (ec errorCallback) setIntersectionOpt(o *intersectionOpts) {
1✔
279
        o.errorHandler = ec.fn
1✔
280
}
1✔
281
func (ec errorCallback) setMetadataOpt(o *metadataOpts) {
2✔
282
        o.errorHandler = ec.fn
2✔
283
}
2✔
284
func (ec errorCallback) setDescriptionOpt(o *setDescriptionOpts) {
1✔
285
        o.errorHandler = ec.fn
1✔
286
}
1✔
287
func (ec errorCallback) setNewFeatureOpt(o *newFeatureOpts) {
1✔
288
        o.errorHandler = ec.fn
1✔
289
}
1✔
290
func (ec errorCallback) setNewGeometryOpt(o *newGeometryOpts) {
7✔
291
        o.errorHandler = ec.fn
7✔
292
}
7✔
293
func (ec errorCallback) setOpenOpt(oo *openOpts) {
1✔
294
        oo.errorHandler = ec.fn
1✔
295
}
1✔
296
func (ec errorCallback) setPolygonizeOpt(o *polygonizeOpts) {
1✔
297
        o.errorHandler = ec.fn
1✔
298
}
1✔
299
func (ec errorCallback) setRasterizeGeometryOpt(o *rasterizeGeometryOpts) {
1✔
300
        o.errorHandler = ec.fn
1✔
301
}
1✔
302
func (ec errorCallback) setRasterizeOpt(o *rasterizeOpts) {
2✔
303
        o.errorHandler = ec.fn
2✔
304
}
2✔
305
func (ec errorCallback) setRasterizeIntoOpt(o *rasterizeIntoOpts) {
1✔
306
        o.errorHandler = ec.fn
1✔
307
}
1✔
308
func (ec errorCallback) setSetColorInterpOpt(ndo *setColorInterpOpts) {
1✔
309
        ndo.errorHandler = ec.fn
1✔
310
}
1✔
311
func (ec errorCallback) setSetColorTableOpt(ndo *setColorTableOpts) {
1✔
312
        ndo.errorHandler = ec.fn
1✔
313
}
1✔
314
func (ec errorCallback) setSetGeometryOpt(o *setGeometryOpts) {
1✔
315
        o.errorHandler = ec.fn
1✔
316
}
1✔
317
func (ec errorCallback) setSetFieldValueOpt(o *setFieldValueOpts) {
1✔
318
        o.errorHandler = ec.fn
1✔
319
}
1✔
320
func (ec errorCallback) setSetGeoTransformOpt(o *setGeoTransformOpts) {
1✔
321
        o.errorHandler = ec.fn
1✔
322
}
1✔
323
func (ec errorCallback) setSetProjectionOpt(o *setProjectionOpts) {
2✔
324
        o.errorHandler = ec.fn
2✔
325
}
2✔
326
func (ec errorCallback) setSetNoDataOpt(ndo *setNodataOpts) {
3✔
327
        ndo.errorHandler = ec.fn
3✔
328
}
3✔
329
func (ec errorCallback) setSetScaleOffsetOpt(soo *setScaleOffsetOpts) {
2✔
330
        soo.errorHandler = ec.fn
2✔
331
}
2✔
332
func (ec errorCallback) setSetSpatialRefOpt(ndo *setSpatialRefOpts) {
2✔
333
        ndo.errorHandler = ec.fn
2✔
334
}
2✔
335
func (ec errorCallback) setSieveFilterOpt(sfo *sieveFilterOpts) {
1✔
336
        sfo.errorHandler = ec.fn
1✔
337
}
1✔
338
func (ec errorCallback) setSimplifyOpt(o *simplifyOpts) {
1✔
339
        o.errorHandler = ec.fn
1✔
340
}
1✔
341
func (ec errorCallback) setSpatialRefValidateOpt(o *spatialRefValidateOpts) {
1✔
342
        o.errorHandler = ec.fn
1✔
343
}
1✔
344
func (ec errorCallback) setSubGeometryOpt(so *subGeometryOpts) {
1✔
345
        so.errorHandler = ec.fn
1✔
346
}
1✔
347
func (ec errorCallback) setTransformOpt(o *trnOpts) {
1✔
348
        o.errorHandler = ec.fn
1✔
349
}
1✔
350
func (ec errorCallback) setUnionOpt(uo *unionOpts) {
1✔
351
        uo.errorHandler = ec.fn
1✔
352
}
1✔
353
func (ec errorCallback) setUpdateFeatureOpt(o *updateFeatureOpts) {
4✔
354
        o.errorHandler = ec.fn
4✔
355
}
4✔
356
func (ec errorCallback) setVSIHandlerOpt(o *vsiHandlerOpts) {
1✔
357
        o.errorHandler = ec.fn
1✔
358
}
1✔
359
func (ec errorCallback) setVSIOpenOpt(o *vsiOpenOpts) {
2✔
360
        o.errorHandler = ec.fn
2✔
361
}
2✔
362
func (ec errorCallback) setVSIUnlinkOpt(o *vsiUnlinkOpts) {
1✔
363
        o.errorHandler = ec.fn
1✔
364
}
1✔
365
func (ec errorCallback) setWKTExportOpt(o *srWKTOpts) {
1✔
366
        o.errorHandler = ec.fn
1✔
367
}
1✔
368

369
func (ec errorCallback) setStatisticsOpt(o *statisticsOpts) {
1✔
370
        o.errorHandler = ec.fn
1✔
371
}
1✔
372

373
func (ec errorCallback) setSetStatisticsOpt(o *setStatisticsOpt) {
1✔
374
        o.errorHandler = ec.fn
1✔
375
}
1✔
376

377
func (ec errorCallback) setClearStatisticsOpt(o *clearStatisticsOpt) {
1✔
378
        o.errorHandler = ec.fn
1✔
379
}
1✔
UNCOV
380
func (ec errorCallback) setGridCreateOpt(o *gridCreateOpts) {
×
381
        o.errorHandler = ec.fn
×
382
}
×
383
func (ec errorCallback) setGridOpt(o *gridOpts) {
1✔
384
        o.errorHandler = ec.fn
1✔
385
}
1✔
386
func (ec errorCallback) setNearblackOpt(o *nearBlackOpts) {
3✔
387
        o.errorHandler = ec.fn
3✔
388
}
3✔
389
func (ec errorCallback) setDemOpt(o *demOpts) {
1✔
390
        o.errorHandler = ec.fn
1✔
391
}
1✔
392
func (ec errorCallback) setViewshedOpt(o *viewshedOpts) {
2✔
393
        o.errorHandler = ec.fn
2✔
394
}
2✔
395
func (ec errorCallback) setSetGCPsOpt(o *setGCPsOpts) {
2✔
396
        o.errorHandler = ec.fn
2✔
397
}
2✔
398
func (ec errorCallback) setGCPsToGeoTransformOpts(o *gcpsToGeoTransformOpts) {
2✔
399
        o.errorHandler = ec.fn
2✔
400
}
2✔
401
func (ec errorCallback) setRegisterPluginOpt(o *registerPluginOpts) {
1✔
402
        o.errorHandler = ec.fn
1✔
403
}
1✔
404

405
func (ec errorCallback) setExecuteSQLOpt(o *executeSQLOpts) {
7✔
406
        o.errorHandler = ec.fn
7✔
407
}
7✔
408

409
func (ec errorCallback) setReleaseResultSetOpt(o *closeResultSetOpts) {
5✔
410
        o.errorHandler = ec.fn
5✔
411
}
5✔
412

413
func (ec errorCallback) setStartTransactionOpt(o *startTransactionOpts) {
4✔
414
        o.errorHandler = ec.fn
4✔
415
}
4✔
416

417
func (ec errorCallback) setRollbackTransactionOpt(o *rollbackTransactionOpts) {
2✔
418
        o.errorHandler = ec.fn
2✔
419
}
2✔
420

421
func (ec errorCallback) setCommitTransactionOpt(o *commitTransactionOpts) {
2✔
422
        o.errorHandler = ec.fn
2✔
423
}
2✔
424

425
type multiError struct {
426
        errs []error
427
}
428

429
// Error is the standard error interface
430
func (me *multiError) Error() string {
1✔
431
        w := bytes.NewBufferString(me.errs[0].Error())
1✔
432
        for i := 1; i < len(me.errs); i++ {
2✔
433
                w.WriteByte('\n')
1✔
434
                w.WriteString(me.errs[i].Error())
1✔
435
        }
1✔
436
        return w.String()
1✔
437
}
438

439
// As is the standard error wrapping interface
440
func (me *multiError) As(target interface{}) bool {
3✔
441
        for _, err := range me.errs {
8✔
442
                if errors.As(err, target) {
7✔
443
                        return true
2✔
444
                }
2✔
445
        }
446
        return false
1✔
447
}
448

449
// Is is the standard error wrapping interface
450
func (me *multiError) Is(target error) bool {
12✔
451
        for _, err := range me.errs {
36✔
452
                if errors.Is(err, target) {
35✔
453
                        return true
11✔
454
                }
11✔
455
        }
456
        return false
1✔
457
}
458

459
func combine(e1, e2 error) error {
85✔
460
        switch {
85✔
461
        case e1 == nil:
74✔
462
                return e2
74✔
463
        case e2 == nil:
1✔
464
                return e1
1✔
465
        }
466
        if me1, ok := e1.(*multiError); ok {
12✔
467
                if me2, ok := e2.(*multiError); ok {
3✔
468
                        me1.errs = append(me1.errs, me2.errs...)
1✔
469
                } else {
2✔
470
                        me1.errs = append(me1.errs, e2)
1✔
471
                }
1✔
472
                return me1
2✔
473
        } else if me2, ok := e2.(*multiError); ok {
9✔
474
                me := &multiError{}
1✔
475
                me.errs = make([]error, 1, len(me2.errs)+1)
1✔
476
                me.errs[0] = e1
1✔
477
                me.errs = append(me.errs, me2.errs...)
1✔
478
                return me
1✔
479
        } else {
8✔
480
                return &multiError{errs: []error{e1, e2}}
7✔
481
        }
7✔
482
}
483

484
var SkipWarnings = ErrLogger(
485
        func(ec ErrorCategory, code int, message string) error {
2✔
486
                if ec > CE_Warning {
3✔
487
                        return errors.New(message)
1✔
488
                }
1✔
489
                return nil
1✔
490
        })
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc