mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-12 14:09:13 +00:00
47 lines
964 B
Go
47 lines
964 B
Go
package sqlite3
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strconv"
|
|
"time"
|
|
"unsafe"
|
|
|
|
"github.com/ncruces/go-sqlite3/internal/util"
|
|
)
|
|
|
|
// JSON returns a value that can be used as an argument to
|
|
// [database/sql.DB.Exec], [database/sql.Row.Scan] and similar methods to
|
|
// store value as JSON, or decode JSON into value.
|
|
func JSON(value any) any {
|
|
return jsonValue{value}
|
|
}
|
|
|
|
type jsonValue struct{ any }
|
|
|
|
func (j jsonValue) JSON() any { return j.any }
|
|
|
|
func (j jsonValue) Scan(value any) error {
|
|
var buf []byte
|
|
|
|
switch v := value.(type) {
|
|
case []byte:
|
|
buf = v
|
|
case string:
|
|
buf = unsafe.Slice(unsafe.StringData(v), len(v))
|
|
case int64:
|
|
buf = strconv.AppendInt(nil, v, 10)
|
|
case float64:
|
|
buf = strconv.AppendFloat(nil, v, 'g', -1, 64)
|
|
case time.Time:
|
|
buf = append(buf, '"')
|
|
buf = v.AppendFormat(buf, time.RFC3339Nano)
|
|
buf = append(buf, '"')
|
|
case nil:
|
|
buf = append(buf, "null"...)
|
|
default:
|
|
panic(util.AssertErr())
|
|
}
|
|
|
|
return json.Unmarshal(buf, j.any)
|
|
}
|