From 6333811984f7c3e066c58758b76fecd7eed1f069 Mon Sep 17 00:00:00 2001 From: Ciprian Dorin Craciun Date: Sun, 19 Dec 2021 14:05:22 +0200 Subject: [PATCH] [common] Extract some key encoding / decoding into separate module. --- sources/lib/common/keys.go | 120 +++++++++++++++++++++++++++++++ sources/lib/common/namespaces.go | 16 ++--- 2 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 sources/lib/common/keys.go diff --git a/sources/lib/common/keys.go b/sources/lib/common/keys.go new file mode 100644 index 0000000..dfe17a8 --- /dev/null +++ b/sources/lib/common/keys.go @@ -0,0 +1,120 @@ + + +package common + + +import "encoding/binary" +import "fmt" + + + + +func PrepareKeyToString (_namespace string, _key uint64) (string, error) { + if _key_0, _error := PrepareKey (_namespace, _key); _error == nil { + return EncodeKeyToString (_namespace, _key_0) + } else { + return "", _error + } +} + + + + +func EncodeKeyToString (_namespace string, _key uint64) (string, error) { + var _buffer [8]byte + if _error := EncodeKeyToBytes_0 (_namespace, _key, _buffer[:]); _error == nil { + return string (_buffer[:]), nil + } else { + return "", _error + } +} + + +func EncodeKeyToBytes (_namespace string, _key uint64) ([]byte, error) { + _buffer := make ([]byte, 8) + _error := EncodeKeyToBytes_0 (_namespace, _key, _buffer) + return _buffer, _error +} + + +func EncodeKeyToBytes_0 (_namespace string, _key uint64, _buffer []byte) (error) { + if len (_buffer) != 8 { + return fmt.Errorf ("[890eef13] invalid key buffer length!") + } + _prefix := keyNamespacePrefix (_namespace) + if _prefix == 0 { + return fmt.Errorf ("[feece73b] invalid key namespace `%s`!", _namespace) + } + if (_key << 8) == 0 { + return fmt.Errorf ("[c8fa7817] invalid key zero!") + } + _keyPrefix := byte (_key >> 56) + if _keyPrefix != _prefix { + return fmt.Errorf ("[85a5c362] invalid key prefix `%0x` for `%d`!", _key, _keyPrefix) + } + binary.BigEndian.PutUint64 (_buffer, _key) + return nil +} + + + + +func PrepareKey (_namespace string, _key uint64) (uint64, error) { + if _key == 0 { + return 0, fmt.Errorf ("[355f64d0] invalid key zero!") + } + if _key >= (1 << 24) { + return 0, fmt.Errorf ("[aba09b4d] invalid key value `%d`!", _key) + } + _prefix := keyNamespacePrefix (_namespace) + if _prefix == 0 { + return 0, fmt.Errorf ("[feece73b] invalid key namespace `%s`!", _namespace) + } + _keyString := fmt.Sprintf ("%08x", _key) + _keyBytes := []byte (_keyString) + _keyBytes[0] = _prefix + _keyValue := binary.BigEndian.Uint64 (_keyBytes) + return _keyValue, nil +} + + + + +func keyNamespacePrefix (_namespace string) (byte) { + switch _namespace { + case NamespaceFilesContent : return 'f' + case NamespaceFilesIndex : return 'F' + case NamespaceFoldersContent : return 'l' + case NamespaceFoldersIndex : return 'L' + case NamespaceDataContent : return 'd' + case NamespaceDataMetadata : return 'm' + default : return '0' + } +} + + + + +func EncodeKeysPairToString (_namespace1 string, _key1 uint64, _namespace2 string, _key2 uint64) (string, error) { + var _buffer [16]byte + if _error := EncodeKeyToBytes_0 (_namespace1, _key1, _buffer[0:8]); _error != nil { + return "", _error + } + if _error := EncodeKeyToBytes_0 (_namespace2, _key2, _buffer[8:16]); _error != nil { + return "", _error + } + return string (_buffer[:]), nil +} + + + + +func DecodeKeysPair (_buffer []byte) (uint64, uint64, error) { + if len (_buffer) != 16 { + return 0, 0, fmt.Errorf ("[dd6ba461] invalid key buffer length!") + } + _key1 := binary.BigEndian.Uint64 (_buffer[0:8]) + _key2 := binary.BigEndian.Uint64 (_buffer[8:16]) + return _key1, _key2, nil +} + diff --git a/sources/lib/common/namespaces.go b/sources/lib/common/namespaces.go index 2e1065d..c0c6cd0 100644 --- a/sources/lib/common/namespaces.go +++ b/sources/lib/common/namespaces.go @@ -5,14 +5,14 @@ package common -const NamespaceSchemaVersion = "s" -const CurrentSchemaVersion = "2021a" +const NamespaceSchemaVersion = "schema" +const CurrentSchemaVersion = "kawipiko-2021b" -const NamespaceFilesContent = "f" -const NamespaceFilesIndex = "fi" -const NamespaceFoldersContent = "l" -const NamespaceFoldersIndex = "li" +const NamespaceFilesContent = "files-content" +const NamespaceFilesIndex = "files-index" +const NamespaceFoldersContent = "folders-content" +const NamespaceFoldersIndex = "folders-index" -const NamespaceDataContent = "c" -const NamespaceDataMetadata = "m" +const NamespaceDataContent = "resource-data" +const NamespaceDataMetadata = "resource-metadata"