github.com/PDOK/gokoala@v0.50.6/internal/ogc/features/datasources/geopackage/backend_cloud.go (about)

     1  //go:build cgo && !darwin && !windows
     2  
     3  package geopackage
     4  
     5  import (
     6  	"fmt"
     7  	"log"
     8  
     9  	"github.com/PDOK/gokoala/config"
    10  	"github.com/google/uuid"
    11  
    12  	cloudsqlitevfs "github.com/PDOK/go-cloud-sqlite-vfs"
    13  	"github.com/jmoiron/sqlx"
    14  )
    15  
    16  // Cloud-Backed SQLite (CBS) GeoPackage in Azure or Google object storage
    17  type cloudGeoPackage struct {
    18  	db       *sqlx.DB
    19  	cloudVFS *cloudsqlitevfs.VFS
    20  }
    21  
    22  func newCloudBackedGeoPackage(gpkg *config.GeoPackageCloud) geoPackageBackend {
    23  	cacheDir, err := gpkg.CacheDir()
    24  	if err != nil {
    25  		log.Fatalf("invalid cache dir, error: %v", err)
    26  	}
    27  	cacheSize, err := gpkg.Cache.MaxSizeAsBytes()
    28  	if err != nil {
    29  		log.Fatalf("invalid cache size provided, error: %v", err)
    30  	}
    31  
    32  	msg := fmt.Sprintf("Cloud-Backed GeoPackage '%s' in container '%s' on '%s'",
    33  		gpkg.File, gpkg.Container, gpkg.Connection)
    34  
    35  	log.Printf("connecting to %s\n", msg)
    36  	vfsName := uuid.New().String() // important: each geopackage must use a unique VFS name
    37  	vfs, err := cloudsqlitevfs.NewVFS(vfsName, gpkg.Connection, gpkg.User, gpkg.Auth,
    38  		gpkg.Container, cacheDir, cacheSize, gpkg.LogHTTPRequests)
    39  	if err != nil {
    40  		log.Fatalf("failed to connect with %s, error: %v", msg, err)
    41  	}
    42  	log.Printf("connected to %s\n", msg)
    43  
    44  	conn := fmt.Sprintf("/%s/%s?vfs=%s&mode=ro&_cache_size=%d", gpkg.Container, gpkg.File, vfsName, gpkg.InMemoryCacheSize)
    45  	db, err := sqlx.Open(sqliteDriverName, conn)
    46  	if err != nil {
    47  		log.Fatalf("failed to open %s, error: %v", msg, err)
    48  	}
    49  
    50  	return &cloudGeoPackage{db, &vfs}
    51  }
    52  
    53  func (g *cloudGeoPackage) getDB() *sqlx.DB {
    54  	return g.db
    55  }
    56  
    57  func (g *cloudGeoPackage) close() {
    58  	err := g.db.Close()
    59  	if err != nil {
    60  		log.Printf("failed to close GeoPackage: %v", err)
    61  	}
    62  	if g.cloudVFS != nil {
    63  		err = g.cloudVFS.Close()
    64  		if err != nil {
    65  			log.Printf("failed to close Cloud-Backed GeoPackage: %v", err)
    66  		}
    67  	}
    68  }