rdbms: move some files under rdbms/database to subfolders
authorAaron Schulz <aschulz@wikimedia.org>
Tue, 26 Mar 2019 05:39:24 +0000 (22:39 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Thu, 28 Mar 2019 23:22:07 +0000 (16:22 -0700)
Change-Id: I627398d2cfe9fda93a16f94a94e75cf5f8833613

autoload.php
includes/libs/rdbms/database/AtomicSectionIdentifier.php [deleted file]
includes/libs/rdbms/database/DatabaseDomain.php [deleted file]
includes/libs/rdbms/database/domain/DatabaseDomain.php [new file with mode: 0644]
includes/libs/rdbms/database/utils/AtomicSectionIdentifier.php [new file with mode: 0644]

index 0d2bac9..2abf2f8 100644 (file)
@@ -1625,7 +1625,7 @@ $wgAutoloadLocalClasses = [
        'WikiTextStructure' => __DIR__ . '/includes/content/WikiTextStructure.php',
        'Wikimedia\\Http\\HttpAcceptNegotiator' => __DIR__ . '/includes/libs/http/HttpAcceptNegotiator.php',
        'Wikimedia\\Http\\HttpAcceptParser' => __DIR__ . '/includes/libs/http/HttpAcceptParser.php',
-       'Wikimedia\\Rdbms\\AtomicSectionIdentifier' => __DIR__ . '/includes/libs/rdbms/database/AtomicSectionIdentifier.php',
+       'Wikimedia\\Rdbms\\AtomicSectionIdentifier' => __DIR__ . '/includes/libs/rdbms/database/utils/AtomicSectionIdentifier.php',
        'Wikimedia\\Rdbms\\Blob' => __DIR__ . '/includes/libs/rdbms/encasing/Blob.php',
        'Wikimedia\\Rdbms\\ChronologyProtector' => __DIR__ . '/includes/libs/rdbms/ChronologyProtector.php',
        'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php',
@@ -1644,7 +1644,7 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\DBTransactionStateError' => __DIR__ . '/includes/libs/rdbms/exception/DBTransactionStateError.php',
        'Wikimedia\\Rdbms\\DBUnexpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBUnexpectedError.php',
        'Wikimedia\\Rdbms\\Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
-       'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
+       'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/domain/DatabaseDomain.php',
        'Wikimedia\\Rdbms\\DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
        'Wikimedia\\Rdbms\\DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
        'Wikimedia\\Rdbms\\DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
diff --git a/includes/libs/rdbms/database/AtomicSectionIdentifier.php b/includes/libs/rdbms/database/AtomicSectionIdentifier.php
deleted file mode 100644 (file)
index c6e3d44..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-namespace Wikimedia\Rdbms;
-
-/**
- * Class used for token representing identifiers for atomic sections from IDatabase instances
- */
-class AtomicSectionIdentifier {
-}
diff --git a/includes/libs/rdbms/database/DatabaseDomain.php b/includes/libs/rdbms/database/DatabaseDomain.php
deleted file mode 100644 (file)
index ca57938..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-namespace Wikimedia\Rdbms;
-
-use InvalidArgumentException;
-
-/**
- * Class to handle database/prefix specification for IDatabase domains
- */
-class DatabaseDomain {
-       /** @var string|null */
-       private $database;
-       /** @var string|null */
-       private $schema;
-       /** @var string */
-       private $prefix;
-
-       /** @var string Cache of convertToString() */
-       private $equivalentString;
-
-       /**
-        * @param string|null $database Database name
-        * @param string|null $schema Schema name
-        * @param string $prefix Table prefix
-        */
-       public function __construct( $database, $schema, $prefix ) {
-               if ( $database !== null && ( !is_string( $database ) || $database === '' ) ) {
-                       throw new InvalidArgumentException( 'Database must be null or a non-empty string.' );
-               }
-               $this->database = $database;
-               if ( $schema !== null && ( !is_string( $schema ) || $schema === '' ) ) {
-                       throw new InvalidArgumentException( 'Schema must be null or a non-empty string.' );
-               }
-               $this->schema = $schema;
-               if ( !is_string( $prefix ) ) {
-                       throw new InvalidArgumentException( 'Prefix must be a string.' );
-               } elseif ( $prefix !== '' && substr( $prefix, -1, 1 ) !== '_' ) {
-                       throw new InvalidArgumentException( 'A non-empty prefix must end with "_".' );
-               }
-               $this->prefix = $prefix;
-       }
-
-       /**
-        * @param DatabaseDomain|string $domain Result of DatabaseDomain::toString()
-        * @return DatabaseDomain
-        */
-       public static function newFromId( $domain ) {
-               if ( $domain instanceof self ) {
-                       return $domain;
-               }
-
-               $parts = array_map( [ __CLASS__, 'decode' ], explode( '-', $domain ) );
-
-               $schema = null;
-               $prefix = '';
-
-               if ( count( $parts ) == 1 ) {
-                       $database = $parts[0];
-               } elseif ( count( $parts ) == 2 ) {
-                       list( $database, $prefix ) = $parts;
-               } elseif ( count( $parts ) == 3 ) {
-                       list( $database, $schema, $prefix ) = $parts;
-               } else {
-                       throw new InvalidArgumentException( "Domain '$domain' has too few or too many parts." );
-               }
-
-               if ( $database === '' ) {
-                       $database = null;
-               }
-
-               if ( $schema === '' ) {
-                       $schema = null;
-               }
-
-               return new self( $database, $schema, $prefix );
-       }
-
-       /**
-        * @return DatabaseDomain
-        */
-       public static function newUnspecified() {
-               return new self( null, null, '' );
-       }
-
-       /**
-        * @param DatabaseDomain|string $other
-        * @return bool Whether the domain instances are the same by value
-        */
-       public function equals( $other ) {
-               if ( $other instanceof self ) {
-                       return (
-                               $this->database === $other->database &&
-                               $this->schema === $other->schema &&
-                               $this->prefix === $other->prefix
-                       );
-               }
-
-               return ( $this->getId() === $other );
-       }
-
-       /**
-        * Check whether the domain $other meets the specifications of this domain
-        *
-        * If this instance has a null database specifier, then $other can have any database
-        * specified, including the null, and likewise if the schema specifier is null. This
-        * is not transitive like equals() since a domain that explicitly wants a certain
-        * database or schema cannot be satisfied by one of another (nor null). If the prefix
-        * is empty and the DB and schema are both null, then the entire domain is considered
-        * unspecified, and any prefix of $other is considered compatible.
-        *
-        * @param DatabaseDomain|string $other
-        * @return bool
-        * @since 1.32
-        */
-       public function isCompatible( $other ) {
-               if ( $this->isUnspecified() ) {
-                       return true; // even the prefix doesn't matter
-               }
-
-               $other = self::newFromId( $other );
-
-               return (
-                       ( $this->database === $other->database || $this->database === null ) &&
-                       ( $this->schema === $other->schema || $this->schema === null ) &&
-                       $this->prefix === $other->prefix
-               );
-       }
-
-       /**
-        * @return bool
-        * @since 1.32
-        */
-       public function isUnspecified() {
-               return (
-                       $this->database === null && $this->schema === null && $this->prefix === ''
-               );
-       }
-
-       /**
-        * @return string|null Database name
-        */
-       public function getDatabase() {
-               return $this->database;
-       }
-
-       /**
-        * @return string|null Database schema
-        */
-       public function getSchema() {
-               return $this->schema;
-       }
-
-       /**
-        * @return string Table prefix
-        */
-       public function getTablePrefix() {
-               return $this->prefix;
-       }
-
-       /**
-        * @return string
-        */
-       public function getId() {
-               if ( $this->equivalentString === null ) {
-                       $this->equivalentString = $this->convertToString();
-               }
-
-               return $this->equivalentString;
-       }
-
-       /**
-        * @return string
-        */
-       private function convertToString() {
-               $parts = [ (string)$this->database ];
-               if ( $this->schema !== null ) {
-                       $parts[] = $this->schema;
-               }
-               if ( $this->prefix != '' || $this->schema !== null ) {
-                       // If there is a schema, then we need the prefix to disambiguate.
-                       // For engines like Postgres that use schemas, this awkwardness is hopefully
-                       // avoided since it is easy to have one DB per server (to avoid having many users)
-                       // and use schema/prefix to have wiki farms. For example, a domain schemes could be
-                       // wiki-<project>-<language>, e.g. "wiki-fitness-es"/"wiki-sports-fr"/"wiki-news-en".
-                       $parts[] = $this->prefix;
-               }
-
-               return implode( '-', array_map( [ __CLASS__, 'encode' ], $parts ) );
-       }
-
-       private static function encode( $decoded ) {
-               $encoded = '';
-
-               $length = strlen( $decoded );
-               for ( $i = 0; $i < $length; ++$i ) {
-                       $char = $decoded[$i];
-                       if ( $char === '-' ) {
-                               $encoded .= '?h';
-                       } elseif ( $char === '?' ) {
-                               $encoded .= '??';
-                       } else {
-                               $encoded .= $char;
-                       }
-               }
-
-               return $encoded;
-       }
-
-       private static function decode( $encoded ) {
-               $decoded = '';
-
-               $length = strlen( $encoded );
-               for ( $i = 0; $i < $length; ++$i ) {
-                       $char = $encoded[$i];
-                       if ( $char === '?' ) {
-                               $nextChar = $encoded[$i + 1] ?? null;
-                               if ( $nextChar === 'h' ) {
-                                       $decoded .= '-';
-                                       ++$i;
-                               } elseif ( $nextChar === '?' ) {
-                                       $decoded .= '?';
-                                       ++$i;
-                               } else {
-                                       $decoded .= $char;
-                               }
-                       } else {
-                               $decoded .= $char;
-                       }
-               }
-
-               return $decoded;
-       }
-
-       /**
-        * @return string
-        */
-       function __toString() {
-               return $this->getId();
-       }
-}
diff --git a/includes/libs/rdbms/database/domain/DatabaseDomain.php b/includes/libs/rdbms/database/domain/DatabaseDomain.php
new file mode 100644 (file)
index 0000000..ca57938
--- /dev/null
@@ -0,0 +1,258 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+
+/**
+ * Class to handle database/prefix specification for IDatabase domains
+ */
+class DatabaseDomain {
+       /** @var string|null */
+       private $database;
+       /** @var string|null */
+       private $schema;
+       /** @var string */
+       private $prefix;
+
+       /** @var string Cache of convertToString() */
+       private $equivalentString;
+
+       /**
+        * @param string|null $database Database name
+        * @param string|null $schema Schema name
+        * @param string $prefix Table prefix
+        */
+       public function __construct( $database, $schema, $prefix ) {
+               if ( $database !== null && ( !is_string( $database ) || $database === '' ) ) {
+                       throw new InvalidArgumentException( 'Database must be null or a non-empty string.' );
+               }
+               $this->database = $database;
+               if ( $schema !== null && ( !is_string( $schema ) || $schema === '' ) ) {
+                       throw new InvalidArgumentException( 'Schema must be null or a non-empty string.' );
+               }
+               $this->schema = $schema;
+               if ( !is_string( $prefix ) ) {
+                       throw new InvalidArgumentException( 'Prefix must be a string.' );
+               } elseif ( $prefix !== '' && substr( $prefix, -1, 1 ) !== '_' ) {
+                       throw new InvalidArgumentException( 'A non-empty prefix must end with "_".' );
+               }
+               $this->prefix = $prefix;
+       }
+
+       /**
+        * @param DatabaseDomain|string $domain Result of DatabaseDomain::toString()
+        * @return DatabaseDomain
+        */
+       public static function newFromId( $domain ) {
+               if ( $domain instanceof self ) {
+                       return $domain;
+               }
+
+               $parts = array_map( [ __CLASS__, 'decode' ], explode( '-', $domain ) );
+
+               $schema = null;
+               $prefix = '';
+
+               if ( count( $parts ) == 1 ) {
+                       $database = $parts[0];
+               } elseif ( count( $parts ) == 2 ) {
+                       list( $database, $prefix ) = $parts;
+               } elseif ( count( $parts ) == 3 ) {
+                       list( $database, $schema, $prefix ) = $parts;
+               } else {
+                       throw new InvalidArgumentException( "Domain '$domain' has too few or too many parts." );
+               }
+
+               if ( $database === '' ) {
+                       $database = null;
+               }
+
+               if ( $schema === '' ) {
+                       $schema = null;
+               }
+
+               return new self( $database, $schema, $prefix );
+       }
+
+       /**
+        * @return DatabaseDomain
+        */
+       public static function newUnspecified() {
+               return new self( null, null, '' );
+       }
+
+       /**
+        * @param DatabaseDomain|string $other
+        * @return bool Whether the domain instances are the same by value
+        */
+       public function equals( $other ) {
+               if ( $other instanceof self ) {
+                       return (
+                               $this->database === $other->database &&
+                               $this->schema === $other->schema &&
+                               $this->prefix === $other->prefix
+                       );
+               }
+
+               return ( $this->getId() === $other );
+       }
+
+       /**
+        * Check whether the domain $other meets the specifications of this domain
+        *
+        * If this instance has a null database specifier, then $other can have any database
+        * specified, including the null, and likewise if the schema specifier is null. This
+        * is not transitive like equals() since a domain that explicitly wants a certain
+        * database or schema cannot be satisfied by one of another (nor null). If the prefix
+        * is empty and the DB and schema are both null, then the entire domain is considered
+        * unspecified, and any prefix of $other is considered compatible.
+        *
+        * @param DatabaseDomain|string $other
+        * @return bool
+        * @since 1.32
+        */
+       public function isCompatible( $other ) {
+               if ( $this->isUnspecified() ) {
+                       return true; // even the prefix doesn't matter
+               }
+
+               $other = self::newFromId( $other );
+
+               return (
+                       ( $this->database === $other->database || $this->database === null ) &&
+                       ( $this->schema === $other->schema || $this->schema === null ) &&
+                       $this->prefix === $other->prefix
+               );
+       }
+
+       /**
+        * @return bool
+        * @since 1.32
+        */
+       public function isUnspecified() {
+               return (
+                       $this->database === null && $this->schema === null && $this->prefix === ''
+               );
+       }
+
+       /**
+        * @return string|null Database name
+        */
+       public function getDatabase() {
+               return $this->database;
+       }
+
+       /**
+        * @return string|null Database schema
+        */
+       public function getSchema() {
+               return $this->schema;
+       }
+
+       /**
+        * @return string Table prefix
+        */
+       public function getTablePrefix() {
+               return $this->prefix;
+       }
+
+       /**
+        * @return string
+        */
+       public function getId() {
+               if ( $this->equivalentString === null ) {
+                       $this->equivalentString = $this->convertToString();
+               }
+
+               return $this->equivalentString;
+       }
+
+       /**
+        * @return string
+        */
+       private function convertToString() {
+               $parts = [ (string)$this->database ];
+               if ( $this->schema !== null ) {
+                       $parts[] = $this->schema;
+               }
+               if ( $this->prefix != '' || $this->schema !== null ) {
+                       // If there is a schema, then we need the prefix to disambiguate.
+                       // For engines like Postgres that use schemas, this awkwardness is hopefully
+                       // avoided since it is easy to have one DB per server (to avoid having many users)
+                       // and use schema/prefix to have wiki farms. For example, a domain schemes could be
+                       // wiki-<project>-<language>, e.g. "wiki-fitness-es"/"wiki-sports-fr"/"wiki-news-en".
+                       $parts[] = $this->prefix;
+               }
+
+               return implode( '-', array_map( [ __CLASS__, 'encode' ], $parts ) );
+       }
+
+       private static function encode( $decoded ) {
+               $encoded = '';
+
+               $length = strlen( $decoded );
+               for ( $i = 0; $i < $length; ++$i ) {
+                       $char = $decoded[$i];
+                       if ( $char === '-' ) {
+                               $encoded .= '?h';
+                       } elseif ( $char === '?' ) {
+                               $encoded .= '??';
+                       } else {
+                               $encoded .= $char;
+                       }
+               }
+
+               return $encoded;
+       }
+
+       private static function decode( $encoded ) {
+               $decoded = '';
+
+               $length = strlen( $encoded );
+               for ( $i = 0; $i < $length; ++$i ) {
+                       $char = $encoded[$i];
+                       if ( $char === '?' ) {
+                               $nextChar = $encoded[$i + 1] ?? null;
+                               if ( $nextChar === 'h' ) {
+                                       $decoded .= '-';
+                                       ++$i;
+                               } elseif ( $nextChar === '?' ) {
+                                       $decoded .= '?';
+                                       ++$i;
+                               } else {
+                                       $decoded .= $char;
+                               }
+                       } else {
+                               $decoded .= $char;
+                       }
+               }
+
+               return $decoded;
+       }
+
+       /**
+        * @return string
+        */
+       function __toString() {
+               return $this->getId();
+       }
+}
diff --git a/includes/libs/rdbms/database/utils/AtomicSectionIdentifier.php b/includes/libs/rdbms/database/utils/AtomicSectionIdentifier.php
new file mode 100644 (file)
index 0000000..c6e3d44
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+namespace Wikimedia\Rdbms;
+
+/**
+ * Class used for token representing identifiers for atomic sections from IDatabase instances
+ */
+class AtomicSectionIdentifier {
+}