leveldb.go 1.45 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
package leveldb

import (
  ds "github.com/jbenet/datastore.go"
  "github.com/syndtr/goleveldb/leveldb"
  "github.com/syndtr/goleveldb/leveldb/opt"
)

// Datastore uses a standard Go map for internal storage.
type Datastore struct {
  DB *leveldb.DB
}

type Options opt.Options

func NewDatastore(path string, opts *Options) (*Datastore, error) {
  nopts := opt.Options(*opts)
  db, err := leveldb.OpenFile(path, &nopts)
  if err != nil {
    return nil, err
  }

  return &Datastore{
    DB: db,
  }, nil
}

// Returns ErrInvalidType if value is not of type []byte.
//
// Note: using sync = false.
// see http://godoc.org/github.com/syndtr/goleveldb/leveldb/opt#WriteOptions
func (d *Datastore) Put(key ds.Key, value interface{}) (err error) {
  val, failed := value.([]byte)
  if failed {
    return ds.ErrInvalidType
  }
  return d.DB.Put(key.Bytes(), val, nil)
}

func (d *Datastore) Get(key ds.Key) (value interface{}, err error) {
  val, err := d.DB.Get(key.Bytes(), nil)
  if err != nil {
    if err == leveldb.ErrNotFound {
      return nil, ds.ErrNotFound
    }
    return nil, err
  }
  return val, nil
}

func (d *Datastore) Has(key ds.Key) (exists bool, err error) {
  return ds.GetBackedHas(d, key)
}

func (d *Datastore) Delete(key ds.Key) (err error) {
  err = d.DB.Delete(key.Bytes(), nil)
  if err == leveldb.ErrNotFound {
    return ds.ErrNotFound
  }
  return err
}

// LevelDB needs to be closed.
func (d *Datastore) Close() (err error) {
  return d.DB.Close()
}