mirror of
https://github.com/syumai/workers.git
synced 2025-03-10 17:29:11 +00:00
Merge pull request #128 from ben-krieger/d1-blob
Support []byte arguments to D1 Query/Exec
This commit is contained in:
commit
f0f5c6ff9e
@ -7,6 +7,8 @@ import (
|
||||
"math"
|
||||
"sync"
|
||||
"syscall/js"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
type rows struct {
|
||||
@ -61,9 +63,14 @@ func convertRowColumnValueToAny(v js.Value) (driver.Value, error) {
|
||||
case js.TypeString:
|
||||
return v.String(), nil
|
||||
case js.TypeObject:
|
||||
// TODO: handle BLOB type (ArrayBuffer).
|
||||
// see: https://developers.cloudflare.com/d1/platform/client-api/#type-conversion
|
||||
return nil, errors.New("d1: row column value type object is not currently supported")
|
||||
// handle BLOB type (ArrayBuffer).
|
||||
src := jsutil.Uint8ArrayClass.New(v)
|
||||
dst := make([]byte, src.Length())
|
||||
n := js.CopyBytesToGo(dst, src)
|
||||
if n != len(dst) {
|
||||
return nil, errors.New("incomplete copy from Uint8Array")
|
||||
}
|
||||
return dst[:n], nil
|
||||
}
|
||||
return nil, errors.New("d1: unexpected row column value type")
|
||||
}
|
||||
|
@ -34,12 +34,20 @@ func (s *stmt) Exec([]driver.Value) (driver.Result, error) {
|
||||
}
|
||||
|
||||
// ExecContext executes prepared statement.
|
||||
// Given []drier.NamedValue's `Name` field will be ignored because Cloudflare D1 client doesn't support it.
|
||||
// Given []driver.NamedValue's `Name` field will be ignored because Cloudflare D1 client doesn't support it.
|
||||
func (s *stmt) ExecContext(_ context.Context, args []driver.NamedValue) (driver.Result, error) {
|
||||
argValues := make([]any, len(args))
|
||||
for i, arg := range args {
|
||||
if src, ok := arg.Value.([]byte); ok {
|
||||
dst := jsutil.Uint8ArrayClass.New(len(src))
|
||||
if n := js.CopyBytesToJS(dst, src); n != len(src) {
|
||||
return nil, errors.New("incomplete copy into Uint8Array")
|
||||
}
|
||||
argValues[i] = dst
|
||||
} else {
|
||||
argValues[i] = arg.Value
|
||||
}
|
||||
}
|
||||
resultPromise := s.stmtObj.Call("bind", argValues...).Call("run")
|
||||
resultObj, err := jsutil.AwaitPromise(resultPromise)
|
||||
if err != nil {
|
||||
@ -57,8 +65,16 @@ func (s *stmt) Query([]driver.Value) (driver.Rows, error) {
|
||||
func (s *stmt) QueryContext(_ context.Context, args []driver.NamedValue) (driver.Rows, error) {
|
||||
argValues := make([]any, len(args))
|
||||
for i, arg := range args {
|
||||
if src, ok := arg.Value.([]byte); ok {
|
||||
dst := jsutil.Uint8ArrayClass.New(len(src))
|
||||
if n := js.CopyBytesToJS(dst, src); n != len(src) {
|
||||
return nil, errors.New("incomplete copy into Uint8Array")
|
||||
}
|
||||
argValues[i] = dst
|
||||
} else {
|
||||
argValues[i] = arg.Value
|
||||
}
|
||||
}
|
||||
resultPromise := s.stmtObj.Call("bind", argValues...).Call("raw", map[string]any{"columnNames": true})
|
||||
rowsArray, err := jsutil.AwaitPromise(resultPromise)
|
||||
if err != nil {
|
||||
|
Loading…
x
Reference in New Issue
Block a user