2019-05-27 13:51:49 +00:00
|
|
|
// Copyright 2014 The go-ethereum Authors
|
|
|
|
// This file is part of the go-ethereum library.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
|
|
// 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.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package ethdb
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/ledgerwatch/bolt"
|
2020-04-11 13:28:15 +00:00
|
|
|
"github.com/ledgerwatch/turbo-geth/common"
|
2020-03-11 10:31:49 +00:00
|
|
|
"github.com/ledgerwatch/turbo-geth/common/dbutils"
|
2019-05-27 13:51:49 +00:00
|
|
|
"github.com/ledgerwatch/turbo-geth/log"
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewMemDatabase() *BoltDatabase {
|
|
|
|
logger := log.New("database", "in-memory")
|
|
|
|
|
|
|
|
// Open the db and recover any potential corruptions
|
2020-03-11 10:31:49 +00:00
|
|
|
db, errOpen := bolt.Open("in-memory", 0600, &bolt.Options{MemOnly: true})
|
|
|
|
if errOpen != nil {
|
|
|
|
panic(errOpen)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := db.Update(func(tx *bolt.Tx) error {
|
|
|
|
for _, bucket := range dbutils.Buckets {
|
|
|
|
if _, err := tx.CreateBucketIfNotExists(bucket, false); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}); err != nil {
|
2019-05-27 13:51:49 +00:00
|
|
|
panic(err)
|
|
|
|
}
|
2020-03-20 11:30:14 +00:00
|
|
|
|
2019-12-10 13:12:21 +00:00
|
|
|
b := &BoltDatabase{
|
2019-05-27 13:51:49 +00:00
|
|
|
db: db,
|
|
|
|
log: logger,
|
2019-12-10 13:12:21 +00:00
|
|
|
id: id(),
|
2019-05-27 13:51:49 +00:00
|
|
|
}
|
2019-12-10 13:12:21 +00:00
|
|
|
|
|
|
|
return b
|
2019-05-27 13:51:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewMemDatabase2() (*BoltDatabase, *bolt.DB) {
|
|
|
|
logger := log.New("database", "in-memory")
|
|
|
|
|
|
|
|
// Open the db and recover any potential corruptions
|
|
|
|
db, err := bolt.Open("in-memory", 0600, &bolt.Options{MemOnly: true})
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
return &BoltDatabase{
|
|
|
|
db: db,
|
|
|
|
log: logger,
|
2019-12-10 13:12:21 +00:00
|
|
|
id: id(),
|
2019-05-27 13:51:49 +00:00
|
|
|
}, db
|
|
|
|
}
|
|
|
|
|
|
|
|
func (db *BoltDatabase) MemCopy() Database {
|
|
|
|
logger := log.New("database", "in-memory")
|
|
|
|
|
|
|
|
// Open the db and recover any potential corruptions
|
|
|
|
mem, err := bolt.Open("in-memory", 0600, &bolt.Options{MemOnly: true})
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := db.db.View(func(readTx *bolt.Tx) error {
|
|
|
|
return readTx.ForEach(func(name []byte, b *bolt.Bucket) error {
|
|
|
|
return mem.Update(func(writeTx *bolt.Tx) error {
|
|
|
|
newBucketToWrite, err := writeTx.CreateBucket(name, true)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return b.ForEach(func(k, v []byte) error {
|
2020-04-11 13:28:15 +00:00
|
|
|
if err := newBucketToWrite.Put(common.CopyBytes(k), common.CopyBytes(v)); err != nil {
|
2019-05-27 13:51:49 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
return &BoltDatabase{
|
|
|
|
db: mem,
|
|
|
|
log: logger,
|
2019-12-10 13:12:21 +00:00
|
|
|
id: id(),
|
2019-05-27 13:51:49 +00:00
|
|
|
}
|
|
|
|
}
|