* [10948]: Add changelog entry. * [10948]: Deprecate the types.DBBackend variable and the NewLevelDB function. Create a NewDB function to replace them. * [10948]: Add a DBBackend string to the simulation config and a flag for setting it. Update the simulation setup to use that instead of the compile-time DBBackend variable. * [10948]: Update the mock app creator to use the NewDB function. Not sure what to do about the db backend in that case though. * [10948]: Update changelog to reflect new db-backend field name. * [10948]: Use the tendermint db-backend type for the snapshot db. * [10948]: Update the last use of NewLevelDB by adding a parameter to openDB and uppdating calls to that to provide the db type to use. * [10948]: Upddate the NewDB function to also have a default db backend type if an empty string is provided there. * [10948]: Remove the new TODO in mock.NewApp. After looking through it's uses, there doesn't seem to be any desire to change it, and there's no easy way to communicate it. * [10948]: Enhance the NewDB defer function to also add info to any err that is being returned. * [10948]: Add some unit tests for NewDB. * [10948]: Lint fixes. * [10948]: Add a changelog entry to the deprecated section. * [10948]: Update the makefile to no longer set the types.DBBackend value. * [10948]: Use memdb for the mock app instead of goleveldb. I know it was a goleveldb before, but for a mock app, a memdb feels like a better choice (assuming 'mock' and 'mem' mean what I assume they mean). * [10948]: Fix the store benchmark tests (had some index-out-of-range issues). * [10948]: Fix cachekv store bench test calling iter.Key() before checking iter.Valid(). * [10948]: Remove the panic recovery from types.NewDB since dbm.NewDB returns an error now (it didn't originally, when NewLevelDB was first written). * [10948]: Add changlog entry indicationg an API breaking change due to the DBBackend change. * [10948]: Get rid of the types.NewDB function in favor of just using the tm-db version of it. * [10948]: Fix Update the codeql-analysis github action to use go v1.17. * [10948]: Add config file option for the app db backend type. * [10948]: Adjust the comment on the app-db-backend config entry to clarify fallback behavior. * [10948]: Add a default of GoLevelDBBackend to GetAppDBBackend. The old DBBackend variable defaulted to that, and some unit tests assume that behavior still exists. * [10948]: Add the missing quotes around the app-db-backend value. * [10948]: Small tweak to the changelog's deprecated entry. * Add the go version declaration back into the codeql-analysis github action. * [10948]: Update new use of openDB. * [10948]: Put a brief delay after closing the test network. Hopefully that helps with address-in-use and non-empty directory errors. Co-authored-by: Marko <marbar3778@yahoo.com>
109 lines
2.6 KiB
Go
109 lines
2.6 KiB
Go
package types
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
dbm "github.com/tendermint/tm-db"
|
|
)
|
|
|
|
var (
|
|
// This is set at compile time. Could be cleveldb, defaults is goleveldb.
|
|
DBBackend = "" // Deprecated: Use tendermint config's DBBackend value instead.
|
|
backend = dbm.GoLevelDBBackend
|
|
)
|
|
|
|
func init() {
|
|
if len(DBBackend) != 0 {
|
|
backend = dbm.BackendType(DBBackend)
|
|
}
|
|
}
|
|
|
|
// SortedJSON takes any JSON and returns it sorted by keys. Also, all white-spaces
|
|
// are removed.
|
|
// This method can be used to canonicalize JSON to be returned by GetSignBytes,
|
|
// e.g. for the ledger integration.
|
|
// If the passed JSON isn't valid it will return an error.
|
|
func SortJSON(toSortJSON []byte) ([]byte, error) {
|
|
var c interface{}
|
|
err := json.Unmarshal(toSortJSON, &c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
js, err := json.Marshal(c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return js, nil
|
|
}
|
|
|
|
// MustSortJSON is like SortJSON but panic if an error occurs, e.g., if
|
|
// the passed JSON isn't valid.
|
|
func MustSortJSON(toSortJSON []byte) []byte {
|
|
js, err := SortJSON(toSortJSON)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return js
|
|
}
|
|
|
|
// Uint64ToBigEndian - marshals uint64 to a bigendian byte slice so it can be sorted
|
|
func Uint64ToBigEndian(i uint64) []byte {
|
|
b := make([]byte, 8)
|
|
binary.BigEndian.PutUint64(b, i)
|
|
return b
|
|
}
|
|
|
|
// BigEndianToUint64 returns an uint64 from big endian encoded bytes. If encoding
|
|
// is empty, zero is returned.
|
|
func BigEndianToUint64(bz []byte) uint64 {
|
|
if len(bz) == 0 {
|
|
return 0
|
|
}
|
|
|
|
return binary.BigEndian.Uint64(bz)
|
|
}
|
|
|
|
// Slight modification of the RFC3339Nano but it right pads all zeros and drops the time zone info
|
|
const SortableTimeFormat = "2006-01-02T15:04:05.000000000"
|
|
|
|
// Formats a time.Time into a []byte that can be sorted
|
|
func FormatTimeBytes(t time.Time) []byte {
|
|
return []byte(t.UTC().Round(0).Format(SortableTimeFormat))
|
|
}
|
|
|
|
// Parses a []byte encoded using FormatTimeKey back into a time.Time
|
|
func ParseTimeBytes(bz []byte) (time.Time, error) {
|
|
str := string(bz)
|
|
t, err := time.Parse(SortableTimeFormat, str)
|
|
if err != nil {
|
|
return t, err
|
|
}
|
|
return t.UTC().Round(0), nil
|
|
}
|
|
|
|
// NewLevelDB instantiate a new LevelDB instance according to DBBackend.
|
|
//
|
|
// Deprecated: Use NewDB (from "github.com/tendermint/tm-db") instead. Suggested backendType is tendermint config's DBBackend value.
|
|
func NewLevelDB(name, dir string) (db dbm.DB, err error) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
err = fmt.Errorf("couldn't create db: %v", r)
|
|
}
|
|
}()
|
|
|
|
return dbm.NewDB(name, backend, dir)
|
|
}
|
|
|
|
// copy bytes
|
|
func CopyBytes(bz []byte) (ret []byte) {
|
|
if bz == nil {
|
|
return nil
|
|
}
|
|
ret = make([]byte, len(bz))
|
|
copy(ret, bz)
|
|
return ret
|
|
}
|