Finish parent folder implementation, change recursive delete process

remotes/origin/stable45
Michael Gapczynski 2012-06-18 15:18:30 +07:00 committed by Bart Visscher
parent 0cc7ae904d
commit c7e0449a75
1 changed files with 78 additions and 37 deletions

@ -1,5 +1,4 @@
<?php
/**
* ownCloud
*
@ -132,7 +131,7 @@ class Share {
\OC_Log::write('OCP\Share', 'Sharing '.$item.' failed, because this item is already shared with the user '.$shareWith, \OC_Log::ERROR);
return false;
}
$uidSharedWith = array($shareWith);
$uidSharedWith = $shareWith;
$gidSharedWith = null;
break;
case self::SHARETYPE_GROUP:
@ -204,7 +203,7 @@ class Share {
return false;
}
if ($item) {
self::delete($item['item_source'], $item['id']);
self::delete($item['id']);
return true;
}
return false;
@ -237,7 +236,7 @@ class Share {
return false;
}
}
return self::delete($item['item_source'], $item['id'], true);
return self::delete($item['id'], true);
}
return false;
}
@ -481,14 +480,14 @@ class Share {
* @brief Put shared item into the database
* @param string Item type
* @param string Item
* @param array User(s) the item is being shared with
* @param string|array User(s) the item is being shared with
* @param string|null Group the item is being shared with
* @param string Owner of the item
* @param string
* @param int Parent folder target (optional)
* @param bool|array Parent folder target (optional)
* @return bool
*/
private static function put($itemType, $item, $uidSharedWith, $gidSharedWith, $uidOwner, $permissions, $parentFolder = null) {
private static function put($itemType, $item, $uidSharedWith, $gidSharedWith, $uidOwner, $permissions, $parentFolder = false) {
// Check file extension for an equivalent item type to convert to
if ($itemType == 'file') {
$extension = strtolower(substr($item, strrpos($item, '.') + 1));
@ -507,6 +506,7 @@ class Share {
// Check if this is a reshare
if ($checkReshare = self::getItemSharedWith($itemType, $item)) {
// TODO Check if resharing is allowed
// TODO Don't check if inside folder
$parent = $checkReshare['id'];
$itemSource = $checkReshare['item_source'];
$fileSource = $checkReshare['file_source'];
@ -519,18 +519,29 @@ class Share {
return false;
} else if (is_array($source)) {
$itemSource = $source['item'];
$fileSource = \OC_FileCache::getId($source['file']);
$fileSource = self::getBackend('file')->getId($source['file']);
} else {
$itemSource = $source;
$fileSource = null;
}
}
$query = \OC_DB::prepare('INSERT INTO *PREFIX*sharing (item_type, item_source, item_target, parent, uid_shared_with, gid_shared_with, uid_owner, permissions, stime, file_source, file_target) VALUES (?,?,?,?,?,?,?,?,?,?,?)');
// If the item is being shared with a group, add an entry for the group itself
if (isset($gidSharedWith)) {
// Share with a group
if (isset($gidSharedWith)) {
if (isset($fileSource)) {
if (isset($parentFolder)) {
$groupFileTarget = self::getBackend('file')->generateTarget($source['file'], false);
if ($parentFolder) {
if ($parentFolder === true) {
$groupFileTarget = self::getBackend('file')->generateTarget($source['file'], false);
// Set group default file target for future use
$parentFolders[0]['folder'] = $groupFileTarget;
} else {
// Get group default file target
$groupFileTarget = $parentFolder[0]['folder'].$item;
$parent = $parentFolder[0]['id'];
unset($parentFolder[0]);
// Only loop through users we know have different file target paths
$uidSharedWith = array_keys($parentFolder);
}
} else {
$groupFileTarget = self::getBackend('file')->generateTarget($source['file'], false);
}
@ -541,31 +552,64 @@ class Share {
$query->execute(array($itemType, $itemSource, $groupItemTarget, $parent, null, $gidSharedWith, $uidOwner, $permissions, time(), $fileSource, $groupFileTarget));
// Save this id, any extra rows for this group share will need to reference it
$parent = \OC_DB::insertid('*PREFIX*sharing');
}
// Need to loop through the users in a group, just in case we need to change the item target or file target for a specific user
// A normal user share also goes through this loop
foreach ($uidSharedWith as $uid) {
$itemTarget = $backend->generateTarget($item, $uid);
if (isset($fileSource)) {
if (isset($parentFolder)) {
// TODO
// Loop through all users of this group in case we need to add an extra row
foreach ($uidSharedWith as $uid) {
$itemTarget = $backend->generateTarget($item, $uid);
if (isset($fileSource)) {
if ($parentFolder) {
if ($parentFolder === true) {
$fileTarget = self::getBackend('file')->generateTarget($source['file'], $uidSharedWith);
if ($fileTarget != $groupFileTarget) {
$parentFolders[$uid]['folder'] = $fileTarget;
}
} else if (isset($parentFolder[$uid])) {
$fileTarget = $parentFolder[$uid]['folder'].$item;
$parent = $parentFolder[$uid]['id'];
}
} else {
$fileTarget = self::getBackend('file')->generateTarget($source['file'], $uidSharedWith);
}
} else {
$fileTarget = self::getBackend('file')->generateTarget($source['file'], $uid);
$fileTarget = null;
}
} else {
$fileTarget = null;
}
if (isset($gidSharedWith)) {
// Insert an extra row for the group share if the item or file target is unique for this user
if ($itemTarget != $groupItemTarget || (isset($fileSource) && $fileTarget != $groupFileTarget)) {
$query->execute(array($itemType, $itemSource, $itemTarget, $parent, $uid, $gidSharedWith, $uidOwner, $permissions, time(), $fileSource, $fileTarget));
\OC_DB::insertid('*PREFIX*sharing');
$id = \OC_DB::insertid('*PREFIX*sharing');
}
if ($parentFolder === true) {
$parentFolders['id'] = $id;
}
}
if ($parentFolder === true) {
// Return parent folders to preserve file target paths for potential children
return $parentFolders;
}
} else {
// Share with a user
$itemTarget = $backend->generateTarget($item, $uidSharedWith);
if (isset($fileSource)) {
if ($parentFolder) {
if ($parentFolder === true) {
$fileTarget = self::getBackend('file')->generateTarget($source['file'], $uidSharedWith);
$parentFolders['folder'] = $fileTarget;
} else {
$fileTarget = $parentFolder['folder'].$item;
$parent = $parentFolder['id'];
}
} else {
$fileTarget = self::getBackend('file')->generateTarget($source['file'], $uidSharedWith);
}
} else {
$query->execute(array($itemType, $itemSource, $itemTarget, $parent, $uid, $gidSharedWith, $uidOwner, $permissions, time(), $fileSource, $fileTarget));
\OC_DB::insertid('*PREFIX*sharing');
$fileTarget = null;
}
$query->execute(array($itemType, $itemSource, $itemTarget, $parent, $uidSharedWith, null, $uidOwner, $permissions, time(), $fileSource, $fileTarget));
$id = \OC_DB::insertid('*PREFIX*sharing');
if ($parentFolder === true) {
$parentFolders['id'] = $id;
// Return parent folder to preserve file target paths for potential children
return $parentFolders;
}
}
return true;
}
@ -578,14 +622,11 @@ class Share {
* @param int Id of item to delete
* @param bool
*/
private static function delete($itemSource, $parent, $excludeParent = false) {
$query = \OC_DB::prepare('SELECT id, parent FROM *PREFIX*sharing WHERE item_source = ?');
$result = $query->execute(array($itemSource));
private static function delete($parent, $excludeParent = false) {
$query = \OC_DB::prepare('SELECT id FROM *PREFIX*sharing WHERE parent IN (?)');
$ids = array($parent);
while ($item = $result->fetchRow()) {
if (in_array($item['parent'], $ids)) {
$ids[] = $item['id'];
}
while ($item = $query->execute(array(implode("','", $ids)))->fetchRow()) {
$ids[] = $item['id'];
}
if ($excludeParent) {
unset($ids[0]);
@ -612,7 +653,7 @@ class Share {
$query = \OC_DB::prepare('SELECT id, item_source FROM *PREFIX*sharing WHERE uid_owner = ?');
$result = $query->execute(array($arguments['uid']));
while ($item = $result->fetchRow()) {
self::delete($item['item_source'], $item['id']);
self::delete($item['id']);
}
}