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 }