github.com/PDOK/gokoala@v0.50.6/internal/ogc/features/datasources/geopackage/backend_local.go (about) 1 package geopackage 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/PDOK/gokoala/config" 9 "github.com/PDOK/gokoala/internal/engine" 10 "github.com/jmoiron/sqlx" 11 ) 12 13 // GeoPackage on local disk 14 type localGeoPackage struct { 15 db *sqlx.DB 16 } 17 18 func newLocalGeoPackage(gpkg *config.GeoPackageLocal) geoPackageBackend { 19 if gpkg.Download != nil { 20 downloadGeoPackage(gpkg) 21 } 22 conn := fmt.Sprintf("file:%s?mode=ro&_cache_size=%d", gpkg.File, gpkg.InMemoryCacheSize) 23 db, err := sqlx.Open(sqliteDriverName, conn) 24 if err != nil { 25 log.Fatalf("failed to open GeoPackage: %v", err) 26 } 27 log.Printf("connected to local GeoPackage: %s", gpkg.File) 28 29 return &localGeoPackage{db} 30 } 31 32 func downloadGeoPackage(gpkg *config.GeoPackageLocal) { 33 url := *gpkg.Download.From.URL 34 log.Printf("start download of GeoPackage: %s", url.String()) 35 downloadTime, err := engine.Download(url, gpkg.File, gpkg.Download.Parallelism, gpkg.Download.TLSSkipVerify, 36 gpkg.Download.Timeout.Duration, gpkg.Download.RetryDelay.Duration, gpkg.Download.RetryMaxDelay.Duration, gpkg.Download.MaxRetries) 37 if err != nil { 38 log.Fatalf("failed to download GeoPackage: %v", err) 39 } 40 log.Printf("succesfully downloaded GeoPackage to %s in %s", gpkg.File, downloadTime.Round(time.Second)) 41 } 42 43 func (g *localGeoPackage) getDB() *sqlx.DB { 44 return g.db 45 } 46 47 func (g *localGeoPackage) close() { 48 err := g.db.Close() 49 if err != nil { 50 log.Printf("failed to close GeoPackage: %v", err) 51 } 52 }