summaryrefslogtreecommitdiff
path: root/vendor/wikimedia/avro/lib/avro.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/wikimedia/avro/lib/avro.php')
-rw-r--r--vendor/wikimedia/avro/lib/avro.php195
1 files changed, 195 insertions, 0 deletions
diff --git a/vendor/wikimedia/avro/lib/avro.php b/vendor/wikimedia/avro/lib/avro.php
new file mode 100644
index 00000000..4805fb7a
--- /dev/null
+++ b/vendor/wikimedia/avro/lib/avro.php
@@ -0,0 +1,195 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Avro library top-level file.
+ *
+ * This file in turn includes all files supporting the
+ * Avro implementation.
+ *
+ * @package Avro
+ */
+
+/**
+ * General Avro exceptions.
+ * @package Avro
+ */
+class AvroException extends Exception {}
+
+/**
+ * Library-level class for PHP Avro port.
+ *
+ * Contains library details such as version number and platform checks.
+ *
+ * This port is an implementation of the
+ * {@link http://avro.apache.org/docs/1.3.3/spec.html Avro 1.3.3 Specification}
+ *
+ * @package Avro
+ *
+ */
+class Avro
+{
+ /**
+ * @var string version number of Avro specification to which
+ * this implemenation complies
+ */
+ const SPEC_VERSION = '1.3.3';
+
+ /**#@+
+ * Constant to enumerate endianness.
+ * @access private
+ * @var int
+ */
+ const BIG_ENDIAN = 0x00;
+ const LITTLE_ENDIAN = 0x01;
+ /**#@-*/
+
+ /**
+ * Memoized result of self::set_endianness()
+ * @var int self::BIG_ENDIAN or self::LITTLE_ENDIAN
+ * @see self::set_endianness()
+ */
+ private static $endianness;
+
+ /**#@+
+ * Constant to enumerate biginteger handling mode.
+ * GMP is used, if available, on 32-bit platforms.
+ */
+ const PHP_BIGINTEGER_MODE = 0x00;
+ const GMP_BIGINTEGER_MODE = 0x01;
+ /**#@-*/
+
+ /**
+ * @var int
+ * Mode used to handle bigintegers. After Avro::check_64_bit() has been called,
+ * (usually via a call to Avro::check_platform(), set to
+ * self::GMP_BIGINTEGER_MODE on 32-bit platforms that have GMP available,
+ * and to self::PHP_BIGINTEGER_MODE otherwise.
+ */
+ private static $biginteger_mode;
+
+ /**
+ * Wrapper method to call each required check.
+ *
+ */
+ public static function check_platform()
+ {
+ self::check_64_bit();
+ self::check_little_endian();
+ }
+
+ /**
+ * Determines if the host platform can encode and decode long integer data.
+ *
+ * @throws AvroException if the platform cannot handle long integers.
+ */
+ private static function check_64_bit()
+ {
+ if (8 != PHP_INT_SIZE)
+ if (extension_loaded('gmp'))
+ self::$biginteger_mode = self::GMP_BIGINTEGER_MODE;
+ else
+ throw new AvroException('This platform cannot handle a 64-bit operations. '
+ . 'Please install the GMP PHP extension.');
+ else
+ self::$biginteger_mode = self::PHP_BIGINTEGER_MODE;
+
+ }
+
+ /**
+ * @returns boolean true if the PHP GMP extension is used and false otherwise.
+ * @internal Requires Avro::check_64_bit() (exposed via Avro::check_platform())
+ * to have been called to set Avro::$biginteger_mode.
+ */
+ static function uses_gmp()
+ {
+ return (self::GMP_BIGINTEGER_MODE == self::$biginteger_mode);
+ }
+
+ /**
+ * Determines if the host platform is little endian,
+ * required for processing double and float data.
+ *
+ * @throws AvroException if the platform is not little endian.
+ */
+ private static function check_little_endian()
+ {
+ if (!self::is_little_endian_platform())
+ throw new AvroException('This is not a little-endian platform');
+ }
+
+ /**
+ * Determines the endianness of the host platform and memoizes
+ * the result to Avro::$endianness.
+ *
+ * Based on a similar check perfomed in http://pear.php.net/package/Math_BinaryUtils
+ *
+ * @throws AvroException if the endianness cannot be determined.
+ */
+ private static function set_endianness()
+ {
+ $packed = pack('d', 1);
+ switch ($packed)
+ {
+ case "\77\360\0\0\0\0\0\0":
+ self::$endianness = self::BIG_ENDIAN;
+ break;
+ case "\0\0\0\0\0\0\360\77":
+ self::$endianness = self::LITTLE_ENDIAN;
+ break;
+ default:
+ throw new AvroException(
+ sprintf('Error determining platform endianness: %s',
+ AvroDebug::hex_string($packed)));
+ }
+ }
+
+ /**
+ * @returns boolean true if the host platform is big endian
+ * and false otherwise.
+ * @uses self::set_endianness()
+ */
+ private static function is_big_endian_platform()
+ {
+ if (is_null(self::$endianness))
+ self::set_endianness();
+
+ return (self::BIG_ENDIAN == self::$endianness);
+ }
+
+ /**
+ * @returns boolean true if the host platform is little endian,
+ * and false otherwise.
+ * @uses self::is_bin_endian_platform()
+ */
+ private static function is_little_endian_platform()
+ {
+ return !self::is_big_endian_platform();
+ }
+
+}
+
+require_once('avro/util.php');
+require_once('avro/debug.php');
+require_once('avro/schema.php');
+require_once('avro/io.php');
+require_once('avro/gmp.php');
+require_once('avro/datum.php');
+require_once('avro/data_file.php');
+require_once('avro/protocol.php');