code.vegaprotocol.io/vega@v0.79.0/datanode/sqlstore/network_parameters.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package sqlstore
    17  
    18  import (
    19  	"context"
    20  	"fmt"
    21  	"sync"
    22  
    23  	"code.vegaprotocol.io/vega/datanode/entities"
    24  	"code.vegaprotocol.io/vega/datanode/metrics"
    25  	v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2"
    26  
    27  	"github.com/georgysavva/scany/pgxscan"
    28  )
    29  
    30  type NetworkParameters struct {
    31  	*ConnectionSource
    32  	cacheLock sync.Mutex
    33  	cache     map[string]entities.NetworkParameter
    34  }
    35  
    36  var networkParameterOrdering = TableOrdering{
    37  	ColumnOrdering{Name: "key", Sorting: ASC},
    38  }
    39  
    40  func NewNetworkParameters(connectionSource *ConnectionSource) *NetworkParameters {
    41  	p := &NetworkParameters{
    42  		ConnectionSource: connectionSource,
    43  		cache:            map[string]entities.NetworkParameter{},
    44  	}
    45  	return p
    46  }
    47  
    48  func (np *NetworkParameters) Add(ctx context.Context, r entities.NetworkParameter) error {
    49  	np.cacheLock.Lock()
    50  	defer np.cacheLock.Unlock()
    51  
    52  	defer metrics.StartSQLQuery("NetworkParameters", "Add")()
    53  	_, err := np.Exec(ctx,
    54  		`INSERT INTO network_parameters(
    55  			key,
    56  			value,
    57  			tx_hash,
    58  			vega_time)
    59  		 VALUES ($1, $2, $3, $4)
    60  		 ON CONFLICT (key, vega_time) DO UPDATE SET
    61  			value = EXCLUDED.value,
    62  			tx_hash = EXCLUDED.tx_hash;
    63  		 `,
    64  		r.Key, r.Value, r.TxHash, r.VegaTime)
    65  
    66  	np.cache[r.Key] = r
    67  
    68  	return err
    69  }
    70  
    71  func (np *NetworkParameters) GetByKey(ctx context.Context, key string) (entities.NetworkParameter, error) {
    72  	defer metrics.StartSQLQuery("NetworkParameters", "GetByKey")()
    73  	np.cacheLock.Lock()
    74  	defer np.cacheLock.Unlock()
    75  
    76  	var parameter entities.NetworkParameter
    77  	if value, ok := np.cache[key]; ok {
    78  		return value, nil
    79  	}
    80  
    81  	query := `SELECT * FROM network_parameters_current where key = $1`
    82  	defer metrics.StartSQLQuery("NetworkParameters", "GetByKey")()
    83  	err := pgxscan.Get(ctx, np.ConnectionSource, &parameter, query, key)
    84  	if err != nil {
    85  		return entities.NetworkParameter{}, np.wrapE(err)
    86  	}
    87  
    88  	np.cache[parameter.Key] = parameter
    89  	return parameter, nil
    90  }
    91  
    92  func (np *NetworkParameters) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.NetworkParameter, error) {
    93  	defer metrics.StartSQLQuery("NetworkParameters", "GetByTxHash")()
    94  
    95  	var parameters []entities.NetworkParameter
    96  	query := `SELECT * FROM network_parameters WHERE tx_hash = $1`
    97  
    98  	err := pgxscan.Select(ctx, np.ConnectionSource, &parameters, query, txHash)
    99  	if err != nil {
   100  		return nil, np.wrapE(err)
   101  	}
   102  
   103  	return parameters, nil
   104  }
   105  
   106  func (np *NetworkParameters) GetAll(ctx context.Context, pagination entities.CursorPagination) ([]entities.NetworkParameter, entities.PageInfo, error) {
   107  	defer metrics.StartSQLQuery("NetworkParameters", "GetAll")()
   108  	var pageInfo entities.PageInfo
   109  
   110  	// we are ordering by key so we aren't going to change the sort order for newest first
   111  	// therefore we just set it to default to false in case it's true in the request
   112  	if pagination.NewestFirst {
   113  		pagination.NewestFirst = false
   114  	}
   115  
   116  	var (
   117  		nps  []entities.NetworkParameter
   118  		args []interface{}
   119  		err  error
   120  	)
   121  	query := `SELECT * FROM network_parameters_current`
   122  	query, args, err = PaginateQuery[entities.NetworkParameterCursor](query, args, networkParameterOrdering, pagination)
   123  	if err != nil {
   124  		return nil, pageInfo, err
   125  	}
   126  
   127  	if err = pgxscan.Select(ctx, np.ConnectionSource, &nps, query, args...); err != nil {
   128  		return nil, pageInfo, fmt.Errorf("could not get network parameters: %w", err)
   129  	}
   130  
   131  	nps, pageInfo = entities.PageEntities[*v2.NetworkParameterEdge](nps, pagination)
   132  	return nps, pageInfo, nil
   133  }