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  }