mirror of
https://github.com/mainflux/mainflux.git
synced 2025-05-02 22:17:10 +08:00

* Upgrade InfluxDB from 1.x to 2.x Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influx DB configuration updated Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connection to InfluxDBv2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Token cannot be created Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB v2 Consumer Implementation Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * quickfix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb-Writer Unit Tests Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Writer Tests Implemented Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Connection Check Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolving Remarks Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved consumer-test remark Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer-test slow working version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * reader changes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer tests time issue fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Eof warning fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Makefile Fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Readers Initial Setup Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer json fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Bugfix and resolves comments. Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * one test fails Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * solved last page read Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * writers future time problem fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Tests Passes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolve Semaphore Issues Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * UUID comment on consumer tests resolved Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed json time Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed CI error Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved requests Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * removed blank line Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved comment Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * deleted unnecessary string builder Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * initial commit Signed-off-by: aryan <aryangodara03@gmail.com> * change influxdb docker image version. Signed-off-by: aryan <aryangodara03@gmail.com> * go mod and vendor fixing Signed-off-by: aryan <aryangodara03@gmail.com> * Upgrade InfluxDB from 1.x to 2.x Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influx DB configuration updated Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connection to InfluxDBv2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Token cannot be created Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB v2 Consumer Implementation Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * quickfix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb-Writer Unit Tests Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Writer Tests Implemented Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Connection Check Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolving Remarks Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved consumer-test remark Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer-test slow working version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * reader changes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer tests time issue fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Readers Initial Setup Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer json fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Bugfix and resolves comments. Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * one test fails Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * solved last page read Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * writers future time problem fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Tests Passes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolve Semaphore Issues Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * UUID comment on consumer tests resolved Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed json time Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed CI error Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved requests Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * removed blank line Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved comment Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * deleted unnecessary string builder Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * initial commit Signed-off-by: aryan <aryangodara03@gmail.com> * change influxdb docker image version. Signed-off-by: aryan <aryangodara03@gmail.com> * go mod and vendor fixing Signed-off-by: aryan <aryangodara03@gmail.com> * go mod fixing Signed-off-by: aryan <aryangodara03@gmail.com> * make tests pass locally, fix errors Signed-off-by: aryan <aryangodara03@gmail.com> * rem unsused variables/consts Signed-off-by: aryan <aryangodara03@gmail.com> * go mod tidy vendor Signed-off-by: aryan <aryangodara03@gmail.com> * add env var and data types Signed-off-by: aryan <aryangodara03@gmail.com> * update influxdb version to latest (2.3 to 2.12) Signed-off-by: aryan <aryangodara03@gmail.com> * change time precision for message tests Signed-off-by: aryan <aryangodara03@gmail.com> * renamed influxdb2 to influxdata Signed-off-by: aryan <aryangodara03@gmail.com> * address remarks on PR Signed-off-by: aryan <aryangodara03@gmail.com> * update influxbd according to latest mf commit Signed-off-by: aryan <aryangodara03@gmail.com> * temp commit, rem before pushing Signed-off-by: aryan <aryangodara03@gmail.com> * update main files and cassandra-reader messages_tests Signed-off-by: aryan <aryangodara03@gmail.com> * fix name of logger while importing Signed-off-by: aryan <aryangodara03@gmail.com> * remove unnecessary print lines Signed-off-by: aryan <aryangodara03@gmail.com> * correct env var name Signed-off-by: aryan <aryangodara03@gmail.com> * change to async consume Signed-off-by: aryan <aryangodara03@gmail.com> * add option to switch bw sync and async Signed-off-by: aryan <aryangodara03@gmail.com> * test for both async and sync Signed-off-by: aryan <aryangodara03@gmail.com> * update consumer and add writeAPIs to config Signed-off-by: aryan <aryangodara03@gmail.com> * revert back to sync consuming Signed-off-by: aryan <aryangodara03@gmail.com> * temp fix for default timeout value Signed-off-by: aryan <aryangodara03@gmail.com> * set default timeout in config. Signed-off-by: aryan <aryangodara03@gmail.com> * remove unwanted env vars, add required ones. Signed-off-by: aryan <aryangodara03@gmail.com> * rem unused username password from config Signed-off-by: aryan <aryangodara03@gmail.com> * update readme, env vars, and remove grafana Signed-off-by: aryan <aryangodara03@gmail.com> * update readme Signed-off-by: aryan <aryangodara03@gmail.com> * fix typo Signed-off-by: aryan <aryangodara03@gmail.com> * update readme description. Signed-off-by: aryan <aryangodara03@gmail.com> * fix more typos. Signed-off-by: aryan <aryangodara03@gmail.com> * add link to official docs to readme. Signed-off-by: aryan <aryangodara03@gmail.com> --------- Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> Signed-off-by: aryan <aryangodara03@gmail.com> Co-authored-by: fatih <fatihdurmaz@sabanciuniv.edu> Co-authored-by: Dušan Borovčanin <dusan.borovcanin@mainflux.com>
265 lines
6.3 KiB
Go
265 lines
6.3 KiB
Go
package protocol
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"strconv"
|
|
"strings"
|
|
"unicode/utf8"
|
|
"unsafe"
|
|
)
|
|
|
|
const (
|
|
escapes = "\t\n\f\r ,="
|
|
nameEscapes = "\t\n\f\r ,"
|
|
stringFieldEscapes = "\t\n\f\r\\\""
|
|
)
|
|
|
|
var (
|
|
stringEscaper = strings.NewReplacer(
|
|
"\t", `\t`,
|
|
"\n", `\n`,
|
|
"\f", `\f`,
|
|
"\r", `\r`,
|
|
`,`, `\,`,
|
|
` `, `\ `,
|
|
`=`, `\=`,
|
|
)
|
|
|
|
nameEscaper = strings.NewReplacer(
|
|
"\t", `\t`,
|
|
"\n", `\n`,
|
|
"\f", `\f`,
|
|
"\r", `\r`,
|
|
`,`, `\,`,
|
|
` `, `\ `,
|
|
)
|
|
|
|
stringFieldEscaper = strings.NewReplacer(
|
|
"\t", `\t`,
|
|
"\n", `\n`,
|
|
"\f", `\f`,
|
|
"\r", `\r`,
|
|
`"`, `\"`,
|
|
`\`, `\\`,
|
|
)
|
|
)
|
|
|
|
var (
|
|
unescaper = strings.NewReplacer(
|
|
`\,`, `,`,
|
|
`\"`, `"`, // ???
|
|
`\ `, ` `,
|
|
`\=`, `=`,
|
|
)
|
|
|
|
nameUnescaper = strings.NewReplacer(
|
|
`\,`, `,`,
|
|
`\ `, ` `,
|
|
)
|
|
|
|
stringFieldUnescaper = strings.NewReplacer(
|
|
`\"`, `"`,
|
|
`\\`, `\`,
|
|
)
|
|
)
|
|
|
|
// The various escape functions allocate, I'd like to fix that.
|
|
// TODO: make escape not allocate
|
|
|
|
// Escape a tagkey, tagvalue, or fieldkey
|
|
func escape(s string) string {
|
|
if strings.ContainsAny(s, escapes) {
|
|
return stringEscaper.Replace(s)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// Escape a measurement name
|
|
func nameEscape(s string) string {
|
|
if strings.ContainsAny(s, nameEscapes) {
|
|
return nameEscaper.Replace(s)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// Escape a string field
|
|
func stringFieldEscape(s string) string {
|
|
if strings.ContainsAny(s, stringFieldEscapes) {
|
|
return stringFieldEscaper.Replace(s)
|
|
}
|
|
return s
|
|
}
|
|
|
|
const (
|
|
utf8mask = byte(0x3F)
|
|
utf8bytex = byte(0x80) // 1000 0000
|
|
utf8len2 = byte(0xC0) // 1100 0000
|
|
utf8len3 = byte(0xE0) // 1110 0000
|
|
utf8len4 = byte(0xF0) // 1111 0000
|
|
)
|
|
|
|
func escapeBytes(dest *[]byte, b []byte) {
|
|
if bytes.ContainsAny(b, escapes) {
|
|
var r rune
|
|
for i, j := 0, 0; i < len(b); i += j {
|
|
r, j = utf8.DecodeRune(b[i:])
|
|
switch {
|
|
case r == '\t':
|
|
*dest = append(*dest, `\t`...)
|
|
case r == '\n':
|
|
*dest = append(*dest, `\n`...)
|
|
case r == '\f':
|
|
*dest = append(*dest, `\f`...)
|
|
case r == '\r':
|
|
*dest = append(*dest, `\r`...)
|
|
case r == ',':
|
|
*dest = append(*dest, `\,`...)
|
|
case r == ' ':
|
|
*dest = append(*dest, `\ `...)
|
|
case r == '=':
|
|
*dest = append(*dest, `\=`...)
|
|
case r <= 1<<7-1:
|
|
*dest = append(*dest, byte(r))
|
|
case r <= 1<<11-1:
|
|
*dest = append(*dest, utf8len2|byte(r>>6), utf8bytex|byte(r)&utf8mask)
|
|
case r <= 1<<16-1:
|
|
*dest = append(*dest, utf8len3|byte(r>>12), utf8bytex|byte(r>>6)&utf8mask, utf8bytex|byte(r)&utf8mask)
|
|
default:
|
|
*dest = append(*dest, utf8len4|byte(r>>18), utf8bytex|byte(r>>12)&utf8mask, utf8bytex|byte(r>>6)&utf8mask, utf8bytex|byte(r)&utf8mask)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
*dest = append(*dest, b...)
|
|
}
|
|
|
|
// Escape a measurement name
|
|
func nameEscapeBytes(dest *[]byte, b []byte) {
|
|
if bytes.ContainsAny(b, nameEscapes) {
|
|
var r rune
|
|
for i, j := 0, 0; i < len(b); i += j {
|
|
r, j = utf8.DecodeRune(b[i:])
|
|
switch {
|
|
case r == '\t':
|
|
*dest = append(*dest, `\t`...)
|
|
case r == '\n':
|
|
*dest = append(*dest, `\n`...)
|
|
case r == '\f':
|
|
*dest = append(*dest, `\f`...)
|
|
case r == '\r':
|
|
*dest = append(*dest, `\r`...)
|
|
case r == ',':
|
|
*dest = append(*dest, `\,`...)
|
|
case r == ' ':
|
|
*dest = append(*dest, `\ `...)
|
|
case r == '\\':
|
|
*dest = append(*dest, `\\`...)
|
|
case r <= 1<<7-1:
|
|
*dest = append(*dest, byte(r))
|
|
case r <= 1<<11-1:
|
|
*dest = append(*dest, utf8len2|byte(r>>6), utf8bytex|byte(r)&utf8mask)
|
|
case r <= 1<<16-1:
|
|
*dest = append(*dest, utf8len3|byte(r>>12), utf8bytex|byte(r>>6)&utf8mask, utf8bytex|byte(r)&utf8mask)
|
|
default:
|
|
*dest = append(*dest, utf8len4|byte(r>>18), utf8bytex|byte(r>>12)&utf8mask, utf8bytex|byte(r>>6)&utf8mask, utf8bytex|byte(r)&utf8mask)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
*dest = append(*dest, b...)
|
|
}
|
|
|
|
func stringFieldEscapeBytes(dest *[]byte, b []byte) {
|
|
if bytes.ContainsAny(b, stringFieldEscapes) {
|
|
var r rune
|
|
for i, j := 0, 0; i < len(b); i += j {
|
|
r, j = utf8.DecodeRune(b[i:])
|
|
switch {
|
|
case r == '\t':
|
|
*dest = append(*dest, `\t`...)
|
|
case r == '\n':
|
|
*dest = append(*dest, `\n`...)
|
|
case r == '\f':
|
|
*dest = append(*dest, `\f`...)
|
|
case r == '\r':
|
|
*dest = append(*dest, `\r`...)
|
|
case r == ',':
|
|
*dest = append(*dest, `\,`...)
|
|
case r == ' ':
|
|
*dest = append(*dest, `\ `...)
|
|
case r == '\\':
|
|
*dest = append(*dest, `\\`...)
|
|
case r <= 1<<7-1:
|
|
*dest = append(*dest, byte(r))
|
|
case r <= 1<<11-1:
|
|
*dest = append(*dest, utf8len2|byte(r>>6), utf8bytex|byte(r)&utf8mask)
|
|
case r <= 1<<16-1:
|
|
*dest = append(*dest, utf8len3|byte(r>>12), utf8bytex|byte(r>>6)&utf8mask, utf8bytex|byte(r)&utf8mask)
|
|
default:
|
|
*dest = append(*dest, utf8len4|byte(r>>18), utf8bytex|byte(r>>12)&utf8mask, utf8bytex|byte(r>>6)&utf8mask, utf8bytex|byte(r)&utf8mask)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
*dest = append(*dest, b...)
|
|
}
|
|
|
|
func unescape(b []byte) string {
|
|
if bytes.ContainsAny(b, escapes) {
|
|
return unescaper.Replace(unsafeBytesToString(b))
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func nameUnescape(b []byte) string {
|
|
if bytes.ContainsAny(b, nameEscapes) {
|
|
return nameUnescaper.Replace(unsafeBytesToString(b))
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
// unsafeBytesToString converts a []byte to a string without a heap allocation.
|
|
//
|
|
// It is unsafe, and is intended to prepare input to short-lived functions
|
|
// that require strings.
|
|
func unsafeBytesToString(in []byte) string {
|
|
src := *(*reflect.SliceHeader)(unsafe.Pointer(&in))
|
|
dst := reflect.StringHeader{
|
|
Data: src.Data,
|
|
Len: src.Len,
|
|
}
|
|
s := *(*string)(unsafe.Pointer(&dst))
|
|
return s
|
|
}
|
|
|
|
// parseIntBytes is a zero-alloc wrapper around strconv.ParseInt.
|
|
func parseIntBytes(b []byte, base int, bitSize int) (i int64, err error) {
|
|
s := unsafeBytesToString(b)
|
|
return strconv.ParseInt(s, base, bitSize)
|
|
}
|
|
|
|
// parseUintBytes is a zero-alloc wrapper around strconv.ParseUint.
|
|
func parseUintBytes(b []byte, base int, bitSize int) (i uint64, err error) {
|
|
s := unsafeBytesToString(b)
|
|
return strconv.ParseUint(s, base, bitSize)
|
|
}
|
|
|
|
// parseFloatBytes is a zero-alloc wrapper around strconv.ParseFloat.
|
|
func parseFloatBytes(b []byte, bitSize int) (float64, error) {
|
|
s := unsafeBytesToString(b)
|
|
return strconv.ParseFloat(s, bitSize)
|
|
}
|
|
|
|
// parseBoolBytes is a zero-alloc wrapper around strconv.ParseBool.
|
|
func parseBoolBytes(b []byte) (bool, error) {
|
|
return strconv.ParseBool(unsafeBytesToString(b))
|
|
}
|
|
|
|
func stringFieldUnescape(b []byte) string {
|
|
if bytes.ContainsAny(b, stringFieldEscapes) {
|
|
return stringFieldUnescaper.Replace(unsafeBytesToString(b))
|
|
}
|
|
return string(b)
|
|
}
|