github.com/status-im/status-go@v1.1.0/protocol/transport/persistence.go (about)

     1  package transport
     2  
     3  import (
     4  	"database/sql"
     5  	"fmt"
     6  )
     7  
     8  type SqlitePersistence struct {
     9  	db        *sql.DB
    10  	tableName string
    11  }
    12  
    13  func newSQLitePersistence(db *sql.DB, tableName string) *SqlitePersistence {
    14  	return &SqlitePersistence{db: db, tableName: tableName}
    15  }
    16  
    17  func (s *SqlitePersistence) Add(chatID string, key []byte) error {
    18  	// tableName controlled by us
    19  	statement := fmt.Sprintf("INSERT INTO %s(chat_id, key) VALUES(?, ?)", s.tableName) // nolint:gosec
    20  	stmt, err := s.db.Prepare(statement)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	defer stmt.Close()
    25  
    26  	_, err = stmt.Exec(chatID, key)
    27  	return err
    28  }
    29  
    30  func (s *SqlitePersistence) All() (map[string][]byte, error) {
    31  	keys := make(map[string][]byte)
    32  
    33  	// tableName controlled by us
    34  	statement := fmt.Sprintf("SELECT chat_id, key FROM %s", s.tableName) // nolint: gosec
    35  
    36  	stmt, err := s.db.Prepare(statement)
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  	defer stmt.Close()
    41  
    42  	rows, err := stmt.Query()
    43  	if err != nil && err != sql.ErrNoRows {
    44  		return nil, err
    45  	}
    46  	defer rows.Close()
    47  
    48  	for rows.Next() {
    49  		var (
    50  			chatID string
    51  			key    []byte
    52  		)
    53  
    54  		err := rows.Scan(&chatID, &key)
    55  		if err != nil {
    56  			return nil, err
    57  		}
    58  		keys[chatID] = key
    59  	}
    60  
    61  	return keys, nil
    62  }