/** * @param DatabaseBase $db * @param string $prefix * @return void */ public static function changeDBPrefix($db, $prefix) { $db->tablePrefix($prefix); }
/** * Mark a foreign connection as being available for reuse under a different * DB name or prefix. This mechanism is reference-counted, and must be called * the same number of times as getConnection() to work. * * @param DatabaseBase $conn * @throws MWException */ public function reuseConnection($conn) { $serverIndex = $conn->getLBInfo('serverIndex'); $refCount = $conn->getLBInfo('foreignPoolRefCount'); if ($serverIndex === null || $refCount === null) { wfDebug(__METHOD__ . ": this connection was not opened as a foreign connection\n"); /** * This can happen in code like: * foreach ( $dbs as $db ) { * $conn = $lb->getConnection( DB_SLAVE, array(), $db ); * ... * $lb->reuseConnection( $conn ); * } * When a connection to the local DB is opened in this way, reuseConnection() * should be ignored */ return; } $dbName = $conn->getDBname(); $prefix = $conn->tablePrefix(); if (strval($prefix) !== '') { $wiki = "{$dbName}-{$prefix}"; } else { $wiki = $dbName; } if ($this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn) { throw new MWException(__METHOD__ . ": connection not found, has " . "the connection been freed already?"); } $conn->setLBInfo('foreignPoolRefCount', --$refCount); if ($refCount <= 0) { $this->mConns['foreignFree'][$serverIndex][$wiki] = $conn; unset($this->mConns['foreignUsed'][$serverIndex][$wiki]); wfDebug(__METHOD__ . ": freed connection {$serverIndex}/{$wiki}\n"); } else { wfDebug(__METHOD__ . ": reference count for {$serverIndex}/{$wiki} reduced to {$refCount}\n"); } }
/** * @since 1.18 * * @param DatabaseBase $db * * @return array */ public static function listTables($db) { $prefix = $db->tablePrefix(); $tables = $db->listTables($prefix, __METHOD__); if ($db->getType() === 'mysql') { # bug 43571: cannot clone VIEWs under MySQL $views = $db->listViews($prefix, __METHOD__); $tables = array_diff($tables, $views); } array_walk($tables, [__CLASS__, 'unprefixTable'], $prefix); // Don't duplicate test tables from the previous fataled run $tables = array_filter($tables, [__CLASS__, 'isNotUnittest']); if ($db->getType() == 'sqlite') { $tables = array_flip($tables); // these are subtables of searchindex and don't need to be duped/dropped separately unset($tables['searchindex_content']); unset($tables['searchindex_segdir']); unset($tables['searchindex_segments']); $tables = array_flip($tables); } return $tables; }