leveldb.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package bitcoin
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/syndtr/goleveldb/leveldb"
  6. "github.com/syndtr/goleveldb/leveldb/errors"
  7. "github.com/syndtr/goleveldb/leveldb/opt"
  8. "github.com/syndtr/goleveldb/leveldb/util"
  9. )
  10. type goleveldb struct {
  11. mdb *leveldb.DB
  12. }
  13. type goLevelDBBatch struct {
  14. db *goleveldb
  15. batch *leveldb.Batch
  16. }
  17. type Batch interface {
  18. Set(key, value []byte)
  19. Delete(key []byte)
  20. Write() error
  21. }
  22. var bitcoindb goleveldb
  23. func (m *goleveldb) InitGoleveldb() bool {
  24. var err error
  25. var dbpath string
  26. dbPathLen := len(Config.Db.DbPath)
  27. if Config.Db.DbPath[dbPathLen-1] == '/' {
  28. dbpath = fmt.Sprintf("%sbitcoindb", Config.Db.DbPath)
  29. } else {
  30. dbpath = fmt.Sprintf("%s/bitcoindb", Config.Db.DbPath)
  31. }
  32. fmt.Println("bitcoin goleveldb :", dbpath)
  33. m.mdb, err = leveldb.OpenFile(dbpath, nil)
  34. if err != nil {
  35. fmt.Println(err)
  36. return false
  37. }
  38. return true
  39. }
  40. func (m *goleveldb) Put(key, value []byte) error {
  41. err := m.mdb.Put(key, value, nil)
  42. if err != nil {
  43. return err
  44. }
  45. return nil
  46. }
  47. func (m *goleveldb) Get(key []byte) ([]byte, error) {
  48. res, err := m.mdb.Get(key, nil)
  49. if err != nil {
  50. if err == errors.ErrNotFound {
  51. return nil, nil
  52. } else {
  53. return nil, err
  54. }
  55. }
  56. return res, nil
  57. }
  58. func (m *goleveldb) Delete(key []byte) error {
  59. err := m.mdb.Delete(key, nil)
  60. if err != nil {
  61. return err
  62. }
  63. return nil
  64. }
  65. func (m *goleveldb) DeleteSync(key []byte) error {
  66. err := m.mdb.Delete(key, &opt.WriteOptions{Sync: true})
  67. if err != nil {
  68. return err
  69. }
  70. return nil
  71. }
  72. func (m *goleveldb) Close() {
  73. m.mdb.Close()
  74. }
  75. func (m *goleveldb) NewBatch() Batch {
  76. batch := new(leveldb.Batch)
  77. return &goLevelDBBatch{m, batch}
  78. }
  79. func (mBatch *goLevelDBBatch) Set(key, value []byte) {
  80. mBatch.batch.Put(key, value)
  81. }
  82. func (mBatch *goLevelDBBatch) Delete(key []byte) {
  83. mBatch.batch.Delete(key)
  84. }
  85. func (mBatch *goLevelDBBatch) Write() error {
  86. err := mBatch.db.mdb.Write(mBatch.batch, nil)
  87. if err != nil {
  88. return err
  89. }
  90. return nil
  91. }
  92. func (m *goleveldb) PrefixScan(key []byte) ([]byte, error) {
  93. var txid string
  94. var jbuf []byte
  95. var err error
  96. outputsArr := make([]string, 0)
  97. iter := m.mdb.NewIterator(util.BytesPrefix(key), nil)
  98. for iter.Next() {
  99. value := iter.Value()
  100. if err = json.Unmarshal([]byte(value), &txid); err != nil {
  101. fmt.Println("Unmarshal err :", err.Error())
  102. return nil, err
  103. }
  104. outputsArr = append(outputsArr, txid)
  105. }
  106. iter.Release()
  107. err = iter.Error()
  108. if err != nil {
  109. return nil, err
  110. }
  111. if jbuf, err = json.Marshal(outputsArr); err != nil {
  112. fmt.Println("Marshal err :", err.Error())
  113. return nil, err
  114. }
  115. return jbuf, nil
  116. }