| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // Author: simon (ynwdlxm@163.com)
- // Date: 2025/9/25 11:27
- // Desc: 处理 RESP-SPEC 命令
- package database
- import (
- "strconv"
- "strings"
- "github.com/runningwater/go-redis/config"
- "github.com/runningwater/go-redis/interface/resp"
- "github.com/runningwater/go-redis/lib/logger"
- "github.com/runningwater/go-redis/resp/reply"
- )
- type Database struct {
- dbSet []*DB
- }
- func NewDatabase() *Database {
- if config.Properties.Databases == 0 {
- config.Properties.Databases = 16
- }
- dbs := &Database{}
- dbs.dbSet = make([]*DB, config.Properties.Databases)
- for i := range dbs.dbSet {
- db := NewDB()
- db.index = i
- dbs.dbSet[i] = db
- }
- return dbs
- }
- func (d *Database) Exec(client resp.Connection, args [][]byte) resp.Reply {
- defer func() {
- if err := recover(); err != nil {
- logger.Error(err)
- }
- }()
- cmdName := strings.ToLower(string(args[0]))
- if cmdName == "select" {
- if len(args) != 2 {
- return reply.NewErrReply("ERR wrong number of arguments for 'select' command")
- }
- return execSelect(client, d, args[1:])
- } else if cmdName == "command" {
- return reply.NewOkReply()
- }
- index := client.GetDBIndex()
- return d.dbSet[index].Exec(client, args)
- }
- func (d *Database) Close() {
- // TODO implement me
- }
- func (d *Database) AfterClientClose(client resp.Connection) {
- // TODO implement me
- }
- // select db 命令
- func execSelect(c resp.Connection, database *Database, args [][]byte) resp.Reply {
- dbIndex, err := strconv.Atoi(string(args[0]))
- if err != nil {
- return reply.NewErrReply("ERR invalid DB index")
- }
- if dbIndex >= len(database.dbSet) {
- return reply.NewErrReply("ERR DB index is out of range")
- }
- c.SelectDB(dbIndex)
- return reply.NewOkReply()
- }
|