/**
  * 取得所有游戏类型
  */
 public function gameAction()
 {
     $gameTypes = array();
     $user = new ZtChart_Model_User($this->_getParam('uname'));
     if ($user->isActive() && $user->getTokenring() == $this->_getParam('token')) {
         $allowedGameTypes = $user->getRole()->getGameTypes(true);
         // 取趣乐的游戏类型
         $qule = new ZtChart_Model_Qule();
         foreach ($qule->getGametype() as $gameType) {
             if (in_array($gameType['game_code'], $allowedGameTypes)) {
                 if (!is_integer($gameType['game_code'])) {
                     $gameType['game_code'] = (int) $gameType['game_code'];
                 }
                 $gameTypes[] = $gameType;
             }
         }
         // 取InfoServer的游戏类型
         $infoServerGameTypes = ZtChart_Model_DbTable_Infoserver::getInfoserverGameTypes();
         foreach (ZtChart_Model_GameType::getLongNames() as $gameType => $gameName) {
             if (in_array($gameType, $allowedGameTypes) && in_array($gameType, $infoServerGameTypes) && !ZtChart_Model_GameType::isQule($gameType)) {
                 $gameTypes[] = array('game_code' => $gameType, 'game_name' => $gameName);
             }
         }
     }
     $this->_helper->json($gameTypes);
 }
 /**
  * 设置所有游戏的Infoserver数据库适配器
  * 
  * @static
  * @param array $adapters
  */
 public static function setInfoserverAdapters($adapters)
 {
     self::$_infoServerAdapters = $adapters;
 }
 /**
  * 在线人数曲线
  */
 public function chartAction()
 {
     $data = array();
     // 当前时间戳
     $nowOffsetTimestamp = Zend_Date::now()->subMinute(abs($this->_getParam('offset')))->getTimestamp();
     foreach ($this->_getParam('allowedGameTypes') as $gameType) {
         if (ZtChart_Model_GameType::isQule($gameType)) {
             // 取Qule游戏的数据
             $qule = new ZtChart_Model_Qule();
             // 取当前偏移量的数据
             $nowData = $qule->getGamedata(array('gametype' => $gameType, 'zoneid' => $this->_getParam('zoneid'), 'loadnumber' => $this->_getParam('range'), 'querydate' => $nowOffsetTimestamp));
             if (array_key_exists('data', $nowData) && !empty($nowData['data'])) {
                 foreach ($nowData['data'] as $item) {
                     $data['datetime'][] = $item[0];
                     $data['data'][0][] = $item[1];
                 }
             }
             // 取同比偏移量的数据
             if ($this->_hasParam('pdate')) {
                 foreach (explode(',', $this->_getParam('pdate')) as $pdate) {
                     $sameOffsetTimestamp = ZtChart_Model_Assemble_Datetime::getPredefinedStartTimestamp($pdate, $nowOffsetTimestamp);
                     $sameData = $qule->getGamedata(array('gametype' => $gameType, 'zoneid' => $this->_getParam('zoneid'), 'loadnumber' => $this->_getParam('range'), 'querydate' => $sameOffsetTimestamp));
                     if (array_key_exists('data', $sameData) && !empty($sameData['data'])) {
                         foreach ($sameData['data'] as $item) {
                             $data['data'][$pdate][] = $item[1];
                         }
                     }
                 }
             }
         } else {
             // 取InfoServer中的数据
             try {
                 if (ZtChart_Model_DbTable_Infoserver::isSingleAdapter($gameType)) {
                     // 游戏只有一个数据库的情况
                     $infoserver = ZtChart_Model_DbTable_Infoserver::factory($gameType);
                     // 取当前偏移量的数据
                     $nowOffsetDate = new Zend_Date($nowOffsetTimestamp);
                     $startNowOffsetTimestamp = $nowOffsetDate->subMinute($this->_getParam('range'))->getTimestamp();
                     for ($i = 0; $i < $this->_getParam('range'); $i++) {
                         $data['datetime'][$i] = $startNowOffsetTimestamp + $i * 60;
                         $data['tmp'][$i] = date('H:i', $data['datetime'][$i]);
                     }
                     foreach ($infoserver->fetchSumGroup($startNowOffsetTimestamp) as $item) {
                         if (in_array(date('H:i', $item[0]), $data['tmp'])) {
                             $data['data'][0][] = $item[1];
                         } else {
                             $data['data'][0][] = -1;
                         }
                     }
                     $data['data'][0] = array_pad($data['data'][0], $this->_getParam('range'), -1);
                     // 取同比偏移量的数据
                     if ($this->_hasParam('pdate')) {
                         foreach (explode(',', $this->_getParam('pdate')) as $pdate) {
                             $startSameOffsetTimestamp = ZtChart_Model_Assemble_Datetime::getPredefinedStartTimestamp($pdate, $startNowOffsetTimestamp);
                             $infoserver->setTablename($startSameOffsetTimestamp);
                             foreach ($infoserver->fetchSumGroup($startSameOffsetTimestamp, $this->_getParam('range')) as $item) {
                                 if (in_array(date('H:i', $item[0]), $data['tmp'])) {
                                     $data['data'][$pdate][] = $item[1];
                                 } else {
                                     $data['data'][$pdate][] = -1;
                                 }
                             }
                             $data['data'][$pdate] = array_pad($data['data'][$pdate], $this->_getParam('range'), -1);
                         }
                     }
                     unset($data['tmp']);
                 } else {
                     // @todo 游戏含有多个数据库的情况
                 }
             } catch (Zend_Db_Exception $e) {
                 ZtChart_Model_Logger::err($e->getMessage());
                 continue;
             }
         }
     }
     $this->_helper->json($data);
 }
 /**
  * 初始化使用Infoserver系列数据库的数据表类
  */
 protected function _initInfoserver()
 {
     $options = $this->bootstrap('multidb')->getResource('multidb')->getOptions();
     $ic = new ZtChart_Model_Identification_Config($options['infoserver']['identification']);
     foreach ($ic->getAllInfoServerDb(true) as $gameType => $entries) {
         foreach ($entries as $entry) {
             ZtChart_Model_DbTable_Infoserver::addInfoserverConfig(array_merge($options['infoserver'], $entry), $gameType);
         }
     }
 }