func LoadNeedleMap(file *os.File) *NeedleMap { nm := NewNeedleMap(file) bytes := make([]byte, 16*RowsToRead) count, e := nm.indexFile.Read(bytes) if count > 0 { fstat, _ := file.Stat() log.Println("Loading index file", fstat.Name(), "size", fstat.Size()) } for count > 0 && e == nil { for i := 0; i < count; i += 16 { key := util.BytesToUint64(bytes[i : i+8]) offset := util.BytesToUint32(bytes[i+8 : i+12]) size := util.BytesToUint32(bytes[i+12 : i+16]) if offset > 0 { nm.m.Set(Key(key), offset, size) //log.Println("reading key", key, "offset", offset, "size", size) nm.fileCounter++ } else { nm.m.Delete(Key(key)) //log.Println("removing key", key) nm.deletionCounter++ } } count, e = nm.indexFile.Read(bytes) } return nm }
func ParseKeyHash(key_hash_string string) (uint64, uint32) { key_hash_bytes, khe := hex.DecodeString(key_hash_string) key_hash_len := len(key_hash_bytes) if khe != nil || key_hash_len <= 4 { println("Invalid key_hash", key_hash_string, "length:", key_hash_len, "error", khe) return 0, 0 } key := util.BytesToUint64(key_hash_bytes[0 : key_hash_len-4]) hash := util.BytesToUint32(key_hash_bytes[key_hash_len-4 : key_hash_len]) return key, hash }
func (n *Needle) Read(r io.Reader, size uint32) (int, error) { bytes := make([]byte, size+16+4) ret, e := r.Read(bytes) n.Cookie = util.BytesToUint32(bytes[0:4]) n.Id = util.BytesToUint64(bytes[4:12]) n.Size = util.BytesToUint32(bytes[12:16]) n.Data = bytes[16 : 16+size] checksum := util.BytesToUint32(bytes[16+size : 16+size+4]) if checksum != NewCRC(n.Data).Value() { return 0, errors.New("CRC error! Data On Disk Corrupted!") } return ret, e }
func ReadNeedle(r *os.File) (*Needle, uint32) { n := new(Needle) bytes := make([]byte, 16) count, e := r.Read(bytes) if count <= 0 || e != nil { return nil, 0 } n.Cookie = util.BytesToUint32(bytes[0:4]) n.Id = util.BytesToUint64(bytes[4:12]) n.Size = util.BytesToUint32(bytes[12:16]) rest := 8 - ((n.Size + 16 + 4) % 8) return n, n.Size + 4 + rest }