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, ¶meter, 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, ¶meters, 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 }