예제 #1
0
파일: group.php 프로젝트: xiaoyjy/retry
 function outputs($binary)
 {
     $c_clist = [[CY_TYPE_STRING, "key", 64], [CY_TYPE_STRING, "val", 1024]];
     $c_host = [[CY_TYPE_UINT32, "host"], [CY_TYPE_STRING, "port", 4]];
     $c_host1 = [[CY_TYPE_UINT32, "port"], [CY_TYPE_STRING, "host"]];
     $config = [[CY_TYPE_OBJECT, 'global', self::$c_global], [CY_TYPE_UINT32, "bucket_count"], [CY_TYPE_UINT32, "copy_count"], [CY_TYPE_UINT32, "version"], [CY_TYPE_UINT32, "config_count"], [CY_TYPE_OBJECT, "config_list", $c_clist, "config_count"], [CY_TYPE_UINT32, "hash_size"], [CY_TYPE_STRING, "hash_data", "hash_size"], [CY_TYPE_UINT32, "server_count"], [CY_TYPE_OBJECT, "server_available", $c_host1, "server_count"]];
     $array = cy_unpack($binary, $config);
     if (empty($array['global']['flag'])) {
         return cy_dt(-1, 'error respones');
     }
     $table = gzuncompress($array['hash_data']);
     $count = strlen($table) / 8;
     $list = cy_unpack($table, [[CY_TYPE_OBJECT, "list", $c_host, $count]]);
     $srvl = [];
     foreach ($list['list'] as $srv) {
         $port = unpack("V", $srv['port']);
         $srvl[] = long2ip($srv['host']) . ':' . $port[1];
     }
     foreach ($array['server_available'] as &$srv) {
         $host = unpack("V", $srv['host']);
         $srv['host'] = long2ip($host[1]);
     }
     unset($srv);
     $data = [];
     $data['server_list'] = $srvl;
     $data['server_available'] = $array['server_available'];
     $data['config_list'] = $array['config_list'];
     return cy_dt(0, $data);
 }
예제 #2
0
파일: get.php 프로젝트: xiaoyjy/retry
 function outputs($binary)
 {
     $c_data = [[CY_TYPE_OBJECT, 'meta', self::$c_meta], [CY_TYPE_UINT32, 'size'], [CY_TYPE_STRING, 'data', 'size']];
     $c_pair = [[CY_TYPE_OBJECT, 'key', $c_data], [CY_TYPE_OBJECT, 'val', $c_data]];
     $c_lists = [[CY_TYPE_UINT32, "count"], [CY_TYPE_OBJECT, 'list', $c_pair, 'count']];
     $config = [[CY_TYPE_OBJECT, 'global', self::$c_global], [CY_TYPE_UINT32, "version"], [CY_TYPE_COND32, NULL, [0 => $c_lists, CY_COMMON_COND => NULL]]];
     $dt = cy_unpack($binary, $config);
     if ($dt['errno'] > 0) {
         $dt['errno'] -= 4294967296;
     }
     return $dt;
 }
예제 #3
0
파일: hb.php 프로젝트: xiaoyjy/retry
 function run($client, $request = "")
 {
     $errno = 0;
     $error = '';
     $display = 'json';
     $b = cy_unpack($request, $this->config);
     if (!$b || empty($b['raw_header']) || empty($b['raw_len_head']) || $b['raw_len_head'] < 4) {
         $errno = CYE_PARAM_ERROR;
         $error = "invalid request.";
         goto error;
     }
     $r = cy_unpack($b['raw_header'], $this->config_head);
     $r['length'] = $b['raw_len_body'];
     $_ENV['module'] = $module = $r['module'];
     $_ENV['id'] = $id = $r['id'];
     $_ENV['method'] = $method = isset($r['method']) ? $r['method'] : 'get';
     $_ENV['display'] = $display = $r['fmt'];
     $_ENV['version'] = $version = isset($r['version']) ? $r['version'] : 1;
     $classname = 'CA_Entry_' . $module;
     if (!method_exists($classname, $method) && !method_exists($classname, '__call')) {
         $classname .= '_' . $method;
         $run = isset($_GET['a']) ? $_GET['a'] : 'run';
         if (!method_exists($classname, $run)) {
             $errno = CYE_PARAM_ERROR;
             $error = "method is not exists {$classname}:{$method}";
             goto error;
         }
     }
     switch ($display) {
         case 'raw':
             $req = $b['raw_body'];
             break;
         case 'json':
             $req = json_decode($b['raw_body'], true);
             if (empty($req)) {
                 $errno = json_last_error();
                 $error = json_last_error_msg();
                 goto error;
             }
             break;
         case 'mgp':
             $req = msgpack_unpack($b['raw_body']);
             $req = ['errno' => 0, 'data' => $data];
             break;
         default:
             $errno = -1;
             $error = 'unkown formant';
             break;
     }
     $eny = new $classname();
     $dt = $eny->get($id, $req, $_ENV);
     unset($eny);
     response:
     switch ($display) {
         case 'raw':
             $body = $dt;
             break;
         case 'json':
             $body = json_encode($dt);
             break;
         case 'mpg':
             $body = msgpack_pack($dt);
             break;
         default:
             $body = 'unknown format ' . $display;
             break;
     }
     if (empty($body) || !is_string($body)) {
         return ['errno' => 0, 'error' => 'error response body.'];
     }
     $hd = ['raw_len_head' => 0, 'raw_header' => ''];
     if (isset($b['raw_len_head'])) {
         $hd['raw_len_head'] = $b['raw_len_head'];
     }
     if (isset($b['raw_header'])) {
         $hd['raw_header'] = $b['raw_header'];
     }
     $inputs = array([CY_TYPE_UINT16, $hd['raw_len_head']], [CY_TYPE_STRING, $hd['raw_header']], [CY_TYPE_UINT16, strlen($body)], [CY_TYPE_STRING, $body]);
     return ['errno' => $errno, 'error' => $error, 'data' => cy_pack($inputs)];
     error:
     $dt = array('errno' => $errno, 'error' => $error);
     cy_log(CYE_WARNING, "{$client} " . $error);
     goto response;
 }
예제 #4
0
파일: set.php 프로젝트: xiaoyjy/retry
 function outputs($binary)
 {
     $config = [[CY_TYPE_OBJECT, 'global', self::$c_global], [CY_TYPE_UINT32, "version"], [CY_TYPE_UINT32, "errno"], [CY_TYPE_STRING, "msg"]];
     return cy_unpack($binary, $config);
 }