mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
update go-sqlite3 => v0.20.0 (#3483)
This commit is contained in:
9
vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md
generated
vendored
Normal file
9
vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
# SQLite utility functions
|
||||
|
||||
This package implements assorted SQLite utilities
|
||||
useful to extension writers.
|
||||
|
||||
It also wraps a [parser](https://github.com/marcobambini/sqlite-createtable-parser)
|
||||
for the [`CREATE`](https://sqlite.org/lang_createtable.html) and
|
||||
[`ALTER TABLE`](https://sqlite.org/lang_altertable.html) commands,
|
||||
created by [Marco Bambini](https://github.com/marcobambini).
|
65
vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go
generated
vendored
Normal file
65
vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go
generated
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
package sql3util
|
||||
|
||||
import "strings"
|
||||
|
||||
// NamedArg splits an named arg into a key and value,
|
||||
// around an equals sign.
|
||||
// Spaces are trimmed around both key and value.
|
||||
func NamedArg(arg string) (key, val string) {
|
||||
key, val, _ = strings.Cut(arg, "=")
|
||||
key = strings.TrimSpace(key)
|
||||
val = strings.TrimSpace(val)
|
||||
return
|
||||
}
|
||||
|
||||
// Unquote unquotes a string.
|
||||
//
|
||||
// https://sqlite.org/lang_keywords.html
|
||||
func Unquote(val string) string {
|
||||
if len(val) < 2 {
|
||||
return val
|
||||
}
|
||||
fst := val[0]
|
||||
lst := val[len(val)-1]
|
||||
rst := val[1 : len(val)-1]
|
||||
if fst == '[' && lst == ']' {
|
||||
return rst
|
||||
}
|
||||
if fst != lst {
|
||||
return val
|
||||
}
|
||||
var old, new string
|
||||
switch fst {
|
||||
default:
|
||||
return val
|
||||
case '`':
|
||||
old, new = "``", "`"
|
||||
case '"':
|
||||
old, new = `""`, `"`
|
||||
case '\'':
|
||||
old, new = `''`, `'`
|
||||
}
|
||||
return strings.ReplaceAll(rst, old, new)
|
||||
}
|
||||
|
||||
// ParseBool parses a boolean.
|
||||
//
|
||||
// https://sqlite.org/pragma.html#syntax
|
||||
func ParseBool(s string) (b, ok bool) {
|
||||
if len(s) == 0 {
|
||||
return false, false
|
||||
}
|
||||
if s[0] == '0' {
|
||||
return false, true
|
||||
}
|
||||
if '1' <= s[0] && s[0] <= '9' {
|
||||
return true, true
|
||||
}
|
||||
switch strings.ToLower(s) {
|
||||
case "true", "yes", "on":
|
||||
return true, true
|
||||
case "false", "no", "off":
|
||||
return false, true
|
||||
}
|
||||
return false, false
|
||||
}
|
61
vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go
generated
vendored
Normal file
61
vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go
generated
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
package sql3util
|
||||
|
||||
const (
|
||||
_NONE = iota
|
||||
_MEMORY
|
||||
_SYNTAX
|
||||
_UNSUPPORTEDSQL
|
||||
)
|
||||
|
||||
type ConflictClause uint32
|
||||
|
||||
const (
|
||||
CONFLICT_NONE ConflictClause = iota
|
||||
CONFLICT_ROLLBACK
|
||||
CONFLICT_ABORT
|
||||
CONFLICT_FAIL
|
||||
CONFLICT_IGNORE
|
||||
CONFLICT_REPLACE
|
||||
)
|
||||
|
||||
type OrderClause uint32
|
||||
|
||||
const (
|
||||
ORDER_NONE OrderClause = iota
|
||||
ORDER_ASC
|
||||
ORDER_DESC
|
||||
)
|
||||
|
||||
type FKAction uint32
|
||||
|
||||
const (
|
||||
FKACTION_NONE FKAction = iota
|
||||
FKACTION_SETNULL
|
||||
FKACTION_SETDEFAULT
|
||||
FKACTION_CASCADE
|
||||
FKACTION_RESTRICT
|
||||
FKACTION_NOACTION
|
||||
)
|
||||
|
||||
type FKDefType uint32
|
||||
|
||||
const (
|
||||
DEFTYPE_NONE FKDefType = iota
|
||||
DEFTYPE_DEFERRABLE
|
||||
DEFTYPE_DEFERRABLE_INITIALLY_DEFERRED
|
||||
DEFTYPE_DEFERRABLE_INITIALLY_IMMEDIATE
|
||||
DEFTYPE_NOTDEFERRABLE
|
||||
DEFTYPE_NOTDEFERRABLE_INITIALLY_DEFERRED
|
||||
DEFTYPE_NOTDEFERRABLE_INITIALLY_IMMEDIATE
|
||||
)
|
||||
|
||||
type StatementType uint32
|
||||
|
||||
const (
|
||||
CREATE_UNKNOWN StatementType = iota
|
||||
CREATE_TABLE
|
||||
ALTER_RENAME_TABLE
|
||||
ALTER_RENAME_COLUMN
|
||||
ALTER_ADD_COLUMN
|
||||
ALTER_DROP_COLUMN
|
||||
)
|
210
vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go
generated
vendored
Normal file
210
vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go
generated
vendored
Normal file
@ -0,0 +1,210 @@
|
||||
package sql3util
|
||||
|
||||
import (
|
||||
"context"
|
||||
_ "embed"
|
||||
"sync"
|
||||
|
||||
"github.com/tetratelabs/wazero"
|
||||
"github.com/tetratelabs/wazero/api"
|
||||
|
||||
"github.com/ncruces/go-sqlite3/internal/util"
|
||||
)
|
||||
|
||||
const (
|
||||
errp = 4
|
||||
sqlp = 8
|
||||
)
|
||||
|
||||
var (
|
||||
//go:embed parse/sql3parse_table.wasm
|
||||
binary []byte
|
||||
once sync.Once
|
||||
runtime wazero.Runtime
|
||||
compiled wazero.CompiledModule
|
||||
)
|
||||
|
||||
// ParseTable parses a [CREATE] or [ALTER TABLE] command.
|
||||
//
|
||||
// [CREATE]: https://sqlite.org/lang_createtable.html
|
||||
// [ALTER TABLE]: https://sqlite.org/lang_altertable.html
|
||||
func ParseTable(sql string) (_ *Table, err error) {
|
||||
once.Do(func() {
|
||||
ctx := context.Background()
|
||||
cfg := wazero.NewRuntimeConfigInterpreter()
|
||||
runtime = wazero.NewRuntimeWithConfig(ctx, cfg)
|
||||
compiled, err = runtime.CompileModule(ctx, binary)
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
mod, err := runtime.InstantiateModule(ctx, compiled, wazero.NewModuleConfig().WithName(""))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer mod.Close(ctx)
|
||||
|
||||
if buf, ok := mod.Memory().Read(sqlp, uint32(len(sql))); ok {
|
||||
copy(buf, sql)
|
||||
}
|
||||
|
||||
stack := [...]uint64{sqlp, uint64(len(sql)), errp}
|
||||
err = mod.ExportedFunction("sql3parse_table").CallWithStack(ctx, stack[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c, _ := mod.Memory().ReadUint32Le(errp)
|
||||
switch c {
|
||||
case _MEMORY:
|
||||
panic(util.OOMErr)
|
||||
case _SYNTAX:
|
||||
return nil, util.ErrorString("sql3parse: invalid syntax")
|
||||
case _UNSUPPORTEDSQL:
|
||||
return nil, util.ErrorString("sql3parse: unsupported SQL")
|
||||
}
|
||||
|
||||
var tab Table
|
||||
tab.load(mod, uint32(stack[0]), sql)
|
||||
return &tab, nil
|
||||
}
|
||||
|
||||
// Table holds metadata about a table.
|
||||
type Table struct {
|
||||
Name string
|
||||
Schema string
|
||||
Comment string
|
||||
IsTemporary bool
|
||||
IsIfNotExists bool
|
||||
IsWithoutRowID bool
|
||||
IsStrict bool
|
||||
Columns []Column
|
||||
Type StatementType
|
||||
CurrentName string
|
||||
NewName string
|
||||
}
|
||||
|
||||
func (t *Table) load(mod api.Module, ptr uint32, sql string) {
|
||||
t.Name = loadString(mod, ptr+0, sql)
|
||||
t.Schema = loadString(mod, ptr+8, sql)
|
||||
t.Comment = loadString(mod, ptr+16, sql)
|
||||
|
||||
t.IsTemporary = loadBool(mod, ptr+24)
|
||||
t.IsIfNotExists = loadBool(mod, ptr+25)
|
||||
t.IsWithoutRowID = loadBool(mod, ptr+26)
|
||||
t.IsStrict = loadBool(mod, ptr+27)
|
||||
|
||||
t.Columns = loadSlice(mod, ptr+28, func(ptr uint32, res *Column) {
|
||||
p, _ := mod.Memory().ReadUint32Le(ptr)
|
||||
res.load(mod, p, sql)
|
||||
})
|
||||
|
||||
t.Type = loadEnum[StatementType](mod, ptr+44)
|
||||
t.CurrentName = loadString(mod, ptr+48, sql)
|
||||
t.NewName = loadString(mod, ptr+56, sql)
|
||||
}
|
||||
|
||||
// Column holds metadata about a column.
|
||||
type Column struct {
|
||||
Name string
|
||||
Type string
|
||||
Length string
|
||||
ConstraintName string
|
||||
Comment string
|
||||
IsPrimaryKey bool
|
||||
IsAutoIncrement bool
|
||||
IsNotNull bool
|
||||
IsUnique bool
|
||||
PKOrder OrderClause
|
||||
PKConflictClause ConflictClause
|
||||
NotNullConflictClause ConflictClause
|
||||
UniqueConflictClause ConflictClause
|
||||
CheckExpr string
|
||||
DefaultExpr string
|
||||
CollateName string
|
||||
ForeignKeyClause *ForeignKey
|
||||
}
|
||||
|
||||
func (c *Column) load(mod api.Module, ptr uint32, sql string) {
|
||||
c.Name = loadString(mod, ptr+0, sql)
|
||||
c.Type = loadString(mod, ptr+8, sql)
|
||||
c.Length = loadString(mod, ptr+16, sql)
|
||||
c.ConstraintName = loadString(mod, ptr+24, sql)
|
||||
c.Comment = loadString(mod, ptr+32, sql)
|
||||
|
||||
c.IsPrimaryKey = loadBool(mod, ptr+40)
|
||||
c.IsAutoIncrement = loadBool(mod, ptr+41)
|
||||
c.IsNotNull = loadBool(mod, ptr+42)
|
||||
c.IsUnique = loadBool(mod, ptr+43)
|
||||
|
||||
c.PKOrder = loadEnum[OrderClause](mod, ptr+44)
|
||||
c.PKConflictClause = loadEnum[ConflictClause](mod, ptr+48)
|
||||
c.NotNullConflictClause = loadEnum[ConflictClause](mod, ptr+52)
|
||||
c.UniqueConflictClause = loadEnum[ConflictClause](mod, ptr+56)
|
||||
|
||||
c.CheckExpr = loadString(mod, ptr+60, sql)
|
||||
c.DefaultExpr = loadString(mod, ptr+68, sql)
|
||||
c.CollateName = loadString(mod, ptr+76, sql)
|
||||
|
||||
if ptr, _ := mod.Memory().ReadUint32Le(ptr + 84); ptr != 0 {
|
||||
c.ForeignKeyClause = &ForeignKey{}
|
||||
c.ForeignKeyClause.load(mod, ptr, sql)
|
||||
}
|
||||
}
|
||||
|
||||
type ForeignKey struct {
|
||||
Table string
|
||||
Columns []string
|
||||
OnDelete FKAction
|
||||
OnUpdate FKAction
|
||||
Match string
|
||||
Deferrable FKDefType
|
||||
}
|
||||
|
||||
func (f *ForeignKey) load(mod api.Module, ptr uint32, sql string) {
|
||||
f.Table = loadString(mod, ptr+0, sql)
|
||||
|
||||
f.Columns = loadSlice(mod, ptr+8, func(ptr uint32, res *string) {
|
||||
*res = loadString(mod, ptr, sql)
|
||||
})
|
||||
|
||||
f.OnDelete = loadEnum[FKAction](mod, ptr+16)
|
||||
f.OnUpdate = loadEnum[FKAction](mod, ptr+20)
|
||||
f.Match = loadString(mod, ptr+24, sql)
|
||||
f.Deferrable = loadEnum[FKDefType](mod, ptr+32)
|
||||
}
|
||||
|
||||
func loadString(mod api.Module, ptr uint32, sql string) string {
|
||||
off, _ := mod.Memory().ReadUint32Le(ptr + 0)
|
||||
if off == 0 {
|
||||
return ""
|
||||
}
|
||||
len, _ := mod.Memory().ReadUint32Le(ptr + 4)
|
||||
return sql[off-sqlp : off+len-sqlp]
|
||||
}
|
||||
|
||||
func loadSlice[T any](mod api.Module, ptr uint32, fn func(uint32, *T)) []T {
|
||||
ref, _ := mod.Memory().ReadUint32Le(ptr + 4)
|
||||
if ref == 0 {
|
||||
return nil
|
||||
}
|
||||
len, _ := mod.Memory().ReadUint32Le(ptr + 0)
|
||||
res := make([]T, len)
|
||||
for i := range res {
|
||||
fn(ref, &res[i])
|
||||
ref += 4
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func loadEnum[T ~uint32](mod api.Module, ptr uint32) T {
|
||||
val, _ := mod.Memory().ReadUint32Le(ptr)
|
||||
return T(val)
|
||||
}
|
||||
|
||||
func loadBool(mod api.Module, ptr uint32) bool {
|
||||
val, _ := mod.Memory().ReadByte(ptr)
|
||||
return val != 0
|
||||
}
|
BIN
vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse/sql3parse_table.wasm
generated
vendored
Normal file
BIN
vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse/sql3parse_table.wasm
generated
vendored
Normal file
Binary file not shown.
9
vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go
generated
vendored
Normal file
9
vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
// Package sql3util implements SQLite utilities.
|
||||
package sql3util
|
||||
|
||||
// ValidPageSize returns true if s is a valid page size.
|
||||
//
|
||||
// https://sqlite.org/fileformat.html#pages
|
||||
func ValidPageSize(s int) bool {
|
||||
return 512 <= s && s <= 65536 && s&(s-1) == 0
|
||||
}
|
Reference in New Issue
Block a user