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  }