text: ﻿/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
  * regarding copyright ownership.  The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
  
  #ifndef SELECTSERVANT_H
  #define SELECTSERVANT_H
  
  #include "redisservantgroup.h"
  
  #define POLICY_READ_BALANCE "read_balance"
  #define POLICY_MASTER_ONLY  "master_only"
  
  class ServantSelect
  {
  public:
      ServantSelect(void);
      ~ServantSelect(void);
      RedisServant* selectMaster(RedisServantGroup* g);
      RedisServant* selectSlave(RedisServantGroup* g);
  private:
      RedisServant* oneMaster(RedisServantGroup* g);
      RedisServant* oneSlave(RedisServantGroup* g);
  private:
      unsigned int m_masterCallNum;
      unsigned int m_slaveCallNum;
  };
  
  
  class ReadBalancePolicy : public RedisServantGroupPolicy
  {
  public:
      ReadBalancePolicy(void);
      ~ReadBalancePolicy(void);
      virtual RedisServant* selectServant(RedisServantGroup* g, ClientPacket* p);
  private:
      ServantSelect m_servantSelect;
      unsigned int  m_readCnt;
  };
  
  
  class MasterOnlyPolicy : public RedisServantGroupPolicy
  {
  public:
      MasterOnlyPolicy(void){}
      ~MasterOnlyPolicy(void){}
      virtual RedisServant* selectServant(RedisServantGroup* g, ClientPacket* p);
  private:
      ServantSelect m_servantSelect;
  };
  
  
  
  #endif
  
  
  