mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[experiment] add alternative wasm sqlite3 implementation available via build-tag (#2863)
This allows for building GoToSocial with [SQLite transpiled to WASM](https://github.com/ncruces/go-sqlite3) and accessed through [Wazero](https://wazero.io/).
This commit is contained in:
105
vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go
generated
vendored
Normal file
105
vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go
generated
vendored
Normal file
@ -0,0 +1,105 @@
|
||||
package sysfs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"path"
|
||||
|
||||
experimentalsys "github.com/tetratelabs/wazero/experimental/sys"
|
||||
"github.com/tetratelabs/wazero/sys"
|
||||
)
|
||||
|
||||
type AdaptFS struct {
|
||||
FS fs.FS
|
||||
}
|
||||
|
||||
// String implements fmt.Stringer
|
||||
func (a *AdaptFS) String() string {
|
||||
return fmt.Sprintf("%v", a.FS)
|
||||
}
|
||||
|
||||
// OpenFile implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) {
|
||||
return OpenFSFile(a.FS, cleanPath(path), flag, perm)
|
||||
}
|
||||
|
||||
// Lstat implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) {
|
||||
// At this time, we make the assumption sys.FS instances do not support
|
||||
// symbolic links, therefore Lstat is the same as Stat. This is obviously
|
||||
// not true, but until FS.FS has a solid story for how to handle symlinks,
|
||||
// we are better off not making a decision that would be difficult to
|
||||
// revert later on.
|
||||
//
|
||||
// For further discussions on the topic, see:
|
||||
// https://github.com/golang/go/issues/49580
|
||||
return a.Stat(path)
|
||||
}
|
||||
|
||||
// Stat implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) {
|
||||
f, errno := a.OpenFile(path, experimentalsys.O_RDONLY, 0)
|
||||
if errno != 0 {
|
||||
return sys.Stat_t{}, errno
|
||||
}
|
||||
defer f.Close()
|
||||
return f.Stat()
|
||||
}
|
||||
|
||||
// Readlink implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Readlink(string) (string, experimentalsys.Errno) {
|
||||
return "", experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Mkdir implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Mkdir(string, fs.FileMode) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Chmod implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Chmod(string, fs.FileMode) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Rename implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Rename(string, string) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Rmdir implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Rmdir(string) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Link implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Link(string, string) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Symlink implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Symlink(string, string) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Unlink implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Unlink(string) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
// Utimens implements the same method as documented on sys.FS
|
||||
func (a *AdaptFS) Utimens(string, int64, int64) experimentalsys.Errno {
|
||||
return experimentalsys.ENOSYS
|
||||
}
|
||||
|
||||
func cleanPath(name string) string {
|
||||
if len(name) == 0 {
|
||||
return name
|
||||
}
|
||||
// fs.ValidFile cannot be rooted (start with '/')
|
||||
cleaned := name
|
||||
if name[0] == '/' {
|
||||
cleaned = name[1:]
|
||||
}
|
||||
cleaned = path.Clean(cleaned) // e.g. "sub/." -> "sub"
|
||||
return cleaned
|
||||
}
|
Reference in New Issue
Block a user