github.com/status-im/status-go@v1.1.0/services/ens/database.go (about)

     1  package ens
     2  
     3  import (
     4  	"database/sql"
     5  )
     6  
     7  type Database struct {
     8  	db *sql.DB
     9  }
    10  
    11  type UsernameDetail struct {
    12  	Username string `json:"username"`
    13  	ChainID  uint64 `json:"chainId"`
    14  	Clock    uint64 `json:"clock"`
    15  	Removed  bool   `json:"removed"`
    16  }
    17  
    18  func NewEnsDatabase(db *sql.DB) *Database {
    19  	return &Database{db: db}
    20  }
    21  
    22  func (db *Database) GetEnsUsernames(removed *bool) (result []*UsernameDetail, err error) {
    23  
    24  	var sqlQuery = `SELECT username, chain_id, clock, removed  
    25  					  FROM ens_usernames`
    26  
    27  	var rows *sql.Rows
    28  	if removed == nil {
    29  		rows, err = db.db.Query(sqlQuery)
    30  	} else {
    31  		sqlQuery += " WHERE removed = ?"
    32  		rows, err = db.db.Query(sqlQuery, removed)
    33  	}
    34  
    35  	if err != nil {
    36  		return result, err
    37  	}
    38  
    39  	defer rows.Close()
    40  
    41  	for rows.Next() {
    42  		var ensUsername UsernameDetail
    43  		err = rows.Scan(&ensUsername.Username, &ensUsername.ChainID, &ensUsername.Clock, &ensUsername.Removed)
    44  		if err != nil {
    45  			return nil, err
    46  		}
    47  		result = append(result, &ensUsername)
    48  	}
    49  
    50  	return result, nil
    51  }
    52  
    53  func (db *Database) AddEnsUsername(details *UsernameDetail) error {
    54  	const sqlQuery = `INSERT OR REPLACE INTO ens_usernames(username, chain_id, clock, removed)
    55  					  VALUES (?, ?, ?, ?)`
    56  	_, err := db.db.Exec(sqlQuery, details.Username, details.ChainID, details.Clock, details.Removed)
    57  	return err
    58  }
    59  
    60  func (db *Database) RemoveEnsUsername(details *UsernameDetail) (bool, error) {
    61  	const sqlQuery = `UPDATE ens_usernames SET removed = 1, clock = ?  
    62  					  WHERE username = (?) AND chain_id = ?`
    63  	result, err := db.db.Exec(sqlQuery, details.Clock, details.Username, details.ChainID)
    64  	if err != nil {
    65  		return false, err
    66  	}
    67  	n, err := result.RowsAffected()
    68  	if err != nil {
    69  		return false, err
    70  	}
    71  	return n > 0, nil
    72  }
    73  
    74  func (db *Database) SaveOrUpdateEnsUsername(details *UsernameDetail) error {
    75  	const sqlQuery = `INSERT OR REPLACE INTO ens_usernames (username, chain_id, clock, removed)
    76  SELECT ?, ?, ?, ?
    77  WHERE NOT EXISTS (SELECT 1 FROM ens_usernames WHERE username = ? AND chain_id = ? AND clock >= ?);`
    78  
    79  	_, err := db.db.Exec(sqlQuery, details.Username, details.ChainID, details.Clock, details.Removed, details.Username, details.ChainID, details.Clock)
    80  	return err
    81  }