Commit d5c402feb995547e332cfaba8f2c1710cf1f5282
1 parent
d76c84bb
Merged in...
KTS-3583 "CLONE -Two Files with Same Name, Different DocID but both listings in KTExplorer point to one file, and not the other.(SUP-963)" Fixed. Committed By: Conrad Vermeulen Reviewed By: Megan Watson git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/STABLE/branches/3.5.4-Release-Branch@9506 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
2 changed files
with
168 additions
and
98 deletions
ktapi/KTAPIDocument.inc.php
| @@ -6,31 +6,31 @@ | @@ -6,31 +6,31 @@ | ||
| 6 | * Document Management Made Simple | 6 | * Document Management Made Simple |
| 7 | * Copyright (C) 2008 KnowledgeTree Inc. | 7 | * Copyright (C) 2008 KnowledgeTree Inc. |
| 8 | * Portions copyright The Jam Warehouse Software (Pty) Limited | 8 | * Portions copyright The Jam Warehouse Software (Pty) Limited |
| 9 | - * | 9 | + * |
| 10 | * This program is free software; you can redistribute it and/or modify it under | 10 | * This program is free software; you can redistribute it and/or modify it under |
| 11 | * the terms of the GNU General Public License version 3 as published by the | 11 | * the terms of the GNU General Public License version 3 as published by the |
| 12 | * Free Software Foundation. | 12 | * Free Software Foundation. |
| 13 | - * | 13 | + * |
| 14 | * This program is distributed in the hope that it will be useful, but WITHOUT | 14 | * This program is distributed in the hope that it will be useful, but WITHOUT |
| 15 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 15 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| 16 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | 16 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| 17 | * details. | 17 | * details. |
| 18 | - * | 18 | + * |
| 19 | * You should have received a copy of the GNU General Public License | 19 | * You should have received a copy of the GNU General Public License |
| 20 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 20 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 21 | - * | ||
| 22 | - * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | 21 | + * |
| 22 | + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | ||
| 23 | * California 94120-7775, or email info@knowledgetree.com. | 23 | * California 94120-7775, or email info@knowledgetree.com. |
| 24 | - * | 24 | + * |
| 25 | * The interactive user interfaces in modified source and object code versions | 25 | * The interactive user interfaces in modified source and object code versions |
| 26 | * of this program must display Appropriate Legal Notices, as required under | 26 | * of this program must display Appropriate Legal Notices, as required under |
| 27 | * Section 5 of the GNU General Public License version 3. | 27 | * Section 5 of the GNU General Public License version 3. |
| 28 | - * | 28 | + * |
| 29 | * In accordance with Section 7(b) of the GNU General Public License version 3, | 29 | * In accordance with Section 7(b) of the GNU General Public License version 3, |
| 30 | * these Appropriate Legal Notices must retain the display of the "Powered by | 30 | * these Appropriate Legal Notices must retain the display of the "Powered by |
| 31 | - * KnowledgeTree" logo and retain the original copyright notice. If the display of the | 31 | + * KnowledgeTree" logo and retain the original copyright notice. If the display of the |
| 32 | * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | 32 | * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices |
| 33 | - * must display the words "Powered by KnowledgeTree" and retain the original | 33 | + * must display the words "Powered by KnowledgeTree" and retain the original |
| 34 | * copyright notice. | 34 | * copyright notice. |
| 35 | * Contributor( s): ______________________________________ | 35 | * Contributor( s): ______________________________________ |
| 36 | * | 36 | * |
| @@ -113,7 +113,7 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -113,7 +113,7 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 113 | { | 113 | { |
| 114 | return ($this->document->getStatusID() == 3); | 114 | return ($this->document->getStatusID() == 3); |
| 115 | } | 115 | } |
| 116 | - | 116 | + |
| 117 | /** | 117 | /** |
| 118 | * Checks if the document is a shortcut | 118 | * Checks if the document is a shortcut |
| 119 | * | 119 | * |
| @@ -132,8 +132,8 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -132,8 +132,8 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 132 | { | 132 | { |
| 133 | return $this->document->getSymbolicLinks(); | 133 | return $this->document->getSymbolicLinks(); |
| 134 | } | 134 | } |
| 135 | - | ||
| 136 | - | 135 | + |
| 136 | + | ||
| 137 | /** | 137 | /** |
| 138 | * This is the constructor for the KTAPI_Folder. | 138 | * This is the constructor for the KTAPI_Folder. |
| 139 | * | 139 | * |
| @@ -379,7 +379,7 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -379,7 +379,7 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 379 | //if the document is checked-out by the current user, just return | 379 | //if the document is checked-out by the current user, just return |
| 380 | //as no need to check-out again BUT we do need to download | 380 | //as no need to check-out again BUT we do need to download |
| 381 | //returning here will allow download, but skip check-out | 381 | //returning here will allow download, but skip check-out |
| 382 | - if ( ($this->document->getIsCheckedOut()) && | 382 | + if ( ($this->document->getIsCheckedOut()) && |
| 383 | ($this->document->getCheckedOutUserID() == $_SESSION['userID']) ) | 383 | ($this->document->getCheckedOutUserID() == $_SESSION['userID']) ) |
| 384 | { | 384 | { |
| 385 | return; | 385 | return; |
| @@ -517,6 +517,8 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -517,6 +517,8 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 517 | return $result; | 517 | return $result; |
| 518 | } | 518 | } |
| 519 | 519 | ||
| 520 | + $tgt_folder = $target_folder->get_folder(); | ||
| 521 | + | ||
| 520 | $name = $this->document->getName(); | 522 | $name = $this->document->getName(); |
| 521 | $clash = KTDocumentUtil::nameExists($target_folder, $name); | 523 | $clash = KTDocumentUtil::nameExists($target_folder, $name); |
| 522 | if ($clash && !is_null($newname)) | 524 | if ($clash && !is_null($newname)) |
| @@ -526,7 +528,14 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -526,7 +528,14 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 526 | } | 528 | } |
| 527 | if ($clash) | 529 | if ($clash) |
| 528 | { | 530 | { |
| 529 | - return new PEAR_Error('A document with this title already exists in your chosen folder. Please choose a different folder, or specify a new title for the copied document.'); | 531 | + if (is_null($newname)) |
| 532 | + { | ||
| 533 | + $name = KTDocumentUtil::getUniqueDocumentName($tgt_folder, $name); | ||
| 534 | + } | ||
| 535 | + else | ||
| 536 | + { | ||
| 537 | + return new PEAR_Error('A document with this title already exists in your chosen folder. Please choose a different folder, or specify a new title for the copied document.'); | ||
| 538 | + } | ||
| 530 | } | 539 | } |
| 531 | 540 | ||
| 532 | $filename=$this->document->getFilename(); | 541 | $filename=$this->document->getFilename(); |
| @@ -539,7 +548,14 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -539,7 +548,14 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 539 | } | 548 | } |
| 540 | if ($clash) | 549 | if ($clash) |
| 541 | { | 550 | { |
| 542 | - return new PEAR_Error('A document with this filename already exists in your chosen folder. Please choose a different folder, or specify a new filename for the copied document.'); | 551 | + if (is_null($newfilename)) |
| 552 | + { | ||
| 553 | + $filename = KTDocumentUtil::getUniqueFilename($tgt_folder, $newfilename); | ||
| 554 | + } | ||
| 555 | + else | ||
| 556 | + { | ||
| 557 | + return new PEAR_Error('A document with this filename already exists in your chosen folder. Please choose a different folder, or specify a new filename for the copied document.'); | ||
| 558 | + } | ||
| 543 | } | 559 | } |
| 544 | 560 | ||
| 545 | DBUtil::startTransaction(); | 561 | DBUtil::startTransaction(); |
| @@ -1502,7 +1518,7 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -1502,7 +1518,7 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 1502 | 1518 | ||
| 1503 | $detail = array(); | 1519 | $detail = array(); |
| 1504 | $document = $this->document; | 1520 | $document = $this->document; |
| 1505 | - | 1521 | + |
| 1506 | // get the document id | 1522 | // get the document id |
| 1507 | $detail['document_id'] = (int) $document->getId(); | 1523 | $detail['document_id'] = (int) $document->getId(); |
| 1508 | 1524 | ||
| @@ -1625,7 +1641,7 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -1625,7 +1641,7 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 1625 | { | 1641 | { |
| 1626 | $detail['version'] = (float) $detail['version']; | 1642 | $detail['version'] = (float) $detail['version']; |
| 1627 | } | 1643 | } |
| 1628 | - | 1644 | + |
| 1629 | //might be unset at the bottom in case of old webservice version | 1645 | //might be unset at the bottom in case of old webservice version |
| 1630 | //make sure we're using the real document for this one | 1646 | //make sure we're using the real document for this one |
| 1631 | $this->document->switchToRealCore(); | 1647 | $this->document->switchToRealCore(); |
| @@ -1684,7 +1700,7 @@ class KTAPI_Document extends KTAPI_FolderItem | @@ -1684,7 +1700,7 @@ class KTAPI_Document extends KTAPI_FolderItem | ||
| 1684 | if($wsversion < 3){ | 1700 | if($wsversion < 3){ |
| 1685 | unset($detail['linked_document_id']); | 1701 | unset($detail['linked_document_id']); |
| 1686 | } | 1702 | } |
| 1687 | - | 1703 | + |
| 1688 | return $detail; | 1704 | return $detail; |
| 1689 | } | 1705 | } |
| 1690 | 1706 |
lib/documentmanagement/documentutil.inc.php
| @@ -683,20 +683,37 @@ $sourceDocument->getName(), | @@ -683,20 +683,37 @@ $sourceDocument->getName(), | ||
| 683 | } | 683 | } |
| 684 | // }}} | 684 | // }}} |
| 685 | 685 | ||
| 686 | + function getUniqueFilename($oFolder, $sFilename) { | ||
| 687 | + // this is just a quick refactoring. We should look at a more optimal way of doing this as there are | ||
| 688 | + // quite a lot of queries. | ||
| 689 | + $iFolderId = $oFolder->getId(); | ||
| 690 | + while (KTDocumentUtil::fileExists($oFolder, $sFilename)) { | ||
| 691 | + $oDoc = Document::getByFilenameAndFolder($sFilename, $iFolderId); | ||
| 692 | + $sFilename = KTDocumentUtil::generateNewDocumentFilename($oDoc->getFileName()); | ||
| 693 | + } | ||
| 694 | + return $sFilename; | ||
| 695 | + } | ||
| 696 | + | ||
| 697 | + function getUniqueDocumentName($oFolder, $sFilename) | ||
| 698 | + { | ||
| 699 | + // this is just a quick refactoring. We should look at a more optimal way of doing this as there are | ||
| 700 | + // quite a lot of queries. | ||
| 701 | + $iFolderId = $oFolder->getId(); | ||
| 702 | + while(KTDocumentUtil::nameExists($oFolder, $sFilename)) { | ||
| 703 | + $oDoc = Document::getByNameAndFolder($sFilename, $iFolderId); | ||
| 704 | + $sFilename = KTDocumentUtil::generateNewDocumentName($oDoc->getName()); | ||
| 705 | + } | ||
| 706 | + return $sFilename; | ||
| 707 | + } | ||
| 686 | 708 | ||
| 687 | // {{{ _in_add | 709 | // {{{ _in_add |
| 688 | function &_in_add($oFolder, $sFilename, $oUser, $aOptions) { | 710 | function &_in_add($oFolder, $sFilename, $oUser, $aOptions) { |
| 689 | $aOrigOptions = $aOptions; | 711 | $aOrigOptions = $aOptions; |
| 690 | - while(KTDocumentUtil::fileExists($oFolder, $sFilename)) { | ||
| 691 | - $oDoc = Document::getByFilenameAndFolder($sFilename, $oFolder->getId()); | ||
| 692 | - $sFilename = KTDocumentUtil::generateNewDocumentFilename($oDoc->getFileName()); | ||
| 693 | - } | 712 | + |
| 713 | + $sFilename = KTDocumentUtil::getUniqueFilename($oFolder, $sFilename); | ||
| 694 | $sName = KTUtil::arrayGet($aOptions, 'description', $sFilename); | 714 | $sName = KTUtil::arrayGet($aOptions, 'description', $sFilename); |
| 695 | - while(KTDocumentUtil::nameExists($oFolder, $sName)) { | ||
| 696 | - $oDoc = Document::getByNameAndFolder($sName, $oFolder->getId()); | ||
| 697 | - $aOptions['description'] = KTDocumentUtil::generateNewDocumentName($oDoc->getName()); | ||
| 698 | - $sName = KTDocumentUtil::generateNewDocumentName($oDoc->getName()); | ||
| 699 | - } | 715 | + $sName = KTDocumentUtil::getUniqueDocumentName($oFolder, $sName); |
| 716 | + $aOptions['description'] = $sName; | ||
| 700 | 717 | ||
| 701 | $oUploadChannel =& KTUploadChannel::getSingleton(); | 718 | $oUploadChannel =& KTUploadChannel::getSingleton(); |
| 702 | $oUploadChannel->sendMessage(new KTUploadNewFile($sFilename)); | 719 | $oUploadChannel->sendMessage(new KTUploadNewFile($sFilename)); |
| @@ -780,43 +797,48 @@ $sourceDocument->getName(), | @@ -780,43 +797,48 @@ $sourceDocument->getName(), | ||
| 780 | } | 797 | } |
| 781 | // }}} | 798 | // }}} |
| 782 | 799 | ||
| 783 | - function generateNewDocumentFilename($sDocFilename){ | ||
| 784 | - if(preg_match("/\([0-9]+\)(\.[^\.]+){1,}$/", $sDocFilename)){ | ||
| 785 | - preg_match("/\([0-9]+\)\./", $sDocFilename, $matches); | ||
| 786 | - $new_one = substr($matches[0], 1); | ||
| 787 | - $new_two = explode(')', $new_one); | ||
| 788 | - $new = $new_two[0]+1; | ||
| 789 | - | ||
| 790 | - $pattern[0] = '/\([0-9]+\)\./'; | ||
| 791 | - $replacement[0] = ' ('.$new.').'; | ||
| 792 | - $sFilename = preg_replace($pattern, $replacement, $sDocFilename); | ||
| 793 | - }else{ | ||
| 794 | - $matches = explode('.', $sDocFilename); | ||
| 795 | - $prefix = $matches[0].' (2)'; | ||
| 796 | - for($i = 1; $i < count($matches); $i++ ){ | ||
| 797 | - $suffix .= '.'.$matches[$i]; | ||
| 798 | - } | ||
| 799 | - $sFilename = $prefix.$suffix; | ||
| 800 | - } | ||
| 801 | - | ||
| 802 | - return $sFilename; | 800 | + function incrementNameCollissionNumbering($sDocFilename, $skipExtension = false){ |
| 801 | + | ||
| 802 | + $iDot = strpos($sDocFilename, '.'); | ||
| 803 | + if ($skipExtension || $iDot === false) | ||
| 804 | + { | ||
| 805 | + if(preg_match("/\(([0-9]+)\)$/", $sDocFilename, $matches, PREG_OFFSET_CAPTURE)) { | ||
| 806 | + | ||
| 807 | + $iCount = $matches[1][0]; | ||
| 808 | + $iPos = $matches[1][1]; | ||
| 809 | + | ||
| 810 | + $iNewCount = $iCount + 1; | ||
| 811 | + $sDocFilename = substr($sDocFilename, 0, $iPos) . $iNewCount . substr($sDocFilename, $iPos + strlen($iCount)); | ||
| 812 | + } | ||
| 813 | + else { | ||
| 814 | + $sDocFilename = $sDocFilename . '(1)'; | ||
| 815 | + } | ||
| 816 | + } | ||
| 817 | + else | ||
| 818 | + { | ||
| 819 | + if(preg_match("/\(([0-9]+)\)(\.[^\.]+)+$/", $sDocFilename, $matches, PREG_OFFSET_CAPTURE)) { | ||
| 820 | + | ||
| 821 | + $iCount = $matches[1][0]; | ||
| 822 | + $iPos = $matches[1][1]; | ||
| 823 | + | ||
| 824 | + $iNewCount = $iCount + 1; | ||
| 825 | + $sDocFilename = substr($sDocFilename, 0, $iPos) . $iNewCount . substr($sDocFilename, $iPos + strlen($iCount)); | ||
| 826 | + } | ||
| 827 | + else { | ||
| 828 | + $sDocFilename = substr($sDocFilename, 0, $iDot) . '(1)' . substr($sDocFilename, $iDot); | ||
| 829 | + } | ||
| 830 | + } | ||
| 831 | + return $sDocFilename; | ||
| 832 | + } | ||
| 833 | + | ||
| 834 | + | ||
| 835 | + function generateNewDocumentFilename($sDocFilename) { | ||
| 836 | + return self::incrementNameCollissionNumbering($sDocFilename, false); | ||
| 803 | } | 837 | } |
| 804 | 838 | ||
| 805 | function generateNewDocumentName($sDocName){ | 839 | function generateNewDocumentName($sDocName){ |
| 806 | - if(preg_match("/\([0-9]+\)$/", $sDocName)){ | ||
| 807 | - preg_match("/\([0-9]+\)$/", $sDocName, $matches); | ||
| 808 | - $new_one = substr($matches[0], 1); | ||
| 809 | - $new_two = explode(')', $new_one); | ||
| 810 | - $new = $new_two[0]+1; | ||
| 811 | - | ||
| 812 | - $pattern[0] = '/\([0-9]+\)$/'; | ||
| 813 | - $replacement[0] = '('.$new.')'; | ||
| 814 | - $sName = preg_replace($pattern, $replacement, $sDocName); | ||
| 815 | - }else{ | ||
| 816 | - $sName = $sDocName.' (2)'; | ||
| 817 | - } | ||
| 818 | - | ||
| 819 | - return $sName; | 840 | + return self::incrementNameCollissionNumbering($sDocName, true); |
| 841 | + | ||
| 820 | } | 842 | } |
| 821 | 843 | ||
| 822 | // {{{ fileExists | 844 | // {{{ fileExists |
| @@ -1039,61 +1061,89 @@ $sourceDocument->getName(), | @@ -1039,61 +1061,89 @@ $sourceDocument->getName(), | ||
| 1039 | //print '--------------------------------- BEFORE'; | 1061 | //print '--------------------------------- BEFORE'; |
| 1040 | //print_r($oDocument); | 1062 | //print_r($oDocument); |
| 1041 | 1063 | ||
| 1042 | - // grab the "source "data | ||
| 1043 | - $sTable = KTUtil::getTableName('documents'); | ||
| 1044 | - $sQuery = 'SELECT * FROM ' . $sTable . ' WHERE id = ?'; | 1064 | + // TODO: this is not optimal. we have get() functions that will do SELECT when we already have the data in arrays |
| 1065 | + | ||
| 1066 | + // get the core record to be copied | ||
| 1067 | + $sDocumentTable = KTUtil::getTableName('documents'); | ||
| 1068 | + $sQuery = 'SELECT * FROM ' . $sDocumentTable . ' WHERE id = ?'; | ||
| 1045 | $aParams = array($oDocument->getId()); | 1069 | $aParams = array($oDocument->getId()); |
| 1046 | $aCoreRow = DBUtil::getOneResult(array($sQuery, $aParams)); | 1070 | $aCoreRow = DBUtil::getOneResult(array($sQuery, $aParams)); |
| 1071 | + // we unset the id as a new one will be created on insert | ||
| 1047 | unset($aCoreRow['id']); | 1072 | unset($aCoreRow['id']); |
| 1048 | 1073 | ||
| 1049 | - $aCoreRow['modified'] = date('Y-m-d H:i:s'); | ||
| 1050 | - $aCoreRow['folder_id'] = $oDestinationFolder->getId(); // new location. | ||
| 1051 | - $id = DBUtil::autoInsert($sTable, $aCoreRow); | ||
| 1052 | - if (PEAR::isError($id)) { return $id; } | ||
| 1053 | - // we still have a bogus md_version, but integrity holds, so fix it now. | ||
| 1054 | - $oCore = KTDocumentCore::get($id); | ||
| 1055 | - | ||
| 1056 | - // Get the metadata version for the source document | ||
| 1057 | - $sTable = KTUtil::getTableName('document_metadata_version'); | ||
| 1058 | - $sQuery = 'SELECT * FROM ' . $sTable . ' WHERE id = ?'; | ||
| 1059 | - $aParams = array($oDocument->getMetadataVersionId()); | 1074 | + // get a copy of the latest metadata version for the copied document |
| 1075 | + $iOldMetadataId = $aCoreRow['metadata_version_id']; | ||
| 1076 | + $sMetadataTable = KTUtil::getTableName('document_metadata_version'); | ||
| 1077 | + $sQuery = 'SELECT * FROM ' . $sMetadataTable . ' WHERE id = ?'; | ||
| 1078 | + $aParams = array($iOldMetadataId); | ||
| 1060 | $aMDRow = DBUtil::getOneResult(array($sQuery, $aParams)); | 1079 | $aMDRow = DBUtil::getOneResult(array($sQuery, $aParams)); |
| 1080 | + // we unset the id as a new one will be created on insert | ||
| 1061 | unset($aMDRow['id']); | 1081 | unset($aMDRow['id']); |
| 1062 | 1082 | ||
| 1063 | - // Copy the source metadata into the destination document | ||
| 1064 | - $aMDRow['document_id'] = $oCore->getId(); | ||
| 1065 | - if(!empty($sDestinationDocName)){ | 1083 | + // set the name for the document, possibly using name collission |
| 1084 | + if (empty($sDestinationDocName)){ | ||
| 1085 | + $aMDRow['name'] = KTDocumentUtil::getUniqueDocumentName($oDestinationFolder, $aMDRow['name']); | ||
| 1086 | + } | ||
| 1087 | + else { | ||
| 1066 | $aMDRow['name'] = $sDestinationDocName; | 1088 | $aMDRow['name'] = $sDestinationDocName; |
| 1067 | - $aMDRow['description'] = $sDestinationDocName; | ||
| 1068 | } | 1089 | } |
| 1069 | - $id = DBUtil::autoInsert($sTable, $aMDRow); | ||
| 1070 | - if (PEAR::isError($id)) { return $id; } | ||
| 1071 | - $oCore->setMetadataVersionId($id); | ||
| 1072 | - $oMDV = KTDocumentMetadataVersion::get($id); | ||
| 1073 | 1090 | ||
| 1074 | - // Get the content version for the source document | ||
| 1075 | - $sTable = KTUtil::getTableName('document_content_version'); | ||
| 1076 | - $sQuery = 'SELECT * FROM ' . $sTable . ' WHERE id = ?'; | ||
| 1077 | - $aParams = array($oDocument->_oDocumentContentVersion->getId()); | 1091 | + // get a copy of the latest content version for the copied document |
| 1092 | + $iOldContentId = $aMDRow['content_version_id']; | ||
| 1093 | + $sContentTable = KTUtil::getTableName('document_content_version'); | ||
| 1094 | + $sQuery = 'SELECT * FROM ' . $sContentTable . ' WHERE id = ?'; | ||
| 1095 | + $aParams = array($iOldContentId); | ||
| 1078 | $aContentRow = DBUtil::getOneResult(array($sQuery, $aParams)); | 1096 | $aContentRow = DBUtil::getOneResult(array($sQuery, $aParams)); |
| 1097 | + // we unset the id as a new one will be created on insert | ||
| 1079 | unset($aContentRow['id']); | 1098 | unset($aContentRow['id']); |
| 1080 | 1099 | ||
| 1081 | - // Copy the source content into the destination document | ||
| 1082 | - $aContentRow['document_id'] = $oCore->getId(); | ||
| 1083 | - if(!empty($sDestinationDocName)){ | 1100 | + // set the filename for the document, possibly using name collission |
| 1101 | + if(empty($sDestinationDocName)) { | ||
| 1102 | + $aContentRow['filename'] = KTDocumentUtil::getUniqueFilename($oDestinationFolder, $aContentRow['filename']); | ||
| 1103 | + } | ||
| 1104 | + else { | ||
| 1084 | $aContentRow['filename'] = $sDestinationDocName; | 1105 | $aContentRow['filename'] = $sDestinationDocName; |
| 1085 | } | 1106 | } |
| 1086 | - $id = DBUtil::autoInsert($sTable, $aContentRow); | 1107 | + |
| 1108 | + // create the new document record | ||
| 1109 | + $aCoreRow['modified'] = date('Y-m-d H:i:s'); | ||
| 1110 | + $aCoreRow['folder_id'] = $oDestinationFolder->getId(); // new location. | ||
| 1111 | + $id = DBUtil::autoInsert($sDocumentTable, $aCoreRow); | ||
| 1112 | + if (PEAR::isError($id)) { return $id; } | ||
| 1113 | + $iNewDocumentId = $id; | ||
| 1114 | + | ||
| 1115 | + // create the new metadata record | ||
| 1116 | + $aMDRow['document_id'] = $iNewDocumentId; | ||
| 1117 | + $aMDRow['description'] = $aMDRow['name']; | ||
| 1118 | + $id = DBUtil::autoInsert($sMetadataTable, $aMDRow); | ||
| 1119 | + if (PEAR::isError($id)) { return $id; } | ||
| 1120 | + $iNewMetadataId = $id; | ||
| 1121 | + | ||
| 1122 | + // the document metadata version is still pointing to the original | ||
| 1123 | + $aCoreUpdate = array(); | ||
| 1124 | + $aCoreUpdate['metadata_version_id'] = $iNewMetadataId; | ||
| 1125 | + $aCoreUpdate['metadata_version'] = 0; | ||
| 1126 | + | ||
| 1127 | + // create the new content version | ||
| 1128 | + $aContentRow['document_id'] = $iNewDocumentId; | ||
| 1129 | + $id = DBUtil::autoInsert($sContentTable, $aContentRow); | ||
| 1087 | if (PEAR::isError($id)) { return $id; } | 1130 | if (PEAR::isError($id)) { return $id; } |
| 1088 | - $oMDV->setContentVersionId($id); | 1131 | + $iNewContentId = $id; |
| 1089 | 1132 | ||
| 1090 | - $res = $oCore->update(); | 1133 | + // the metadata content version is still pointing to the original |
| 1134 | + $aMetadataUpdate = array(); | ||
| 1135 | + $aMetadataUpdate['content_version_id'] = $iNewContentId; | ||
| 1136 | + $aMetadataUpdate['metadata_version'] = 0; | ||
| 1137 | + | ||
| 1138 | + // apply the updates to the document and metadata records | ||
| 1139 | + $res = DBUtil::autoUpdate($sDocumentTable, $aCoreUpdate, $iNewDocumentId); | ||
| 1091 | if (PEAR::isError($res)) { return $res; } | 1140 | if (PEAR::isError($res)) { return $res; } |
| 1092 | - $res = $oMDV->update(); | 1141 | + |
| 1142 | + $res = DBUtil::autoUpdate($sMetadataTable, $aMetadataUpdate, $iNewMetadataId); | ||
| 1093 | if (PEAR::isError($res)) { return $res; } | 1143 | if (PEAR::isError($res)) { return $res; } |
| 1094 | 1144 | ||
| 1095 | // now, we have a semi-sane document object. get it. | 1145 | // now, we have a semi-sane document object. get it. |
| 1096 | - $oNewDocument = Document::get($oCore->getId()); | 1146 | + $oNewDocument = Document::get($iNewDocumentId); |
| 1097 | 1147 | ||
| 1098 | //print '--------------------------------- AFTER'; | 1148 | //print '--------------------------------- AFTER'; |
| 1099 | //print_r($oDocument); | 1149 | //print_r($oDocument); |
| @@ -1101,7 +1151,7 @@ $sourceDocument->getName(), | @@ -1101,7 +1151,7 @@ $sourceDocument->getName(), | ||
| 1101 | //print_r($oNewDocument); | 1151 | //print_r($oNewDocument); |
| 1102 | 1152 | ||
| 1103 | // copy the metadata from old to new. | 1153 | // copy the metadata from old to new. |
| 1104 | - $res = KTDocumentUtil::copyMetadata($oNewDocument, $oDocument->getMetadataVersionId()); | 1154 | + $res = KTDocumentUtil::copyMetadata($oNewDocument, $iOldMetadataId); |
| 1105 | if (PEAR::isError($res)) { return $res; } | 1155 | if (PEAR::isError($res)) { return $res; } |
| 1106 | 1156 | ||
| 1107 | // Ensure the copied document is not checked out | 1157 | // Ensure the copied document is not checked out |
| @@ -1112,7 +1162,6 @@ $sourceDocument->getName(), | @@ -1112,7 +1162,6 @@ $sourceDocument->getName(), | ||
| 1112 | $oStorage =& KTStorageManagerUtil::getSingleton(); | 1162 | $oStorage =& KTStorageManagerUtil::getSingleton(); |
| 1113 | $res = $oStorage->copy($oDocument, $oNewDocument); | 1163 | $res = $oStorage->copy($oDocument, $oNewDocument); |
| 1114 | 1164 | ||
| 1115 | - | ||
| 1116 | $oOriginalFolder = Folder::get($oDocument->getFolderId()); | 1165 | $oOriginalFolder = Folder::get($oDocument->getFolderId()); |
| 1117 | $iOriginalFolderPermissionObjectId = $oOriginalFolder->getPermissionObjectId(); | 1166 | $iOriginalFolderPermissionObjectId = $oOriginalFolder->getPermissionObjectId(); |
| 1118 | $iDocumentPermissionObjectId = $oDocument->getPermissionObjectId(); | 1167 | $iDocumentPermissionObjectId = $oDocument->getPermissionObjectId(); |
| @@ -1227,12 +1276,17 @@ $sourceDocument->getName(), | @@ -1227,12 +1276,17 @@ $sourceDocument->getName(), | ||
| 1227 | 1276 | ||
| 1228 | //put the document in the new folder | 1277 | //put the document in the new folder |
| 1229 | $oDocument->setFolderID($oFolder->getId()); | 1278 | $oDocument->setFolderID($oFolder->getId()); |
| 1279 | + $sName = $oDocument->getName(); | ||
| 1280 | + $sFilename = $oDocument->getFileName(); | ||
| 1281 | + | ||
| 1282 | + $oDocument->setFileName(KTDocumentUtil::getUniqueFilename($oToFolder, $sFilename)); | ||
| 1283 | + $oDocument->setName(KTDocumentUtil::getUniqueDocumentName($oToFolder, $sName)); | ||
| 1284 | + | ||
| 1230 | $res = $oDocument->update(); | 1285 | $res = $oDocument->update(); |
| 1231 | if (PEAR::isError($res)) { | 1286 | if (PEAR::isError($res)) { |
| 1232 | return $res; | 1287 | return $res; |
| 1233 | } | 1288 | } |
| 1234 | 1289 | ||
| 1235 | - | ||
| 1236 | //move the document on the file system(not if it's a symlink) | 1290 | //move the document on the file system(not if it's a symlink) |
| 1237 | if(!$oDocument->isSymbolicLink()){ | 1291 | if(!$oDocument->isSymbolicLink()){ |
| 1238 | $oStorage =& KTStorageManagerUtil::getSingleton(); | 1292 | $oStorage =& KTStorageManagerUtil::getSingleton(); |