github.com/ncruces/go-sqlite3@v0.15.1-0.20240520133447-53eef1510ff0/vfs/registry.go (about)

     1  package vfs
     2  
     3  import "sync"
     4  
     5  var (
     6  	// +checklocks:vfsRegistryMtx
     7  	vfsRegistry    map[string]VFS
     8  	vfsRegistryMtx sync.RWMutex
     9  )
    10  
    11  // Find returns a VFS given its name.
    12  // If there is no match, nil is returned.
    13  // If name is empty, the default VFS is returned.
    14  //
    15  // https://sqlite.org/c3ref/vfs_find.html
    16  func Find(name string) VFS {
    17  	if name == "" || name == "os" {
    18  		return vfsOS{}
    19  	}
    20  	vfsRegistryMtx.RLock()
    21  	defer vfsRegistryMtx.RUnlock()
    22  	return vfsRegistry[name]
    23  }
    24  
    25  // Register registers a VFS.
    26  // Empty and "os" are reserved names.
    27  //
    28  // https://sqlite.org/c3ref/vfs_find.html
    29  func Register(name string, vfs VFS) {
    30  	if name == "" || name == "os" {
    31  		return
    32  	}
    33  	vfsRegistryMtx.Lock()
    34  	defer vfsRegistryMtx.Unlock()
    35  	if vfsRegistry == nil {
    36  		vfsRegistry = map[string]VFS{}
    37  	}
    38  	vfsRegistry[name] = vfs
    39  }
    40  
    41  // Unregister unregisters a VFS.
    42  //
    43  // https://sqlite.org/c3ref/vfs_find.html
    44  func Unregister(name string) {
    45  	vfsRegistryMtx.Lock()
    46  	defer vfsRegistryMtx.Unlock()
    47  	delete(vfsRegistry, name)
    48  }