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 }