github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/database.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:44</date> 10 //</624450118451466240> 11 12 13 package storage 14 15 //这是以太坊ethdb/数据库早期状态的克隆 16 //不需要排队/缓存 17 18 import ( 19 "github.com/ethereum/go-ethereum/metrics" 20 "github.com/syndtr/goleveldb/leveldb" 21 "github.com/syndtr/goleveldb/leveldb/iterator" 22 "github.com/syndtr/goleveldb/leveldb/opt" 23 ) 24 25 const openFileLimit = 128 26 27 type LDBDatabase struct { 28 db *leveldb.DB 29 } 30 31 func NewLDBDatabase(file string) (*LDBDatabase, error) { 32 //打开数据库 33 db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: openFileLimit}) 34 if err != nil { 35 return nil, err 36 } 37 38 database := &LDBDatabase{db: db} 39 40 return database, nil 41 } 42 43 func (db *LDBDatabase) Put(key []byte, value []byte) error { 44 metrics.GetOrRegisterCounter("ldbdatabase.put", nil).Inc(1) 45 46 return db.db.Put(key, value, nil) 47 } 48 49 func (db *LDBDatabase) Get(key []byte) ([]byte, error) { 50 metrics.GetOrRegisterCounter("ldbdatabase.get", nil).Inc(1) 51 52 dat, err := db.db.Get(key, nil) 53 if err != nil { 54 return nil, err 55 } 56 return dat, nil 57 } 58 59 func (db *LDBDatabase) Delete(key []byte) error { 60 return db.db.Delete(key, nil) 61 } 62 63 func (db *LDBDatabase) NewIterator() iterator.Iterator { 64 metrics.GetOrRegisterCounter("ldbdatabase.newiterator", nil).Inc(1) 65 66 return db.db.NewIterator(nil, nil) 67 } 68 69 func (db *LDBDatabase) Write(batch *leveldb.Batch) error { 70 metrics.GetOrRegisterCounter("ldbdatabase.write", nil).Inc(1) 71 72 return db.db.Write(batch, nil) 73 } 74 75 func (db *LDBDatabase) Close() { 76 //关闭LevelDB数据库 77 db.db.Close() 78 } 79