package vfs
import (
"context"
"net/url"
"github.com/tetratelabs/wazero/api"
"github.com/ncruces/go-sqlite3/internal/util"
)
type Filename struct {
ctx context .Context
mod api .Module
zPath ptr_t
flags OpenFlag
stack [2 ]stk_t
}
func GetFilename (ctx context .Context , mod api .Module , id ptr_t , flags OpenFlag ) *Filename {
if id == 0 {
return nil
}
return &Filename {
ctx : ctx ,
mod : mod ,
zPath : id ,
flags : flags ,
}
}
func (n *Filename ) String () string {
if n == nil || n .zPath == 0 {
return ""
}
return util .ReadString (n .mod , n .zPath , _MAX_PATHNAME )
}
func (n *Filename ) Database () string {
return n .path ("sqlite3_filename_database" )
}
func (n *Filename ) Journal () string {
return n .path ("sqlite3_filename_journal" )
}
func (n *Filename ) WAL () string {
return n .path ("sqlite3_filename_wal" )
}
func (n *Filename ) path (method string ) string {
if n == nil || n .zPath == 0 {
return ""
}
if n .flags &(OPEN_MAIN_DB |OPEN_MAIN_JOURNAL |OPEN_WAL ) == 0 {
return ""
}
n .stack [0 ] = stk_t (n .zPath )
fn := n .mod .ExportedFunction (method )
if err := fn .CallWithStack (n .ctx , n .stack [:]); err != nil {
panic (err )
}
return util .ReadString (n .mod , ptr_t (n .stack [0 ]), _MAX_PATHNAME )
}
func (n *Filename ) DatabaseFile () File {
if n == nil || n .zPath == 0 {
return nil
}
if n .flags &(OPEN_MAIN_DB |OPEN_MAIN_JOURNAL |OPEN_WAL ) == 0 {
return nil
}
n .stack [0 ] = stk_t (n .zPath )
fn := n .mod .ExportedFunction ("sqlite3_database_file_object" )
if err := fn .CallWithStack (n .ctx , n .stack [:]); err != nil {
panic (err )
}
file , _ := vfsFileGet (n .ctx , n .mod , ptr_t (n .stack [0 ])).(File )
return file
}
func (n *Filename ) URIParameter (key string ) string {
if n == nil || n .zPath == 0 {
return ""
}
uriKey := n .mod .ExportedFunction ("sqlite3_uri_key" )
n .stack [0 ] = stk_t (n .zPath )
n .stack [1 ] = stk_t (0 )
if err := uriKey .CallWithStack (n .ctx , n .stack [:]); err != nil {
panic (err )
}
ptr := ptr_t (n .stack [0 ])
if ptr == 0 {
return ""
}
for {
k := util .ReadString (n .mod , ptr , _MAX_NAME )
if k == "" {
return ""
}
ptr += ptr_t (len (k )) + 1
v := util .ReadString (n .mod , ptr , _MAX_NAME )
if k == key {
return v
}
ptr += ptr_t (len (v )) + 1
}
}
func (n *Filename ) URIParameters () url .Values {
if n == nil || n .zPath == 0 {
return nil
}
uriKey := n .mod .ExportedFunction ("sqlite3_uri_key" )
n .stack [0 ] = stk_t (n .zPath )
n .stack [1 ] = stk_t (0 )
if err := uriKey .CallWithStack (n .ctx , n .stack [:]); err != nil {
panic (err )
}
ptr := ptr_t (n .stack [0 ])
if ptr == 0 {
return nil
}
var params url .Values
for {
k := util .ReadString (n .mod , ptr , _MAX_NAME )
if k == "" {
return params
}
ptr += ptr_t (len (k )) + 1
v := util .ReadString (n .mod , ptr , _MAX_NAME )
if params == nil {
params = url .Values {}
}
params .Add (k , v )
ptr += ptr_t (len (v )) + 1
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .