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); }
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; }
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; }
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); }