leveldb.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package kvdb
  2. import (
  3. "github.com/syndtr/goleveldb/leveldb"
  4. "github.com/syndtr/goleveldb/leveldb/iterator"
  5. "github.com/syndtr/goleveldb/leveldb/util"
  6. "io"
  7. "sync/atomic"
  8. )
  9. type LevelDb struct {
  10. filename string
  11. openFlag int32
  12. engine *leveldb.DB
  13. }
  14. type levelDbIterator struct {
  15. v iterator.Iterator
  16. }
  17. func (i *levelDbIterator) Next() bool {
  18. return i.v.Next()
  19. }
  20. func (i *levelDbIterator) Key() string {
  21. return string(i.v.Key())
  22. }
  23. func (i *levelDbIterator) Value() []byte {
  24. return i.v.Value()
  25. }
  26. func (i *levelDbIterator) Close() error {
  27. i.v.Release()
  28. return nil
  29. }
  30. func (db *LevelDb) Open() (err error) {
  31. db.engine, err = leveldb.OpenFile(db.filename, nil)
  32. if err == nil {
  33. atomic.StoreInt32(&db.openFlag, 1)
  34. } else {
  35. if db.engine, err = leveldb.RecoverFile(db.filename, nil); err == nil {
  36. atomic.StoreInt32(&db.openFlag, 1)
  37. }
  38. }
  39. return
  40. }
  41. func (db *LevelDb) Put(key string, value []byte) (err error) {
  42. if atomic.LoadInt32(&db.openFlag) == 0 {
  43. err = io.ErrClosedPipe
  44. return
  45. }
  46. err = db.engine.Put([]byte(key), value, nil)
  47. return
  48. }
  49. func (db *LevelDb) Get(key string) (b []byte, err error) {
  50. if atomic.LoadInt32(&db.openFlag) == 0 {
  51. err = io.ErrClosedPipe
  52. return
  53. }
  54. b, err = db.engine.Get([]byte(key), nil)
  55. return
  56. }
  57. func (db *LevelDb) Delete(key string) (err error) {
  58. if atomic.LoadInt32(&db.openFlag) == 0 {
  59. err = io.ErrClosedPipe
  60. return
  61. }
  62. err = db.engine.Delete([]byte(key), nil)
  63. return
  64. }
  65. func (db *LevelDb) Iterator(key string) (iterator Iterator, err error) {
  66. if atomic.LoadInt32(&db.openFlag) == 0 {
  67. err = io.ErrClosedPipe
  68. return
  69. }
  70. v := db.engine.NewIterator(util.BytesPrefix([]byte(key)), nil)
  71. iterator = &levelDbIterator{
  72. v: v,
  73. }
  74. return
  75. }
  76. func (db *LevelDb) Close() error {
  77. if atomic.LoadInt32(&db.openFlag) == 1 {
  78. atomic.StoreInt32(&db.openFlag, 0)
  79. return db.engine.Close()
  80. }
  81. return nil
  82. }
  83. func NewLevelDb(filename string) *LevelDb {
  84. return &LevelDb{
  85. filename: filename,
  86. }
  87. }