/** * Really do the upload * Checks are made in SpecialUpload::execute() * @access private */ function processUpload() { global $wgUser, $wgOut, $wrGedcomUploadDirectory, $wrGrepPath; /* Check for PHP error if any, requires php 4.2 or newer */ // this must appear before the tree name check if ($this->mUploadError == 1) { $this->mainUploadForm(wfMsgHtml('largegedcom')); return; } /** * If there was no filename or a zero size given, give up quick. */ if (trim($this->mOname) == '' || empty($this->mUploadSize)) { $this->mainUploadForm(wfMsgHtml('emptyfile')); return; } if ($this->mUploadError != 0) { $this->mainUploadForm('Error during upload.'); return; } // get tree id if ($this->mTreeName == '[new]') { $treeName = $this->mNewTreeName; } else { $treeName = $this->mTreeName; } $dbr =& wfGetDB(DB_SLAVE); $tree = $dbr->selectRow('familytree', array('ft_tree_id', 'ft_person_count'), array('ft_user' => $wgUser->getName(), 'ft_name' => $treeName)); if ($tree === false) { if (!$treeName) { $this->mainUploadForm('Please enter a name for your new tree'); return; } if (!FamilyTreeUtil::isValidTreeName($treeName)) { $this->mainUploadForm('Sorry, that name contains characters that are not allowed in a tree name'); return; } else { if (FamilyTreeUtil::createFamilyTree($dbr, $wgUser->getName(), $treeName) == FTE_SUCCESS) { $tree = $dbr->selectRow('familytree', array('ft_tree_id', 'ft_person_count'), array('ft_user' => $wgUser->getName(), 'ft_name' => $treeName)); } if ($tree === false) { $this->mainUploadForm('Error creating tree'); return; } } } // else { // $this->mainUploadForm('This tree already exists. You must import your GEDCOM into a new tree.'); // return; // } // check if there are too many people in the file // HACK: set ft_person_count = -1 to allow people to upload GEDCOM's up to UPPER_MAX_PEOPLE // $handle = popen($wrGrepPath.' -c "@ INDI" '.$this->mUploadTempName, 'r'); // use tr to translate from cr to lf so grep works for mac files $handle = popen('cat ' . $this->mUploadTempName . ' | tr \\\\r \\\\n | grep -c "@ INDI"', 'r'); $cnt = fread($handle, 1024); pclose($handle); wfDebug("GEDCOM treeid={$tree->ft_tree_id} count={$cnt} person_count={$tree->ft_person_count}\n"); if ($cnt > self::UPPER_MAX_PEOPLE || $tree->ft_person_count >= 0 && $cnt > self::LOWER_MAX_PEOPLE) { $this->mainUploadForm(wfMsgHtml('largegedcom')); return; } # Chop off any directories in the given filename $basename = wfBaseName($this->mOname); $dbw =& wfGetDB(DB_MASTER); $timestamp = wfTimestampNow(); $record = array('fg_tree_id' => $tree->ft_tree_id, 'fg_gedcom_filename' => $basename, 'fg_status_date' => $timestamp, 'fg_file_size' => $this->mUploadSize, 'fg_default_country' => $this->mDefaultCountry, 'fg_status' => FG_STATUS_UPLOADED); $dbw->insert('familytree_gedcom', $record); $gedcomId = $dbw->selectField('', 'last_insert_id()', null); $destFilename = $wrGedcomUploadDirectory . '/' . $gedcomId . '.ged'; wfSuppressWarnings(); $success = move_uploaded_file($this->mUploadTempName, $destFilename); wfRestoreWarnings(); if (!$success) { wfDebug("wfUploadGedcom error move={$destFilename}\n"); $wgOut->showFileNotFoundError($this->mUploadTempName); return; } chmod($destFilename, 0644); $this->showSuccess($basename, $treeName); }
public static function renameFamilyTree($db, $userName, $treeName, $newTreeName, $renameExisting = false) { global $wgUser; $newTreeName = trim($newTreeName); if ($wgUser->isBlocked() || wfReadOnly()) { return FTE_NOT_AUTHORIZED; } else { if (!FamilyTreeUtil::isValidTreeName($treeName) || !FamilyTreeUtil::isValidTreeName($newTreeName)) { return FTE_INVALID_ARG; } } $status = FTE_SUCCESS; $treeId = $db->selectField('familytree', 'ft_tree_id', array('ft_user' => $userName, 'ft_name' => $treeName)); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } else { if ($treeId === false) { $status = FTE_NOT_FOUND; } else { $newTreeId = $db->selectField('familytree', 'ft_tree_id', array('ft_user' => $userName, 'ft_name' => $newTreeName)); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } else { if ($renameExisting && $newTreeId === false) { $status = FTE_NOT_FOUND; } else { if (!$renameExisting && $newTreeId !== false) { $status = FTE_DUP_KEY; } } } } } if ($status == FTE_SUCCESS) { if ($renameExisting) { // move pages if ($status == FTE_SUCCESS) { $sql = "insert ignore into familytree_page (fp_tree_id, fp_namespace, fp_title, fp_oldid, fp_flags, fp_data_version, fp_latest, fp_talk_oldid, fp_talk_latest, fp_uid, fp_user_id) " . "(select " . $db->addQuotes($newTreeId) . ", fp_namespace, fp_title, fp_oldid, fp_flags, fp_data_version, fp_latest, fp_talk_oldid, fp_talk_latest, fp_uid, fp_user_id " . " from familytree_page where fp_tree_id=" . $db->addQuotes($treeId) . ")"; $db->query($sql, 'renameFamilyTree'); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } if ($status == FTE_SUCCESS) { $db->delete('familytree_page', array('fp_tree_id' => $treeId)); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } // move data if ($status == FTE_SUCCESS) { $sql = "insert ignore into familytree_data (fd_tree_id, fd_namespace, fd_title, fd_data) " . "(select " . $db->addQuotes($newTreeId) . ", fd_namespace, fd_title, fd_data " . " from familytree_data where fd_tree_id=" . $db->addQuotes($treeId) . ")"; $db->query($sql, 'renameFamilyTree'); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } if ($status == FTE_SUCCESS) { $db->delete('familytree_data', array('fd_tree_id' => $treeId)); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } // update gedcoms if ($status == FTE_SUCCESS) { $db->update('familytree_gedcom', array('fg_tree_id' => $newTreeId), array('fg_tree_id' => $treeId)); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } // remove tree if ($status == FTE_SUCCESS) { $db->delete('familytree', array('ft_tree_id' => $treeId)); FamilyTreeUtil::deleteFamilyTreesCache($userName); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } } else { $db->update('familytree', array('ft_name' => $newTreeName), array('ft_tree_id' => $treeId)); FamilyTreeUtil::deleteFamilyTreesCache($userName); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } } // re-index everything if ($status == FTE_SUCCESS) { $ts = wfTimestampNow(); $sql = "insert into index_request (ir_page_id, ir_timestamp) select page_id, " . $db->addQuotes($ts) . " from familytree_page, page " . "where fp_tree_id = " . $db->addQuotes($renameExisting ? $newTreeId : $treeId) . " and fp_namespace = page_namespace and fp_title = page_title"; $db->query($sql, 'renameFamilyTree'); $errno = $db->lastErrno(); if ($errno > 0) { $status = FTE_DB_ERROR; } } // purge user page StructuredData::purgeTitle(Title::makeTitle(NS_USER, $userName)); return $status; }