Skip to content

Commit

Permalink
Merge branch 'cosmos/v0.47.x' of https://github.com/forbole/juno into…
Browse files Browse the repository at this point in the history
… cosmos/v0.46.x
  • Loading branch information
MonikaCat committed Aug 14, 2023
2 parents efaece3 + f69e539 commit 9b070d0
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 243 deletions.
99 changes: 78 additions & 21 deletions database/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,59 +8,116 @@ type Config struct {
MaxIdleConnections int `yaml:"max_idle_connections"`
PartitionSize int64 `yaml:"partition_size"`
PartitionBatchSize int64 `yaml:"partition_batch"`
SSLModeEnable string `yaml:"ssl_mode_enable"`
SSLRootCert string `yaml:"ssl_root_cert"`
SSLCert string `yaml:"ssl_cert"`
SSLKey string `yaml:"ssl_key"`
}

func (c *Config) getURL() *url.URL {
func NewDatabaseConfig(
url, sslModeEnable, sslRootCert, sslCert, sslKey string,
maxOpenConnections int, maxIdleConnections int,
partitionSize int64, batchSize int64,
) Config {
return Config{
URL: url,
MaxOpenConnections: maxOpenConnections,
MaxIdleConnections: maxIdleConnections,
PartitionSize: partitionSize,
PartitionBatchSize: batchSize,
SSLModeEnable: sslModeEnable,
SSLRootCert: sslRootCert,
SSLCert: sslCert,
SSLKey: sslKey,
}
}

func (c Config) WithURL(url string) Config {
c.URL = url
return c
}

func (c Config) WithMaxOpenConnections(maxOpenConnections int) Config {
c.MaxOpenConnections = maxOpenConnections
return c
}

func (c Config) WithMaxIdleConnections(maxIdleConnections int) Config {
c.MaxIdleConnections = maxIdleConnections
return c
}

func (c Config) WithPartitionSize(partitionSize int64) Config {
c.PartitionSize = partitionSize
return c
}

func (c Config) WithPartitionBatchSize(partitionBatchSize int64) Config {
c.PartitionBatchSize = partitionBatchSize
return c
}

func (c Config) WithSSLModeEnable(sslModeEnable string) Config {
c.SSLModeEnable = sslModeEnable
return c
}

func (c Config) WithSSLRootCert(sslRootCert string) Config {
c.SSLRootCert = sslRootCert
return c
}

func (c Config) WithSSLCert(sslCert string) Config {
c.SSLCert = sslCert
return c
}

func (c Config) WithSSLKey(sslKey string) Config {
c.SSLKey = sslKey
return c
}

func (c Config) getURL() *url.URL {
parsedURL, err := url.Parse(c.URL)
if err != nil {
panic(err)
}
return parsedURL
}

func (c *Config) GetUser() string {
func (c Config) GetUser() string {
return c.getURL().User.Username()
}

func (c *Config) GetPassword() string {
func (c Config) GetPassword() string {
password, _ := c.getURL().User.Password()
return password
}

func (c *Config) GetHost() string {
func (c Config) GetHost() string {
return c.getURL().Host
}

func (c *Config) GetPort() string {
func (c Config) GetPort() string {
return c.getURL().Port()
}

func (c *Config) GetSchema() string {
func (c Config) GetSchema() string {
return c.getURL().Query().Get("search_path")
}

func (c *Config) GetSSLMode() string {
func (c Config) GetSSLMode() string {
return c.getURL().Query().Get("sslmode")
}

func NewDatabaseConfig(
url string,
maxOpenConnections int, maxIdleConnections int,
partitionSize int64, batchSize int64,
) Config {
return Config{
URL: url,
MaxOpenConnections: maxOpenConnections,
MaxIdleConnections: maxIdleConnections,
PartitionSize: partitionSize,
PartitionBatchSize: batchSize,
}
}

// DefaultDatabaseConfig returns the default instance of Config
func DefaultDatabaseConfig() Config {
return NewDatabaseConfig(
"postgresql://user:password@localhost:5432/database-name?sslmode=disable&search_path=public",
"false",
"",
"",
"",
1,
1,
100000,
Expand Down
48 changes: 32 additions & 16 deletions database/postgresql/postgresql.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import (
"fmt"
"strings"

"github.com/cosmos/cosmos-sdk/codec"
"github.com/jmoiron/sqlx"

"github.com/forbole/juno/v4/logging"

"github.com/cosmos/cosmos-sdk/simapp/params"
"github.com/lib/pq"

"github.com/forbole/juno/v4/database"
Expand All @@ -24,7 +24,19 @@ import (
// from config. It returns a database connection handle or an error if the
// connection fails.
func Builder(ctx *database.Context) (database.Database, error) {
postgresDb, err := sqlx.Open("postgres", utils.GetEnvOr(env.DatabaseURI, ctx.Cfg.URL))
dbURI := utils.GetEnvOr(env.DatabaseURI, ctx.Cfg.URL)
dbEnableSSL := utils.GetEnvOr(env.DatabaseSSLModeEnable, ctx.Cfg.SSLModeEnable)

// Configure SSL certificates (optional)
if dbEnableSSL == "true" {
dbRootCert := utils.GetEnvOr(env.DatabaseSSLRootCert, ctx.Cfg.SSLRootCert)
dbCert := utils.GetEnvOr(env.DatabaseSSLCert, ctx.Cfg.SSLCert)
dbKey := utils.GetEnvOr(env.DatabaseSSLKey, ctx.Cfg.SSLKey)
dbURI += fmt.Sprintf(" sslmode=require sslrootcert=%s sslcert=%s sslkey=%s",
dbRootCert, dbCert, dbKey)
}

postgresDb, err := sqlx.Open("postgres", dbURI)
if err != nil {
return nil, err
}
Expand All @@ -34,9 +46,11 @@ func Builder(ctx *database.Context) (database.Database, error) {
postgresDb.SetMaxIdleConns(ctx.Cfg.MaxIdleConnections)

return &Database{
SQL: postgresDb,
EncodingConfig: ctx.EncodingConfig,
Logger: ctx.Logger,
Cdc: ctx.EncodingConfig.Codec,
Amino: ctx.EncodingConfig.Amino,

SQL: postgresDb,
Logger: ctx.Logger,
}, nil
}

Expand All @@ -46,13 +60,15 @@ var _ database.Database = &Database{}
// Database defines a wrapper around a SQL database and implements functionality
// for data aggregation and exporting.
type Database struct {
SQL *sqlx.DB
EncodingConfig *params.EncodingConfig
Logger logging.Logger
Cdc codec.Codec
Amino *codec.LegacyAmino

SQL *sqlx.DB
Logger logging.Logger
}

// createPartitionIfNotExists creates a new partition having the given partition id if not existing
func (db *Database) createPartitionIfNotExists(table string, partitionID int64) error {
// CreatePartitionIfNotExists creates a new partition having the given partition id if not existing
func (db *Database) CreatePartitionIfNotExists(table string, partitionID int64) error {
partitionTable := fmt.Sprintf("%s_%d", table, partitionID)

stmt := fmt.Sprintf(
Expand Down Expand Up @@ -143,7 +159,7 @@ func (db *Database) SaveTx(tx *types.Tx) error {
partitionSize := config.Cfg.Database.PartitionSize
if partitionSize > 0 {
partitionID = tx.Height / partitionSize
err := db.createPartitionIfNotExists("transaction", partitionID)
err := db.CreatePartitionIfNotExists("transaction", partitionID)
if err != nil {
return err
}
Expand Down Expand Up @@ -178,30 +194,30 @@ ON CONFLICT (hash, partition_id) DO UPDATE

var msgs = make([]string, len(tx.Body.Messages))
for index, msg := range tx.Body.Messages {
bz, err := db.EncodingConfig.Codec.MarshalJSON(msg)
bz, err := db.Cdc.MarshalJSON(msg)
if err != nil {
return err
}
msgs[index] = string(bz)
}
msgsBz := fmt.Sprintf("[%s]", strings.Join(msgs, ","))

feeBz, err := db.EncodingConfig.Codec.MarshalJSON(tx.AuthInfo.Fee)
feeBz, err := db.Cdc.MarshalJSON(tx.AuthInfo.Fee)
if err != nil {
return fmt.Errorf("failed to JSON encode tx fee: %s", err)
}

var sigInfos = make([]string, len(tx.AuthInfo.SignerInfos))
for index, info := range tx.AuthInfo.SignerInfos {
bz, err := db.EncodingConfig.Codec.MarshalJSON(info)
bz, err := db.Cdc.MarshalJSON(info)
if err != nil {
return err
}
sigInfos[index] = string(bz)
}
sigInfoBz := fmt.Sprintf("[%s]", strings.Join(sigInfos, ","))

logsBz, err := db.EncodingConfig.Amino.MarshalJSON(tx.Logs)
logsBz, err := db.Amino.MarshalJSON(tx.Logs)
if err != nil {
return err
}
Expand Down Expand Up @@ -274,7 +290,7 @@ func (db *Database) SaveMessage(msg *types.Message) error {
partitionSize := config.Cfg.Database.PartitionSize
if partitionSize > 0 {
partitionID = msg.Height / partitionSize
err := db.createPartitionIfNotExists("message", partitionID)
err := db.CreatePartitionIfNotExists("message", partitionID)
if err != nil {
return err
}
Expand Down
15 changes: 6 additions & 9 deletions database/postgresql/postgresql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"strings"
"testing"

"github.com/cosmos/cosmos-sdk/simapp"
"github.com/cosmos/cosmos-sdk/simapp/params"
"github.com/stretchr/testify/suite"

"github.com/forbole/juno/v4/database"
Expand All @@ -29,16 +29,13 @@ type DbTestSuite struct {

func (suite *DbTestSuite) SetupTest() {
// Create the codec
codec := simapp.MakeTestEncodingConfig()
codec := params.MakeTestEncodingConfig()

// Build the database config
dbCfg := databaseconfig.DefaultDatabaseConfig().
WithURL("postgres://bdjuno:password@localhost:6433/bdjuno?sslmode=disable&search_path=public")

// Build the database
dbCfg := databaseconfig.NewDatabaseConfig(
"postgres://bdjuno:password@localhost:6433/bdjuno?sslmode=disable&search_path=public",
-1,
-1,
100000,
100,
)
db, err := postgres.Builder(database.NewContext(dbCfg, &codec, logging.DefaultLogger()))
suite.Require().NoError(err)

Expand Down
Loading

0 comments on commit 9b070d0

Please sign in to comment.