Overview

Namespaces

  • Apptus
    • ESales
      • Connector
        • Report
        • Time
    • Util
      • Cache
  • PHP
  • Overview
  • Namespace
  • Class
  • Tree
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 
<?php
namespace Apptus\ESales\Connector;

/**
 * A component view of a cluster URI.
 *
 * The URI contains a list of hosts and ports, a user and password, and a set of timeout arguments.
 *
 * Ports, user, password and timeout arguments may be omitted in the URI. In such a case,
 * null is returned from getters.
 *
 * The general format of a cluster URI is as follows:
 *
 * <code>
 * esales://[<i>user1</i>:<i>password1</i>@]<i>host1</i>[:<i>port1</i>][;[<i>user2</i>:<i>password2</i>@]<i>host2</i>[:<i>port2</i>][;...]][?<i>parameter1</i>=<i>value1</i>[&<i>parameter2</i>=<i>value2</i>[&...]]]
 * </code>
 *
 * The following parameters are supported:
 * <ul>
 * <li>connection_timeout</li>
 * <li>query_timeout</li>
 * <li>report_timeout</li>
 * <li>export_timeout</li>
 * <li>import_timeout</li>
 * <li>block_timeout</li>
 * <li>notification_timeout</li>
 * <li>ignore_certificates</li>
 * <li>compression_mode</li>
 * <li>cainfo</li>
 * <li>security</li>
 * <li>send_extra_request_header</li>
 * <li>maximum_attempts</li>
 * </ul>
 *
 * Parameter values must be URL encoded in order to avoid ambiguity.
 *
 * @internal
 */
class ClusterUri implements \Countable, \IteratorAggregate {
    private $hosts = array();
    private $ports = array();
    private $users = array();
    private $passwords = array();

    private $queryString;

    public function __construct() {
    }

    /**
     * @param $uri
     * @throws MalformedURLException
     */
    public static function parse($uri) {
        $modUri = $uri;
        $protocolIx = strpos($modUri, '://');
        if (strpos($modUri, '://') !== false) {
            $protocol = substr($modUri, 0, $protocolIx);
            if ($protocol !== 'esales') {
                throw new MalformedURLException('Unsupported protocol: ' . $protocol);
            }
            $modUri = substr($modUri, $protocolIx + 3);
        }

        $pIx = strpos($modUri, '/');
        $qIx = strpos($modUri, '?');
        if ($pIx !== false && ($qIx === false || $qIx > $pIx)) {
            throw new MalformedURLException('Path may not be specified for clusters.');
        }

        $servers = explode(';', ($qIx === false) ? substr($modUri, 0) : substr($modUri, 0, $qIx));

        $c = new ClusterUri();
        $c->queryString = $qIx === false ? '' : substr($modUri, $qIx + 1);

        foreach ($servers as $server) {
            if (!$server) break;
            $user = null;
            $password = null;
            $aIx = strpos($server, '@');

            if ($aIx + 1 == strlen($server)) {
                $server = substr($server, 0, $aIx);
                $aIx = false;
            }

            if ($aIx !== false) {
                $account = substr($server, 0, $aIx);
                $cIx = strpos($account, ':');
                $user = urldecode($cIx === false ? $account : substr($account, 0, $cIx));
                $password = $cIx === false ? null : urldecode(substr($account, $cIx + 1));
                $server = substr($server, $aIx + 1);
            }

            $cIx = strpos($server, ':');
            $host = $server;
            $portString = substr($server, $cIx + 1);
            $port = null;
            if ($cIx !== false) {
                $host = substr($server, 0, $cIx);
                if (ctype_digit($portString)) {
                    $port = (int) $portString;
                } else {
                    if (count($servers) === 1 && $user === null) {
                        $user = $host;
                        $host = null;
                        $password = $portString;
                    } else {
                        throw new MalformedURLException('Invalid port: ' . $port);
                    }
                }
            }
            $c->hosts[] = $host;
            $c->ports[] = $port;
            $c->users[] = $user;
            $c->passwords[] = $password;
        }

        return $c;
    }


    public function count() {
        return count($this->hosts);
    }

    public function hosts() {
        return $this->hosts; // TODO: Unmodifiable?
    }

    public function ports() {
        return $this->ports; // TODO: Unmodifiable?
    }

    public function users() {
        return $this->users; // TODO: Unmodifiable?
    }

    public function passwords() {
        return $this->passwords; // TODO: Unmodifiable?
    }

    public function host($i) {
        return isset($this->hosts[$i]) ? $this->hosts[$i] : null;
    }

    public function port($i, $defaultValue = null) {
        return isset($this->ports[$i]) ? $this->ports[$i] : $defaultValue;
    }

    public function user($i) {
        return isset($this->users[$i]) ? $this->users[$i] : null;
    }

    public function password($i) {
        return isset($this->passwords[$i]) ? $this->passwords[$i] : null;
    }

    public function getIterator() {
        return new ClusterUriIterator($this);
    }

    public function getQueryString() {
        return $this->queryString;
    }
}

class ClusterUriIterator implements \Iterator {
    private $uri;
    private $i = 0;

    public function __construct(ClusterUri $uri) {
        $this->uri = $uri;
    }

    public function rewind() {
        $this->i = 0;
    }

    public function current() {
        return array ($this->uri->host($this->i), $this->uri->port($this->i, null));
    }

    public function key() {
        return $this->i;
    }

    public function next() {
        $this->i += 1;
    }

    public function valid() {
        return $this->i < $this->uri->count();
    }
}
Apptus ESales Connector PHP API documentation generated by ApiGen