resp_database.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Author: simon (ynwdlxm@163.com)
  2. // Date: 2025/9/25 11:27
  3. // Desc: 处理 RESP-SPEC 命令
  4. package database
  5. import (
  6. "strconv"
  7. "strings"
  8. "github.com/runningwater/go-redis/config"
  9. "github.com/runningwater/go-redis/interface/resp"
  10. "github.com/runningwater/go-redis/lib/logger"
  11. "github.com/runningwater/go-redis/resp/reply"
  12. )
  13. type Database struct {
  14. dbSet []*DB
  15. }
  16. func NewDatabase() *Database {
  17. if config.Properties.Databases == 0 {
  18. config.Properties.Databases = 16
  19. }
  20. dbs := &Database{}
  21. dbs.dbSet = make([]*DB, config.Properties.Databases)
  22. for i := range dbs.dbSet {
  23. db := NewDB()
  24. db.index = i
  25. dbs.dbSet[i] = db
  26. }
  27. return dbs
  28. }
  29. func (d *Database) Exec(client resp.Connection, args [][]byte) resp.Reply {
  30. defer func() {
  31. if err := recover(); err != nil {
  32. logger.Error(err)
  33. }
  34. }()
  35. cmdName := strings.ToLower(string(args[0]))
  36. if cmdName == "select" {
  37. if len(args) != 2 {
  38. return reply.NewErrReply("ERR wrong number of arguments for 'select' command")
  39. }
  40. return execSelect(client, d, args[1:])
  41. } else if cmdName == "command" {
  42. return reply.NewOkReply()
  43. }
  44. index := client.GetDBIndex()
  45. return d.dbSet[index].Exec(client, args)
  46. }
  47. func (d *Database) Close() {
  48. // TODO implement me
  49. }
  50. func (d *Database) AfterClientClose(client resp.Connection) {
  51. // TODO implement me
  52. }
  53. // select db 命令
  54. func execSelect(c resp.Connection, database *Database, args [][]byte) resp.Reply {
  55. dbIndex, err := strconv.Atoi(string(args[0]))
  56. if err != nil {
  57. return reply.NewErrReply("ERR invalid DB index")
  58. }
  59. if dbIndex >= len(database.dbSet) {
  60. return reply.NewErrReply("ERR DB index is out of range")
  61. }
  62. c.SelectDB(dbIndex)
  63. return reply.NewOkReply()
  64. }