// FetchAllDBlocks gets all of the fbInfo func (db *LevelDb) FetchAllDBlocks() (dBlocks []common.DirectoryBlock, err error) { db.dbLock.Lock() defer db.dbLock.Unlock() var fromkey []byte = []byte{byte(TBL_DB)} // Table Name (1 bytes) // Timestamp (8 bytes) var tokey []byte = []byte{byte(TBL_DB + 1)} // Table Name (1 bytes) dBlockSlice := make([]common.DirectoryBlock, 0, 10) iter := db.lDb.NewIterator(&util.Range{Start: fromkey, Limit: tokey}, db.ro) for iter.Next() { var dBlock common.DirectoryBlock _, err := dBlock.UnmarshalBinaryData(iter.Value()) if err != nil { return nil, err } //TODO: to be optimized?? dBlock.DBHash = common.Sha(iter.Value()) dBlockSlice = append(dBlockSlice, dBlock) } iter.Release() err = iter.Error() return dBlockSlice, nil }
// ProcessDBlockBatche inserts the DBlock and update all it's dbentries in DB func (db *LevelDb) ProcessDBlockBatch(dblock *common.DirectoryBlock) error { if dblock != nil { if db.lbatch == nil { db.lbatch = new(leveldb.Batch) } defer db.lbatch.Reset() binaryDblock, err := dblock.MarshalBinary() if err != nil { return err } if dblock.DBHash == nil { dblock.DBHash = common.Sha(binaryDblock) } if dblock.KeyMR == nil { dblock.BuildKeyMerkleRoot() } // Insert the binary directory block var key []byte = []byte{byte(TBL_DB)} key = append(key, dblock.DBHash.Bytes()...) db.lbatch.Put(key, binaryDblock) // Insert block height cross reference var dbNumkey []byte = []byte{byte(TBL_DB_NUM)} var buf bytes.Buffer binary.Write(&buf, binary.BigEndian, dblock.Header.DBHeight) dbNumkey = append(dbNumkey, buf.Bytes()...) db.lbatch.Put(dbNumkey, dblock.DBHash.Bytes()) // Insert the directory block merkle root cross reference key = []byte{byte(TBL_DB_MR)} key = append(key, dblock.KeyMR.Bytes()...) binaryDBHash, _ := dblock.DBHash.MarshalBinary() db.lbatch.Put(key, binaryDBHash) // Update the chain head reference key = []byte{byte(TBL_CHAIN_HEAD)} key = append(key, common.D_CHAINID...) db.lbatch.Put(key, dblock.KeyMR.Bytes()) err = db.lDb.Write(db.lbatch, db.wo) if err != nil { return err } // Update DirBlock Height cache db.lastDirBlkHeight = int64(dblock.Header.DBHeight) db.lastDirBlkSha, _ = wire.NewShaHash(dblock.DBHash.Bytes()) db.lastDirBlkShaCached = true } return nil }