9 "github.com/jmhodges/levigo"
11 . "github.com/tendermint/tmlibs/common"
15 dbCreator := func(name string, dir string) (DB, error) {
16 return NewCLevelDB(name, dir)
18 registerDBCreator(LevelDBBackendStr, dbCreator, true)
19 registerDBCreator(CLevelDBBackendStr, dbCreator, false)
22 type CLevelDB struct {
24 ro *levigo.ReadOptions
25 wo *levigo.WriteOptions
26 woSync *levigo.WriteOptions
29 func NewCLevelDB(name string, dir string) (*CLevelDB, error) {
30 dbPath := path.Join(dir, name+".db")
32 opts := levigo.NewOptions()
33 opts.SetCache(levigo.NewLRUCache(1 << 30))
34 opts.SetCreateIfMissing(true)
35 db, err := levigo.Open(dbPath, opts)
39 ro := levigo.NewReadOptions()
40 wo := levigo.NewWriteOptions()
41 woSync := levigo.NewWriteOptions()
43 database := &CLevelDB{
52 func (db *CLevelDB) Get(key []byte) []byte {
53 res, err := db.db.Get(db.ro, key)
60 func (db *CLevelDB) Set(key []byte, value []byte) {
61 err := db.db.Put(db.wo, key, value)
67 func (db *CLevelDB) SetSync(key []byte, value []byte) {
68 err := db.db.Put(db.woSync, key, value)
74 func (db *CLevelDB) Delete(key []byte) {
75 err := db.db.Delete(db.wo, key)
81 func (db *CLevelDB) DeleteSync(key []byte) {
82 err := db.db.Delete(db.woSync, key)
88 func (db *CLevelDB) DB() *levigo.DB {
92 func (db *CLevelDB) Close() {
99 func (db *CLevelDB) Print() {
100 iter := db.db.NewIterator(db.ro)
102 for iter.Seek(nil); iter.Valid(); iter.Next() {
104 value := iter.Value()
105 fmt.Printf("[%X]:\t[%X]\n", key, value)
109 func (db *CLevelDB) Stats() map[string]string {
110 // TODO: Find the available properties for the C LevelDB implementation
113 stats := make(map[string]string)
114 for _, key := range keys {
115 str, err := db.db.GetProperty(key)
123 func (db *CLevelDB) Iterator() Iterator {
124 return db.db.NewIterator(nil, nil)
127 func (db *CLevelDB) NewBatch() Batch {
128 batch := levigo.NewWriteBatch()
129 return &cLevelDBBatch{db, batch}
132 //--------------------------------------------------------------------------------
134 type cLevelDBBatch struct {
136 batch *levigo.WriteBatch
139 func (mBatch *cLevelDBBatch) Set(key, value []byte) {
140 mBatch.batch.Put(key, value)
143 func (mBatch *cLevelDBBatch) Delete(key []byte) {
144 mBatch.batch.Delete(key)
147 func (mBatch *cLevelDBBatch) Write() {
148 err := mBatch.db.db.Write(mBatch.db.wo, mBatch.batch)