code.vegaprotocol.io/vega@v0.79.0/datanode/sqlstore/chain.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 21 "code.vegaprotocol.io/vega/datanode/entities" 22 "code.vegaprotocol.io/vega/datanode/metrics" 23 24 "github.com/georgysavva/scany/pgxscan" 25 "github.com/jackc/pgconn" 26 ) 27 28 type Chain struct { 29 *ConnectionSource 30 } 31 32 func NewChain(connectionSource *ConnectionSource) *Chain { 33 return &Chain{ 34 ConnectionSource: connectionSource, 35 } 36 } 37 38 func (c *Chain) Get(ctx context.Context) (entities.Chain, error) { 39 defer metrics.StartSQLQuery("Chain", "Get")() 40 chain := entities.Chain{} 41 42 query := `SELECT id from chain` 43 return chain, c.wrapE(pgxscan.Get(ctx, c.ConnectionSource, &chain, query)) 44 } 45 46 func (c *Chain) Set(ctx context.Context, chain entities.Chain) error { 47 defer metrics.StartSQLQuery("Chain", "Set")() 48 query := `INSERT INTO chain(id) VALUES($1)` 49 _, err := c.Exec(ctx, query, chain.ID) 50 if e, ok := err.(*pgconn.PgError); ok { 51 // 23505 is postgres error code for a unique constraint violation 52 if e.Code == "23505" { 53 return entities.ErrChainAlreadySet 54 } 55 } 56 return err 57 }