open-vault/vendor/github.com/aerospike/aerospike-client-go/key_helper.go
Eugene R 331529fc94
Aerospike storage backend (#10131)
* add an Aerospike storage backend

* go mod vendor

* add Aerospike storage configuration docs

* review fixes

* bump aerospike client to v3.1.1

* rename the defaultHostname variable

* relocate the docs page
2021-01-12 15:26:07 -08:00

150 lines
3.5 KiB
Go

// Copyright 2013-2020 Aerospike, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aerospike
import (
"encoding/binary"
"math"
"github.com/aerospike/aerospike-client-go/pkg/ripemd160"
. "github.com/aerospike/aerospike-client-go/types"
)
type keyWriter struct {
buffer [8]byte
offset int
hash ripemd160.Digest
}
// Int64ToBytes converts an int64 into slice of Bytes.
func (vb *keyWriter) WriteInt64(num int64) (int, error) {
return vb.WriteUint64(uint64(num))
}
// Uint64ToBytes converts an uint64 into slice of Bytes.
func (vb *keyWriter) WriteUint64(num uint64) (int, error) {
binary.BigEndian.PutUint64(vb.buffer[:8], num)
vb.hash.Write(vb.buffer[:8])
return 8, nil
}
// Int32ToBytes converts an int32 to a byte slice of size 4
func (vb *keyWriter) WriteInt32(num int32) (int, error) {
return vb.WriteUint32(uint32(num))
}
// Uint32ToBytes converts an uint32 to a byte slice of size 4
func (vb *keyWriter) WriteUint32(num uint32) (int, error) {
binary.BigEndian.PutUint32(vb.buffer[:4], num)
vb.hash.Write(vb.buffer[:4])
return 4, nil
}
// Int16ToBytes converts an int16 to slice of bytes
func (vb *keyWriter) WriteInt16(num int16) (int, error) {
return vb.WriteUint16(uint16(num))
}
// UInt16ToBytes converts an iuint16 to slice of bytes
func (vb *keyWriter) WriteUint16(num uint16) (int, error) {
binary.BigEndian.PutUint16(vb.buffer[:2], num)
vb.hash.Write(vb.buffer[:2])
return 2, nil
}
func (vb *keyWriter) WriteFloat32(float float32) (int, error) {
bits := math.Float32bits(float)
binary.BigEndian.PutUint32(vb.buffer[:4], bits)
vb.hash.Write(vb.buffer[:4])
return 4, nil
}
func (vb *keyWriter) WriteFloat64(float float64) (int, error) {
bits := math.Float64bits(float)
binary.BigEndian.PutUint64(vb.buffer[:8], bits)
vb.hash.Write(vb.buffer[:8])
return 8, nil
}
func (vb *keyWriter) WriteByte(b byte) error {
_, err := vb.hash.Write([]byte{b})
return err
}
func (vb *keyWriter) WriteString(s string) (int, error) {
// To avoid allocating memory, write the strings in small chunks
l := len(s)
const size = 128
b := [size]byte{}
cnt := 0
for i := 0; i < l; i++ {
b[cnt] = s[i]
cnt++
if cnt == size {
vb.Write(b[:])
cnt = 0
}
}
if cnt > 0 {
vb.Write(b[:cnt])
}
return len(s), nil
}
func (vb *keyWriter) Write(b []byte) (int, error) {
vb.hash.Write(b)
return len(b), nil
}
func (vb *keyWriter) writeKey(val Value) error {
switch v := val.(type) {
case IntegerValue:
vb.WriteInt64(int64(v))
return nil
case LongValue:
vb.WriteInt64(int64(v))
return nil
case FloatValue:
vb.WriteFloat64(float64(v))
return nil
case StringValue:
vb.WriteString(string(v))
return nil
case ListValue:
v.pack(vb)
return nil
case *ListValue:
v.pack(vb)
return nil
case *ListerValue:
v.pack(vb)
return nil
case ValueArray:
v.pack(vb)
return nil
case *ValueArray:
v.pack(vb)
return nil
case BytesValue:
vb.Write(v)
return nil
}
return NewAerospikeError(PARAMETER_ERROR, "Key Generation Error. Value not supported: "+val.String())
}