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 }