internal Message GetSelectDatabaseCommand(int targetDatabase, Message message) { if (targetDatabase < 0) { return(null); } if (targetDatabase != currentDatabase) { var serverEndpoint = Bridge.ServerEndPoint; int available = serverEndpoint.Databases; if (!serverEndpoint.HasDatabases) // only db0 is available on cluster/twemproxy { if (targetDatabase != 0) { // should never see this, since the API doesn't allow it; thus not too worried about ExceptionFactory throw new RedisCommandException("Multiple databases are not supported on this server; cannot switch to database: " + targetDatabase); } return(null); } if (message.Command == RedisCommand.SELECT) { // this could come from an EVAL/EVALSHA inside a transaction, for example; we'll accept it Bridge.Trace("Switching database: " + targetDatabase); currentDatabase = targetDatabase; return(null); } if (TransactionActive) {// should never see this, since the API doesn't allow it; thus not too worried about ExceptionFactory throw new RedisCommandException("Multiple databases inside a transaction are not currently supported: " + targetDatabase); } if (available != 0 && targetDatabase >= available) // we positively know it is out of range { throw ExceptionFactory.DatabaseOutfRange(Multiplexer.IncludeDetailInExceptions, targetDatabase, message, serverEndpoint); } Bridge.Trace("Switching database: " + targetDatabase); currentDatabase = targetDatabase; return(GetSelectDatabaseCommand(targetDatabase)); } return(null); }