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, "e, &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 }