diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ccee4e13d113be1f96a4ab108233c83907912dde --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/vendor/ +/hyperdb/ diff --git a/composer.json b/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..dda995133ece7c9e5a3dc05f48afa5c17c350768 --- /dev/null +++ b/composer.json @@ -0,0 +1,28 @@ +{ + "name": "lucha/r2db", + "description": "r2db wordpress database", + "type": "libray", + "license": "MIT", + "authors": [ + { + "name": "lucha", + "email": "lucha@paranoici.org" + } + ], + "repositories": [ + { + "type": "composer", + "url" : "https://wpackagist.org" + } + ], + "require": { + "flexihash/flexihash": "^2.0", + "wpackagist-plugin/hyperdb": "^1.6", + "composer/installers": "^1.9" + }, + "extra": { + "installer-paths": { + "hyperdb": ["wpackagist-plugin/hyperdb"] + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000000000000000000000000000000000000..7ff6da461789c12462c1ef4129955615b9d33ef4 --- /dev/null +++ b/composer.lock @@ -0,0 +1,218 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "969ecb964c3720238fbd1b5024615354", + "packages": [ + { + "name": "composer/installers", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca", + "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.6.* || 2.0.*@dev", + "composer/semver": "1.0.* || 2.0.*@dev", + "phpunit/phpunit": "^4.8.36", + "sebastian/comparator": "^1.2.4", + "symfony/process": "^2.3" + }, + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "modulework", + "modx", + "moodle", + "osclass", + "phpbb", + "piwik", + "ppi", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "symfony", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "time": "2020-04-07T06:57:05+00:00" + }, + { + "name": "flexihash/flexihash", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/pda/flexihash.git", + "reference": "497ba5782606d998f8ab0b4e5942e3a799bec018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pda/flexihash/zipball/497ba5782606d998f8ab0b4e5942e3a799bec018", + "reference": "497ba5782606d998f8ab0b4e5942e3a799bec018", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8", + "satooshi/php-coveralls": "~1.0", + "squizlabs/php_codesniffer": "^2.3", + "symfony/config": "^2.0.0", + "symfony/console": "^2.0.0", + "symfony/filesystem": "^2.0.0", + "symfony/stopwatch": "^2.0.0", + "symfony/yaml": "^2.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Flexihash\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Annesley", + "email": "paul@annesley.cc", + "homepage": "http://paul.annesley.cc" + }, + { + "name": "Dom Morgan", + "email": "dom@d3r.com", + "homepage": "https://d3r.com" + } + ], + "description": "Flexihash is a small PHP library which implements consistent hashing", + "homepage": "https://github.com/pda/flexihash", + "time": "2016-04-22T21:03:23+00:00" + }, + { + "name": "wpackagist-plugin/hyperdb", + "version": "1.6", + "source": { + "type": "svn", + "url": "https://plugins.svn.wordpress.org/hyperdb/", + "reference": "tags/1.6" + }, + "dist": { + "type": "zip", + "url": "https://downloads.wordpress.org/plugin/hyperdb.1.6.zip", + "reference": null, + "shasum": null + }, + "require": { + "composer/installers": "~1.0" + }, + "type": "wordpress-plugin", + "homepage": "https://wordpress.org/plugins/hyperdb/" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/r2db/flexihash.php b/r2db/flexihash.php deleted file mode 100644 index 33ad4714604a333f814752740431b4fc81a59aa3..0000000000000000000000000000000000000000 --- a/r2db/flexihash.php +++ /dev/null @@ -1,363 +0,0 @@ -<?php -/** - * Flexihash - A simple consistent hashing implementation for PHP. - * - * The MIT License - * - * Copyright (c) 2008 Paul Annesley - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author Paul Annesley - * @link http://paul.annesley.cc/ - * @copyright Paul Annesley, 2008 - */ - -/** - * A simple consistent hashing implementation with pluggable hash algorithms. - * - * @author Paul Annesley - * @package Flexihash - * @licence http://www.opensource.org/licenses/mit-license.php - */ -class Flexihash -{ - - /** - * The number of positions to hash each target to. - * - * @var int - */ - private $_replicas = 64; - - /** - * The hash algorithm, encapsulated in a Flexihash_Hasher implementation. - * @var object Flexihash_Hasher - */ - private $_hasher; - - /** - * Internal counter for current number of targets. - * @var int - */ - private $_targetCount = 0; - - /** - * Internal map of positions (hash outputs) to targets - * @var array { position => target, ... } - */ - private $_positionToTarget = array(); - - /** - * Internal map of targets to lists of positions that target is hashed to. - * @var array { target => [ position, position, ... ], ... } - */ - private $_targetToPositions = array(); - - /** - * Whether the internal map of positions to targets is already sorted. - * @var boolean - */ - private $_positionToTargetSorted = false; - - /** - * Constructor - * @param object $hasher Flexihash_Hasher - * @param int $replicas Amount of positions to hash each target to. - */ - public function __construct(Flexihash_Hasher $hasher = null, $replicas = null) - { - $this->_hasher = $hasher ? $hasher : new Flexihash_Crc32Hasher(); - if (!empty($replicas)) $this->_replicas = $replicas; - } - - /** - * Add a target. - * @param string $target - * @param float $weight - * @chainable - */ - public function addTarget($target, $weight=1) - { - if (isset($this->_targetToPositions[$target])) - { - throw new Flexihash_Exception("Target '$target' already exists."); - } - - $this->_targetToPositions[$target] = array(); - - // hash the target into multiple positions - for ($i = 0; $i < round($this->_replicas*$weight); $i++) - { - $position = $this->_hasher->hash($target . $i); - $this->_positionToTarget[$position] = $target; // lookup - $this->_targetToPositions[$target] []= $position; // target removal - } - - $this->_positionToTargetSorted = false; - $this->_targetCount++; - - return $this; - } - - /** - * Add a list of targets. - * @param array $targets - * @param float $weight - * @chainable - */ - public function addTargets($targets, $weight=1) - { - foreach ($targets as $target) - { - $this->addTarget($target,$weight); - } - - return $this; - } - - /** - * Remove a target. - * @param string $target - * @chainable - */ - public function removeTarget($target) - { - if (!isset($this->_targetToPositions[$target])) - { - throw new Flexihash_Exception("Target '$target' does not exist."); - } - - foreach ($this->_targetToPositions[$target] as $position) - { - unset($this->_positionToTarget[$position]); - } - - unset($this->_targetToPositions[$target]); - - $this->_targetCount--; - - return $this; - } - - /** - * A list of all potential targets - * @return array - */ - public function getAllTargets() - { - return array_keys($this->_targetToPositions); - } - - /** - * Looks up the target for the given resource. - * @param string $resource - * @return string - */ - public function lookup($resource) - { - $targets = $this->lookupList($resource, 1); - if (empty($targets)) throw new Flexihash_Exception('No targets exist'); - return $targets[0]; - } - - /** - * Get a list of targets for the resource, in order of precedence. - * Up to $requestedCount targets are returned, less if there are fewer in total. - * - * @param string $resource - * @param int $requestedCount The length of the list to return - * @return array List of targets - */ - public function lookupList($resource, $requestedCount) - { - if (!$requestedCount) - throw new Flexihash_Exception('Invalid count requested'); - - // handle no targets - if (empty($this->_positionToTarget)) - return array(); - - // optimize single target - if ($this->_targetCount == 1) - return array_unique(array_values($this->_positionToTarget)); - - // hash resource to a position - $resourcePosition = $this->_hasher->hash($resource); - - $results = array(); - $collect = false; - - $this->_sortPositionTargets(); - - // search values above the resourcePosition - foreach ($this->_positionToTarget as $key => $value) - { - // start collecting targets after passing resource position - if (!$collect && $key > $resourcePosition) - { - $collect = true; - } - - // only collect the first instance of any target - if ($collect && !in_array($value, $results)) - { - $results []= $value; - } - - // return when enough results, or list exhausted - if (count($results) == $requestedCount || count($results) == $this->_targetCount) - { - return $results; - } - } - - // loop to start - search values below the resourcePosition - foreach ($this->_positionToTarget as $key => $value) - { - if (!in_array($value, $results)) - { - $results []= $value; - } - - // return when enough results, or list exhausted - if (count($results) == $requestedCount || count($results) == $this->_targetCount) - { - return $results; - } - } - - // return results after iterating through both "parts" - return $results; - } - - public function __toString() - { - return sprintf( - '%s{targets:[%s]}', - get_class($this), - implode(',', $this->getAllTargets()) - ); - } - - // ---------------------------------------- - // private methods - - /** - * Sorts the internal mapping (positions to targets) by position - */ - private function _sortPositionTargets() - { - // sort by key (position) if not already - if (!$this->_positionToTargetSorted) - { - ksort($this->_positionToTarget, SORT_REGULAR); - $this->_positionToTargetSorted = true; - } - } - -} - - -/** - * Hashes given values into a sortable fixed size address space. - * - * @author Paul Annesley - * @package Flexihash - * @licence http://www.opensource.org/licenses/mit-license.php - */ -interface Flexihash_Hasher -{ - - /** - * Hashes the given string into a 32bit address space. - * - * Note that the output may be more than 32bits of raw data, for example - * hexidecimal characters representing a 32bit value. - * - * The data must have 0xFFFFFFFF possible values, and be sortable by - * PHP sort functions using SORT_REGULAR. - * - * @param string - * @return mixed A sortable format with 0xFFFFFFFF possible values - */ - public function hash($string); - -} - - -/** - * Uses CRC32 to hash a value into a signed 32bit int address space. - * Under 32bit PHP this (safely) overflows into negatives ints. - * - * @author Paul Annesley - * @package Flexihash - * @licence http://www.opensource.org/licenses/mit-license.php - */ -class Flexihash_Crc32Hasher - implements Flexihash_Hasher -{ - - /* (non-phpdoc) - * @see Flexihash_Hasher::hash() - */ - public function hash($string) - { - return crc32($string); - } - -} - - -/** - * Uses CRC32 to hash a value into a 32bit binary string data address space. - * - * @author Paul Annesley - * @package Flexihash - * @licence http://www.opensource.org/licenses/mit-license.php - */ -class Flexihash_Md5Hasher - implements Flexihash_Hasher -{ - - /* (non-phpdoc) - * @see Flexihash_Hasher::hash() - */ - public function hash($string) - { - return substr(md5($string), 0, 8); // 8 hexits = 32bit - - // 4 bytes of binary md5 data could also be used, but - // performance seems to be the same. - } - -} - - -/** - * An exception thrown by Flexihash. - * - * @author Paul Annesley - * @package Flexihash - * @licence http://www.opensource.org/licenses/mit-license.php - */ -class Flexihash_Exception extends Exception -{ -} - diff --git a/r2db/db-backends.php b/src/db-backends.php similarity index 100% rename from r2db/db-backends.php rename to src/db-backends.php diff --git a/r2db/db-hash.php b/src/db-hash.php similarity index 90% rename from r2db/db-hash.php rename to src/db-hash.php index 8938929ed9c228e46c637a0d6b43a606a10c6bfd..289458ded71521903b87d97238a3c4dbcf07a495 100644 --- a/r2db/db-hash.php +++ b/src/db-hash.php @@ -1,6 +1,7 @@ <?php -require_once(dirname(__FILE__) . '/flexihash.php'); +require __DIR__ . '../vendor/autoload.php'; + require_once( ABSPATH . 'wp-config.php' ); $wpdb->hash_map = new Flexihash(null, R2DB_FLEXIHASH_REPLICAS);