52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
package ramdb
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/binary"
|
|
"encoding/json"
|
|
|
|
"github.com/google/btree"
|
|
)
|
|
|
|
type record struct {
|
|
serialized []byte
|
|
keyColumn string
|
|
key string
|
|
id uint64
|
|
}
|
|
|
|
// NewRecord returns a pointer to a record populated with data, key, and a hash of the key used for ordering in the tree.
|
|
func NewRecord(key, keyColumn string, data interface{}) (*record, error) {
|
|
serialized, err := json.Marshal(data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var r record
|
|
r.serialized = serialized
|
|
r.keyColumn = keyColumn
|
|
r.key = key
|
|
r.id = keyHash(key)
|
|
return &r, nil
|
|
}
|
|
|
|
func keyHash(s string) uint64 {
|
|
h := sha256.New()
|
|
h.Write([]byte(s))
|
|
sum := h.Sum(nil)
|
|
|
|
return binary.BigEndian.Uint64(sum)
|
|
}
|
|
|
|
// Deserialize unmarshals the serialized data into `into`.
|
|
func (r *record) Deserialize(into interface{}) error {
|
|
err := json.Unmarshal(r.serialized, &into)
|
|
return err
|
|
}
|
|
|
|
// Less is used to order items and for looking up records in the tree.
|
|
func (r *record) Less(than btree.Item) bool {
|
|
re := than.(*record)
|
|
return r.id < re.id
|
|
}
|