mirror of
https://github.com/minio/minio.git
synced 2025-01-23 20:53:18 -05:00
Add actual inline data to JSON output in xl-meta (#19958)
Add the inlined data as base64 encoded field and try to add a string version if feasible. Example: ``` λ xl-meta -data xl.meta { "8e03504e-1123-4957-b272-7bc53eda0d55": { "bitrot_valid": true, "bytes": 58, "data_base64": "Z29sYW5nLm9yZy94L3N5cyB2MC4xNS4wIC8=", "data_string": "golang.org/x/sys v0.15.0 /" } ``` The string will have quotes, newlines escaped to produce valid JSON. If content isn't valid utf8 or the encoding otherwise fails, only the base64 data will be added. `-export` can still be used separately to extract the data as files (including bitrot).
This commit is contained in:
parent
95e4cbbfde
commit
3e6dc02f8f
@ -20,6 +20,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
|
"encoding/base64"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@ -34,6 +35,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/klauspost/compress/zip"
|
"github.com/klauspost/compress/zip"
|
||||||
@ -237,7 +239,7 @@ FLAGS:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.Bool("data") {
|
if c.Bool("data") {
|
||||||
b, err := data.json()
|
b, err := data.json(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -562,7 +564,7 @@ func (x xlMetaInlineData) versionOK() bool {
|
|||||||
return x[0] > 0 && x[0] <= xlMetaInlineDataVer
|
return x[0] > 0 && x[0] <= xlMetaInlineDataVer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x xlMetaInlineData) json() ([]byte, error) {
|
func (x xlMetaInlineData) json(value bool) ([]byte, error) {
|
||||||
if len(x) == 0 {
|
if len(x) == 0 {
|
||||||
return []byte("{}"), nil
|
return []byte("{}"), nil
|
||||||
}
|
}
|
||||||
@ -607,6 +609,17 @@ func (x xlMetaInlineData) json() ([]byte, error) {
|
|||||||
} else {
|
} else {
|
||||||
s += ", \"bitrot_valid\": false"
|
s += ", \"bitrot_valid\": false"
|
||||||
}
|
}
|
||||||
|
if value {
|
||||||
|
if utf8.Valid(data) {
|
||||||
|
// Encode as JSON string.
|
||||||
|
b, err := json.Marshal(string(data))
|
||||||
|
if err == nil {
|
||||||
|
s += `, "data_string": ` + string(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Base64 encode.
|
||||||
|
s += `, "data_base64": "` + base64.StdEncoding.EncodeToString(data) + `"`
|
||||||
|
}
|
||||||
s += "}"
|
s += "}"
|
||||||
}
|
}
|
||||||
res = append(res, []byte(s)...)
|
res = append(res, []byte(s)...)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user