| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | package ethdb | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * This is a test memory database. Do not use for any production it does not get persisted | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | type MemDatabase struct { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db   map[string][]byte | 
					
						
							|  |  |  | 	lock sync.RWMutex | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewMemDatabase() (*MemDatabase, error) { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	return &MemDatabase{ | 
					
						
							|  |  |  | 		db: make(map[string][]byte), | 
					
						
							|  |  |  | 	}, nil | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-20 20:31:11 +02:00
										 |  |  | func (db *MemDatabase) Put(key []byte, value []byte) error { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.Lock() | 
					
						
							|  |  |  | 	defer db.lock.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:16 +02:00
										 |  |  | 	db.db[string(key)] = common.CopyBytes(value) | 
					
						
							| 
									
										
										
										
											2015-06-20 20:31:11 +02:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 16:21:28 +01:00
										 |  |  | func (db *MemDatabase) Set(key []byte, value []byte) { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.Lock() | 
					
						
							|  |  |  | 	defer db.lock.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 16:21:28 +01:00
										 |  |  | 	db.Put(key, value) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | func (db *MemDatabase) Get(key []byte) ([]byte, error) { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.RLock() | 
					
						
							|  |  |  | 	defer db.lock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	if entry, ok := db.db[string(key)]; ok { | 
					
						
							|  |  |  | 		return entry, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil, errors.New("not found") | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | func (db *MemDatabase) Keys() [][]byte { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.RLock() | 
					
						
							|  |  |  | 	defer db.lock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	keys := [][]byte{} | 
					
						
							|  |  |  | 	for key, _ := range db.db { | 
					
						
							|  |  |  | 		keys = append(keys, []byte(key)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return keys | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 13:54:40 +02:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | func (db *MemDatabase) GetKeys() []*common.Key { | 
					
						
							| 
									
										
										
										
											2014-02-28 12:18:41 +01:00
										 |  |  | 	data, _ := db.Get([]byte("KeyRing")) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	return []*common.Key{common.NewKeyFromBytes(data)} | 
					
						
							| 
									
										
										
										
											2014-02-28 12:18:41 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-14 13:54:40 +02:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-02-28 12:18:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-24 12:12:01 +01:00
										 |  |  | func (db *MemDatabase) Delete(key []byte) error { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.Lock() | 
					
						
							|  |  |  | 	defer db.lock.Unlock() | 
					
						
							| 
									
										
										
										
											2014-02-24 12:12:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	delete(db.db, string(key)) | 
					
						
							| 
									
										
										
										
											2014-02-24 12:12:01 +01:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | func (db *MemDatabase) Print() { | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	db.lock.RLock() | 
					
						
							|  |  |  | 	defer db.lock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	for key, val := range db.db { | 
					
						
							|  |  |  | 		fmt.Printf("%x(%d): ", key, len(key)) | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 		node := common.NewValueFromBytes(val) | 
					
						
							| 
									
										
										
										
											2015-03-20 13:33:11 +01:00
										 |  |  | 		fmt.Printf("%q\n", node.Val) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (db *MemDatabase) Close() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (db *MemDatabase) LastKnownTD() []byte { | 
					
						
							|  |  |  | 	data, _ := db.Get([]byte("LastKnownTotalDifficulty")) | 
					
						
							|  |  |  | 	if len(data) == 0 || data == nil { | 
					
						
							|  |  |  | 		data = []byte{0x0} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return data | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-22 12:46:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | func (db *MemDatabase) NewBatch() Batch { | 
					
						
							|  |  |  | 	return &memBatch{db: db} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type kv struct{ k, v []byte } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type memBatch struct { | 
					
						
							|  |  |  | 	db     *MemDatabase | 
					
						
							|  |  |  | 	writes []kv | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 	lock   sync.RWMutex | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | func (b *memBatch) Put(key, value []byte) error { | 
					
						
							|  |  |  | 	b.lock.Lock() | 
					
						
							|  |  |  | 	defer b.lock.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	b.writes = append(b.writes, kv{key, common.CopyBytes(value)}) | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | func (b *memBatch) Write() error { | 
					
						
							|  |  |  | 	b.lock.RLock() | 
					
						
							|  |  |  | 	defer b.lock.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	b.db.lock.Lock() | 
					
						
							|  |  |  | 	defer b.db.lock.Unlock() | 
					
						
							| 
									
										
										
										
											2015-10-07 12:14:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for _, kv := range b.writes { | 
					
						
							|  |  |  | 		b.db.db[string(kv.k)] = kv.v | 
					
						
							| 
									
										
										
										
											2015-08-18 13:42:21 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |