package sqlite3
import (
"time"
"github.com/ncruces/go-sqlite3/internal/errutil"
)
type Value struct {
c *Conn
handle ptr_t
}
func (v Value ) Dup () *Value {
ptr := ptr_t (v .c .wrp .Xsqlite3_value_dup (int32 (v .handle )))
return &Value {
c : v .c ,
handle : ptr ,
}
}
func (v *Value ) Close () error {
v .c .wrp .Xsqlite3_value_free (int32 (v .handle ))
v .handle = 0
return nil
}
func (v Value ) Type () Datatype {
return Datatype (v .c .wrp .Xsqlite3_value_type (int32 (v .handle )))
}
func (v Value ) Subtype () uint {
return uint (uint32 (v .c .wrp .Xsqlite3_value_subtype (int32 (v .handle ))))
}
func (v Value ) NumericType () Datatype {
return Datatype (v .c .wrp .Xsqlite3_value_numeric_type (int32 (v .handle )))
}
func (v Value ) Bool () bool {
return v .Float () != 0
}
func (v Value ) Int () int {
return int (v .Int64 ())
}
func (v Value ) Int64 () int64 {
return v .c .wrp .Xsqlite3_value_int64 (int32 (v .handle ))
}
func (v Value ) Float () float64 {
return v .c .wrp .Xsqlite3_value_double (int32 (v .handle ))
}
func (v Value ) Time (format TimeFormat ) time .Time {
var a any
switch v .Type () {
case INTEGER :
a = v .Int64 ()
case FLOAT :
a = v .Float ()
case TEXT , BLOB :
a = v .Text ()
case NULL :
return time .Time {}
default :
panic (errutil .AssertErr ())
}
t , _ := format .Decode (a )
return t
}
func (v Value ) Text () string {
return string (v .RawText ())
}
func (v Value ) Blob (buf []byte ) []byte {
return append (buf , v .RawBlob ()...)
}
func (v Value ) RawText () []byte {
ptr := ptr_t (v .c .wrp .Xsqlite3_value_text (int32 (v .handle )))
return v .rawBytes (ptr , 1 )
}
func (v Value ) RawBlob () []byte {
ptr := ptr_t (v .c .wrp .Xsqlite3_value_blob (int32 (v .handle )))
return v .rawBytes (ptr , 0 )
}
func (v Value ) rawBytes (ptr ptr_t , nul int32 ) []byte {
if ptr == 0 {
return nil
}
n := int32 (v .c .wrp .Xsqlite3_value_bytes (int32 (v .handle )))
return v .c .wrp .Bytes (ptr , int64 (n +nul ))[:n ]
}
func (v Value ) Pointer () any {
ptr := ptr_t (v .c .wrp .Xsqlite3_value_pointer_go (int32 (v .handle )))
return v .c .wrp .GetHandle (ptr )
}
func (v Value ) NoChange () bool {
b := int32 (v .c .wrp .Xsqlite3_value_nochange (int32 (v .handle )))
return b != 0
}
func (v Value ) FromBind () bool {
b := int32 (v .c .wrp .Xsqlite3_value_frombind (int32 (v .handle )))
return b != 0
}
func (v Value ) InFirst () (Value , error ) {
defer v .c .arena .Mark ()()
valPtr := v .c .arena .New (ptrlen )
rc := res_t (v .c .wrp .Xsqlite3_vtab_in_first (int32 (v .handle ), int32 (valPtr )))
if err := v .c .error (rc ); err != nil {
return Value {}, err
}
return Value {
c : v .c ,
handle : ptr_t (v .c .wrp .Read32 (valPtr )),
}, nil
}
func (v Value ) InNext () (Value , error ) {
defer v .c .arena .Mark ()()
valPtr := v .c .arena .New (ptrlen )
rc := res_t (v .c .wrp .Xsqlite3_vtab_in_next (int32 (v .handle ), int32 (valPtr )))
if err := v .c .error (rc ); err != nil {
return Value {}, err
}
return Value {
c : v .c ,
handle : ptr_t (v .c .wrp .Read32 (valPtr )),
}, nil
}
The pages are generated with Golds v0.8.4 . (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 .