decred.org/dcrdex@v1.0.5/server/db/driver/pg/markets.go (about)

     1  // This code is available on the terms of the project LICENSE.md file,
     2  // also available online at https://blueoakcouncil.org/license/1.0.0.
     3  
     4  package pg
     5  
     6  import (
     7  	"database/sql"
     8  	"fmt"
     9  	"strings"
    10  
    11  	"decred.org/dcrdex/dex"
    12  	"decred.org/dcrdex/dex/candles"
    13  	"decred.org/dcrdex/server/db/driver/pg/internal"
    14  )
    15  
    16  func loadMarkets(db sqlQueryer, marketsTableName string) ([]*dex.MarketInfo, error) {
    17  	stmt := fmt.Sprintf(internal.SelectAllMarkets, marketsTableName)
    18  	rows, err := db.Query(stmt)
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  	defer rows.Close()
    23  
    24  	var mkts []*dex.MarketInfo
    25  	for rows.Next() {
    26  		var name string
    27  		var base, quote uint32
    28  		var lotSize uint64
    29  		err = rows.Scan(&name, &base, &quote, &lotSize)
    30  		if err != nil {
    31  			return nil, err
    32  		}
    33  		mkts = append(mkts, &dex.MarketInfo{
    34  			Name:    name,
    35  			Base:    base,
    36  			Quote:   quote,
    37  			LotSize: lotSize,
    38  		})
    39  	}
    40  
    41  	if err = rows.Err(); err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	return mkts, nil
    46  }
    47  
    48  func newMarket(db *sql.DB, marketsTableName string, mkt *dex.MarketInfo) error {
    49  	stmt := fmt.Sprintf(internal.InsertMarket, marketsTableName)
    50  	res, err := db.Exec(stmt, mkt.Name, mkt.Base, mkt.Quote, mkt.LotSize)
    51  	if err != nil {
    52  		return err
    53  	}
    54  	N, err := res.RowsAffected()
    55  	if err != nil {
    56  		return err
    57  	}
    58  	if N != 1 {
    59  		return fmt.Errorf("failed to insert market, %d rows affected", N)
    60  	}
    61  	return nil
    62  }
    63  
    64  func createMarketTables(db *sql.DB, marketName string) error {
    65  	marketUID := marketSchema(marketName)
    66  	newMarket, err := createSchema(db, marketUID)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	if newMarket {
    71  		log.Debugf("Created new market schema %q", marketUID)
    72  	} else {
    73  		log.Tracef("Market schema %q already exists.", marketUID)
    74  	}
    75  
    76  	for _, c := range createMarketTableStatements {
    77  		newTable, err := createTable(db, marketUID, c.name)
    78  		if err != nil {
    79  			return err
    80  		}
    81  		if newTable && !newMarket {
    82  			log.Warnf(`Created missing table "%s" for existing market %s.`,
    83  				c.name, marketUID)
    84  		}
    85  	}
    86  
    87  	// Create tables for the candles.
    88  	for _, binSize := range append(candles.BinSizes, "epoch") {
    89  		if _, err := createTableStmt(db, internal.CreateCandlesTable, marketUID, candlesTableName+"_"+binSize); err != nil {
    90  			return err
    91  		}
    92  	}
    93  
    94  	return nil
    95  }
    96  
    97  // marketSchema replaces the special token symbol character '.' with the allowed
    98  // PostgreSQL character '$'.
    99  func marketSchema(marketName string) string {
   100  	return strings.ReplaceAll(marketName, ".", "TKN")
   101  }