// Author: simon (ynwdlxm@163.com) // Date: 2025/9/25 11:27 // Desc: 处理 RESP-SPEC 命令 package database import ( "strconv" "strings" "github.com/runningwater/go-redis/aof" "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 aofHandler *aof.Handler } func NewDatabase() *Database { if config.Properties.Databases == 0 { config.Properties.Databases = 16 } database := &Database{} database.dbSet = make([]*DB, config.Properties.Databases) // 初始化数据库集合 for i := range database.dbSet { db := NewDB() db.index = i database.dbSet[i] = db } if config.Properties.AppendOnly { aofHandler, err := aof.NewAofHandler(database) if err != nil { panic(err) } database.aofHandler = aofHandler } for _, db := range database.dbSet { d := db d.addAof = func(line CmdLine) { database.aofHandler.AddAof(d.index, line) } } return database } 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 } // execSelect 处理数据库选择命令 // // 参数: // // c: 客户端连接对象,用于执行数据库切换操作 // database: 数据库实例,包含所有可用的数据库集合 // args: 命令参数,第一个参数为要选择的数据库索引 // // 返回值: // // resp.Reply: 执行结果回复,成功返回OK,失败返回错误信息 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() }