mirror of
https://git.um-react.app/um/cli.git
synced 2025-11-28 03:33:02 +00:00
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package qmc
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"git.um-react.app/um/cli/algo/common"
|
|
"git.um-react.app/um/cli/internal/utils"
|
|
go_mmkv "github.com/unlock-music/go-mmkv"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func mergeMMKVKeys(keys ...common.QMCKeys) common.QMCKeys {
|
|
result := make(common.QMCKeys)
|
|
for _, k := range keys {
|
|
for key, value := range k {
|
|
result[utils.NormalizeUnicode(key)] = utils.NormalizeUnicode(value)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
func LoadMMKV(path string, key string, logger *zap.Logger) (result common.QMCKeys, err error) {
|
|
mmkv_path := path
|
|
mmkv_crc := path + ".crc"
|
|
|
|
mr, err := os.Open(mmkv_path)
|
|
if err != nil {
|
|
logger.Error("LoadMMKV: Could not open mmkv file", zap.Error(err))
|
|
return nil, fmt.Errorf("LoadMMKV: open error: %w", err)
|
|
}
|
|
defer mr.Close()
|
|
|
|
cr, err := os.Open(mmkv_crc)
|
|
if err != nil {
|
|
// crc is optional
|
|
logger.Warn("LoadMMKV: Failed to open crc file, assuming no encryption", zap.Error(err))
|
|
key = ""
|
|
} else {
|
|
defer cr.Close()
|
|
}
|
|
|
|
var password []byte = nil
|
|
if key != "" {
|
|
password = make([]byte, 16)
|
|
copy(password, []byte(key))
|
|
}
|
|
mmkv, err := go_mmkv.NewMMKVReader(mr, password, cr)
|
|
if err != nil {
|
|
logger.Error("LoadMMKV: failed to create reader", zap.Error(err))
|
|
return nil, fmt.Errorf("LoadMMKV: NewMMKVReader error: %w", err)
|
|
}
|
|
|
|
result = make(common.QMCKeys)
|
|
for !mmkv.IsEOF() {
|
|
key, err := mmkv.ReadKey()
|
|
if err != nil {
|
|
logger.Error("LoadMMKV: read key error", zap.Error(err))
|
|
return nil, fmt.Errorf("LoadMMKV: read key error: %w", err)
|
|
}
|
|
value, err := mmkv.ReadStringValue()
|
|
if err != nil {
|
|
logger.Error("LoadMMKV: read value error", zap.Error(err))
|
|
return nil, fmt.Errorf("LoadMMKV: read value error: %w", err)
|
|
}
|
|
logger.Debug("LoadMMKV: read", zap.String("key", key), zap.String("value", value))
|
|
result[utils.NormalizeUnicode(key)] = utils.NormalizeUnicode(value)
|
|
}
|
|
|
|
return result, nil
|
|
}
|