r\Datum\ObjectDatum::toNative PHP Method

toNative() public method

public toNative ( $opts )
    public function toNative($opts)
    {
        $native = new \ArrayObject();
        foreach ($this->getValue() as $key => $val) {
            $native[$key] = $val->toNative($opts);
        }
        // Decode BINARY pseudo-type
        if ((!isset($opts['binaryFormat']) || $opts['binaryFormat'] == "native") && isset($native['$reql_type$']) && $native['$reql_type$'] == 'BINARY') {
            $decodedStr = base64_decode($native['data'], true);
            if ($decodedStr === false) {
                throw new RqlDriverError('Failed to Base64 decode r\\binary value "' . $native['data'] . '"');
            }
            return $decodedStr;
        }
        // Decode TIME pseudo-type to DateTime
        if ((!isset($opts['timeFormat']) || $opts['timeFormat'] == "native") && isset($native['$reql_type$']) && $native['$reql_type$'] == 'TIME') {
            $time = $native['epoch_time'];
            // This is really stupid. It looks like we can either use `date`, which ignores microseconds,
            // or we can use `createFromFormat` which cannot handle negative epoch times.
            if ($time < 0) {
                $format = strpos($time, '.') !== false ? 'Y-m-d\\TH:i:s.u' : 'Y-m-d\\TH:i:s';
                $datetime = new \DateTime(date($format, $time) . $native['timezone'], new \DateTimeZone('UTC'));
            } else {
                $format = strpos($time, '.') !== false ? '!U.u T' : '!U T';
                $datetime = \DateTime::createFromFormat($format, $time . " " . $native['timezone'], new \DateTimeZone('UTC'));
            }
            // This is horrible. Just because in PHP 5.3.something parsing "+01:00" as a DateTimeZone doesn't work. :(
            $tzSign = $native['timezone'][0];
            $tzHours = $native['timezone'][1] . $native['timezone'][2];
            $tzMinutes = $native['timezone'][4] . $native['timezone'][5];
            if ($tzSign == "+") {
                $datetime->add(new \DateInterval("PT" . $tzHours . "H" . $tzMinutes . "M"));
            } elseif ($tzSign == "-") {
                $datetime->sub(new \DateInterval("PT" . $tzHours . "H" . $tzMinutes . "M"));
            } else {
                throw new RqlDriverError("Timezone not understood: " . $native['timezone']);
            }
            return $datetime;
        }
        return $native;
    }