Text as byte slices.

This commit is contained in:
Nuno Cruces
2023-11-10 13:42:11 +00:00
parent aa02c14430
commit 90628ab8aa
4 changed files with 31 additions and 16 deletions

View File

@@ -89,6 +89,16 @@ func (ctx Context) ResultText(value string) {
uint64(ctx.c.api.destructor), _UTF8) uint64(ctx.c.api.destructor), _UTF8)
} }
// ResultRawText sets the text result of the function to a []byte.
//
// https://sqlite.org/c3ref/result_blob.html
func (ctx Context) ResultRawText(value []byte) {
ptr := ctx.c.newBytes(value)
ctx.c.call(ctx.c.api.resultText,
uint64(ctx.handle), uint64(ptr), uint64(len(value)),
uint64(ctx.c.api.destructor), _UTF8)
}
// ResultBlob sets the result of the function to a []byte. // ResultBlob sets the result of the function to a []byte.
// Returning a nil slice is the same as calling [Context.ResultNull]. // Returning a nil slice is the same as calling [Context.ResultNull].
// //
@@ -100,7 +110,7 @@ func (ctx Context) ResultBlob(value []byte) {
uint64(ctx.c.api.destructor)) uint64(ctx.c.api.destructor))
} }
// BindZeroBlob sets the result of the function to a zero-filled, length n BLOB. // ResultZeroBlob sets the result of the function to a zero-filled, length n BLOB.
// //
// https://sqlite.org/c3ref/result_blob.html // https://sqlite.org/c3ref/result_blob.html
func (ctx Context) ResultZeroBlob(n int64) { func (ctx Context) ResultZeroBlob(n int64) {
@@ -166,10 +176,7 @@ func (ctx Context) ResultJSON(value any) {
if err != nil { if err != nil {
ctx.ResultError(err) ctx.ResultError(err)
} }
ptr := ctx.c.newBytes(data) ctx.ResultRawText(data)
ctx.c.call(ctx.c.api.resultText,
uint64(ctx.handle), uint64(ptr), uint64(len(data)),
uint64(ctx.c.api.destructor))
} }
// ResultValue sets the result of the function a copy of [Value]. // ResultValue sets the result of the function a copy of [Value].

View File

@@ -66,7 +66,7 @@ func RegisterCollation(db *sqlite3.Conn, locale, name string) error {
func upper(ctx sqlite3.Context, arg ...sqlite3.Value) { func upper(ctx sqlite3.Context, arg ...sqlite3.Value) {
if len(arg) == 1 { if len(arg) == 1 {
ctx.ResultBlob(bytes.ToUpper(arg[0].RawBlob())) ctx.ResultRawText(bytes.ToUpper(arg[0].RawText()))
return return
} }
cs, ok := ctx.GetAuxData(1).(cases.Caser) cs, ok := ctx.GetAuxData(1).(cases.Caser)
@@ -80,12 +80,12 @@ func upper(ctx sqlite3.Context, arg ...sqlite3.Value) {
ctx.SetAuxData(1, c) ctx.SetAuxData(1, c)
cs = c cs = c
} }
ctx.ResultBlob(cs.Bytes(arg[0].RawBlob())) ctx.ResultRawText(cs.Bytes(arg[0].RawText()))
} }
func lower(ctx sqlite3.Context, arg ...sqlite3.Value) { func lower(ctx sqlite3.Context, arg ...sqlite3.Value) {
if len(arg) == 1 { if len(arg) == 1 {
ctx.ResultBlob(bytes.ToLower(arg[0].RawBlob())) ctx.ResultRawText(bytes.ToLower(arg[0].RawText()))
return return
} }
cs, ok := ctx.GetAuxData(1).(cases.Caser) cs, ok := ctx.GetAuxData(1).(cases.Caser)
@@ -99,7 +99,7 @@ func lower(ctx sqlite3.Context, arg ...sqlite3.Value) {
ctx.SetAuxData(1, c) ctx.SetAuxData(1, c)
cs = c cs = c
} }
ctx.ResultBlob(cs.Bytes(arg[0].RawBlob())) ctx.ResultRawText(cs.Bytes(arg[0].RawText()))
} }
func regex(ctx sqlite3.Context, arg ...sqlite3.Value) { func regex(ctx sqlite3.Context, arg ...sqlite3.Value) {

View File

@@ -74,7 +74,7 @@ func ExampleConn_CreateFunction() {
} }
err = db.CreateFunction("upper", 1, sqlite3.DETERMINISTIC|sqlite3.INNOCUOUS, func(ctx sqlite3.Context, arg ...sqlite3.Value) { err = db.CreateFunction("upper", 1, sqlite3.DETERMINISTIC|sqlite3.INNOCUOUS, func(ctx sqlite3.Context, arg ...sqlite3.Value) {
ctx.ResultBlob(bytes.ToUpper(arg[0].RawBlob())) ctx.ResultRawText(bytes.ToUpper(arg[0].RawText()))
}) })
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

20
stmt.go
View File

@@ -181,6 +181,19 @@ func (s *Stmt) BindText(param int, value string) error {
return s.c.error(r) return s.c.error(r)
} }
// BindRawText binds a []byte to the prepared statement as text.
// The leftmost SQL parameter has an index of 1.
//
// https://sqlite.org/c3ref/bind_blob.html
func (s *Stmt) BindRawText(param int, value []byte) error {
ptr := s.c.newBytes(value)
r := s.c.call(s.c.api.bindText,
uint64(s.handle), uint64(param),
uint64(ptr), uint64(len(value)),
uint64(s.c.api.destructor), _UTF8)
return s.c.error(r)
}
// BindBlob binds a []byte to the prepared statement. // BindBlob binds a []byte to the prepared statement.
// The leftmost SQL parameter has an index of 1. // The leftmost SQL parameter has an index of 1.
// Binding a nil slice is the same as calling [Stmt.BindNull]. // Binding a nil slice is the same as calling [Stmt.BindNull].
@@ -271,12 +284,7 @@ func (s *Stmt) BindJSON(param int, value any) error {
if err != nil { if err != nil {
return err return err
} }
ptr := s.c.newBytes(data) return s.BindRawText(param, data)
r := s.c.call(s.c.api.bindText,
uint64(s.handle), uint64(param),
uint64(ptr), uint64(len(data)),
uint64(s.c.api.destructor), _UTF8)
return s.c.error(r)
} }
// ColumnCount returns the number of columns in a result set. // ColumnCount returns the number of columns in a result set.