You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
2.8 KiB

9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
  1. package db
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. func init() {
  7. registerDBCreator(MemDBBackendStr, func(name string, dir string) (DB, error) {
  8. return NewMemDB(), nil
  9. }, false)
  10. }
  11. type MemDB struct {
  12. mtx sync.Mutex
  13. db map[string][]byte
  14. }
  15. func NewMemDB() *MemDB {
  16. database := &MemDB{db: make(map[string][]byte)}
  17. return database
  18. }
  19. func (db *MemDB) Get(key []byte) []byte {
  20. db.mtx.Lock()
  21. defer db.mtx.Unlock()
  22. return db.db[string(key)]
  23. }
  24. func (db *MemDB) Set(key []byte, value []byte) {
  25. db.mtx.Lock()
  26. defer db.mtx.Unlock()
  27. db.db[string(key)] = value
  28. }
  29. func (db *MemDB) SetSync(key []byte, value []byte) {
  30. db.mtx.Lock()
  31. defer db.mtx.Unlock()
  32. db.db[string(key)] = value
  33. }
  34. func (db *MemDB) Delete(key []byte) {
  35. db.mtx.Lock()
  36. defer db.mtx.Unlock()
  37. delete(db.db, string(key))
  38. }
  39. func (db *MemDB) DeleteSync(key []byte) {
  40. db.mtx.Lock()
  41. defer db.mtx.Unlock()
  42. delete(db.db, string(key))
  43. }
  44. func (db *MemDB) Close() {
  45. db.mtx.Lock()
  46. defer db.mtx.Unlock()
  47. db = nil
  48. }
  49. func (db *MemDB) Print() {
  50. db.mtx.Lock()
  51. defer db.mtx.Unlock()
  52. for key, value := range db.db {
  53. fmt.Printf("[%X]:\t[%X]\n", []byte(key), value)
  54. }
  55. }
  56. func (db *MemDB) Stats() map[string]string {
  57. stats := make(map[string]string)
  58. stats["database.type"] = "memDB"
  59. return stats
  60. }
  61. type memDBIterator struct {
  62. last int
  63. keys []string
  64. db *MemDB
  65. }
  66. func (it *memDBIterator) Create(db *MemDB) *memDBIterator {
  67. db.mtx.Lock()
  68. defer db.mtx.Unlock()
  69. if it == nil {
  70. it = &memDBIterator{}
  71. }
  72. it.db = db
  73. it.last = -1
  74. // unfortunately we need a copy of all of the keys
  75. for key, _ := range db.db {
  76. it.keys = append(it.keys, key)
  77. }
  78. return it
  79. }
  80. func (it *memDBIterator) Next() bool {
  81. if it.last >= len(it.keys) {
  82. return false
  83. }
  84. it.last++
  85. return true
  86. }
  87. func (it *memDBIterator) Key() []byte {
  88. return []byte(it.keys[it.last])
  89. }
  90. func (it *memDBIterator) Value() []byte {
  91. it.db.mtx.Lock()
  92. defer it.db.mtx.Unlock()
  93. return it.db.db[it.keys[it.last]]
  94. }
  95. func (db *MemDB) Iterator() Iterator {
  96. var it *memDBIterator
  97. return it.Create(db)
  98. }
  99. func (db *MemDB) NewBatch() Batch {
  100. return &memDBBatch{db, nil}
  101. }
  102. //--------------------------------------------------------------------------------
  103. type memDBBatch struct {
  104. db *MemDB
  105. ops []operation
  106. }
  107. type opType int
  108. const (
  109. opTypeSet = 1
  110. opTypeDelete = 2
  111. )
  112. type operation struct {
  113. opType
  114. key []byte
  115. value []byte
  116. }
  117. func (mBatch *memDBBatch) Set(key, value []byte) {
  118. mBatch.ops = append(mBatch.ops, operation{opTypeSet, key, value})
  119. }
  120. func (mBatch *memDBBatch) Delete(key []byte) {
  121. mBatch.ops = append(mBatch.ops, operation{opTypeDelete, key, nil})
  122. }
  123. func (mBatch *memDBBatch) Write() {
  124. mBatch.db.mtx.Lock()
  125. defer mBatch.db.mtx.Unlock()
  126. for _, op := range mBatch.ops {
  127. if op.opType == opTypeSet {
  128. mBatch.db.db[string(op.key)] = op.value
  129. } else if op.opType == opTypeDelete {
  130. delete(mBatch.db.db, string(op.key))
  131. }
  132. }
  133. }