db.dataOffset[string(record.KeyHash)]=db.offset// TODO: удалить хеш и откатить запись в случае ошибки
_,err=db.compressor.Write(b)
iferr!=nil{
returnerr
}
db.offset+=int64(len(b))// TODO: удалить хеш и откатить запись в случае ошибки
returnnil
}
func(db*Database)Get(key,valueinterface{})error{
db.mu.Lock()
deferdb.mu.Unlock()
hashToFind,err:=hashInterface(key)
iferr!=nil{
returnerr
}
offset,exists:=db.dataOffset[string(hashToFind)]
if!exists{
returnerrors.New("not exists")// TODO: заменить на константную ошибку
}
readF,err:=os.Open(db.filePath)
iferr!=nil{
returnerr
}
deferreadF.Close()
decompressor,err:=zstd.NewReader(readF)
iferr!=nil{
returnerr
}
deferdecompressor.Close()
err=skip(decompressor,offset)
iferr!=nil{
returnerr
}
_,record,err:=readRecord(decompressor)
iferr!=nil{
returnerr
}
ifbytes.Compare(record.KeyHash,hashToFind)!=0{
returnfmt.Errorf("wrong hash on this offset: expected %s, got %s",base64.StdEncoding.EncodeToString(hashToFind),base64.StdEncoding.EncodeToString(record.KeyHash))// TODO: заменить на константную ошибку