github.com/status-im/status-go@v1.1.0/rpc/chain/rpc_limiter_db.go (about)

     1  package chain
     2  
     3  import (
     4  	"database/sql"
     5  	"time"
     6  )
     7  
     8  type RPCLimiterDB struct {
     9  	db *sql.DB
    10  }
    11  
    12  func NewRPCLimiterDB(db *sql.DB) *RPCLimiterDB {
    13  	return &RPCLimiterDB{
    14  		db: db,
    15  	}
    16  }
    17  
    18  func (r *RPCLimiterDB) CreateRPCLimit(limit LimitData) error {
    19  	query := `INSERT INTO rpc_limits (tag, created_at, period, max_requests, counter) VALUES (?, ?, ?, ?, ?)`
    20  	_, err := r.db.Exec(query, limit.Tag, limit.CreatedAt.Unix(), limit.Period, limit.MaxReqs, limit.NumReqs)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	return nil
    25  }
    26  
    27  func (r *RPCLimiterDB) GetRPCLimit(tag string) (*LimitData, error) {
    28  	query := `SELECT tag, created_at, period, max_requests, counter FROM rpc_limits WHERE tag = ?`
    29  	row := r.db.QueryRow(query, tag)
    30  	limit := &LimitData{}
    31  	createdAtSecs := int64(0)
    32  	err := row.Scan(&limit.Tag, &createdAtSecs, &limit.Period, &limit.MaxReqs, &limit.NumReqs)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	limit.CreatedAt = time.Unix(createdAtSecs, 0)
    38  	return limit, nil
    39  }
    40  
    41  func (r *RPCLimiterDB) UpdateRPCLimit(limit LimitData) error {
    42  	query := `UPDATE rpc_limits SET created_at = ?, period = ?, max_requests = ?, counter = ? WHERE tag = ?`
    43  	_, err := r.db.Exec(query, limit.CreatedAt.Unix(), limit.Period, limit.MaxReqs, limit.NumReqs, limit.Tag)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	return nil
    48  }
    49  
    50  func (r *RPCLimiterDB) DeleteRPCLimit(tag string) error {
    51  	query := `DELETE FROM rpc_limits WHERE tag = ?`
    52  	_, err := r.db.Exec(query, tag)
    53  	if err != nil && err != sql.ErrNoRows {
    54  		return err
    55  	}
    56  	return nil
    57  }