github.com/status-im/status-go@v1.1.0/services/wallet/currency/currency_db.go (about) 1 package currency 2 3 import ( 4 "context" 5 "database/sql" 6 ) 7 8 type DB struct { 9 db *sql.DB 10 } 11 12 func NewCurrencyDB(sqlDb *sql.DB) *DB { 13 return &DB{ 14 db: sqlDb, 15 } 16 } 17 18 func getCachedFormatsFromDBRows(rows *sql.Rows) (FormatPerSymbol, error) { 19 formats := make(FormatPerSymbol) 20 21 for rows.Next() { 22 var format Format 23 if err := rows.Scan(&format.Symbol, &format.DisplayDecimals, &format.StripTrailingZeroes); err != nil { 24 return nil, err 25 } 26 27 formats[format.Symbol] = format 28 } 29 30 return formats, nil 31 } 32 33 func (cdb *DB) GetCachedFormats() (FormatPerSymbol, error) { 34 rows, err := cdb.db.Query("SELECT symbol, display_decimals, strip_trailing_zeroes FROM currency_format_cache") 35 if err != nil { 36 return nil, err 37 } 38 defer rows.Close() 39 40 return getCachedFormatsFromDBRows(rows) 41 } 42 43 func (cdb *DB) UpdateCachedFormats(formats FormatPerSymbol) error { 44 tx, err := cdb.db.BeginTx(context.Background(), &sql.TxOptions{}) 45 if err != nil { 46 return err 47 } 48 49 defer func() { 50 if err == nil { 51 err = tx.Commit() 52 return 53 } 54 // don't shadow original error 55 _ = tx.Rollback() 56 }() 57 58 insert, err := tx.Prepare(`INSERT OR REPLACE INTO currency_format_cache 59 (symbol, display_decimals, strip_trailing_zeroes) 60 VALUES 61 (?, ?, ?)`) 62 if err != nil { 63 return err 64 } 65 66 for _, format := range formats { 67 _, err = insert.Exec(format.Symbol, format.DisplayDecimals, format.StripTrailingZeroes) 68 if err != nil { 69 return err 70 } 71 } 72 return nil 73 }