/** * Helper function: do the actual database query to fetch file metadata. * * @param string $key key * @param $readFromDB: constant (default: DB_SLAVE) * @return boolean */ protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) { // populate $fileMetadata[$key] $dbr = null; if ( $readFromDB === DB_MASTER ) { // sometimes reading from the master is necessary, if there's replication lag. $dbr = $this->repo->getMasterDb(); } else { $dbr = $this->repo->getSlaveDb(); } $row = $dbr->selectRow( 'uploadstash', '*', array( 'us_key' => $key ), __METHOD__ ); if ( !is_object( $row ) ) { // key wasn't present in the database. this will happen sometimes. return false; } $this->fileMetadata[$key] = (array)$row; return true; }
/** * Get the chunk db state and populate update relevant local values */ private function getChunkStatus() { // get Master db to avoid race conditions. // Otherwise, if chunk upload time < replag there will be spurious errors $dbw = $this->repo->getMasterDb(); $row = $dbw->selectRow('uploadstash', array('us_chunk_inx', 'us_size', 'us_path'), array('us_key' => $this->mFileKey), __METHOD__); // Handle result: if ($row) { $this->mChunkIndex = $row->us_chunk_inx; $this->mOffset = $row->us_size; $this->mVirtualTempPath = $row->us_path; } }
/** * Remove a file (see removeFile), but doesn't check ownership first. * * @return boolean: success */ public function removeFileNoAuth($key) { wfDebug(__METHOD__ . " clearing row {$key}\n"); $dbw = $this->repo->getMasterDb(); // this gets its own transaction since it's called serially by the cleanupUploadStash maintenance script $dbw->begin(); $dbw->delete('uploadstash', array('us_key' => $key), __METHOD__); $dbw->commit(); // TODO: look into UnregisteredLocalFile and find out why the rv here is sometimes wrong (false when file was removed) // for now, ignore. $this->files[$key]->remove(); unset($this->files[$key]); unset($this->fileMetadata[$key]); return true; }