diff options
Diffstat (limited to 'include/attach.php')
-rw-r--r-- | include/attach.php | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/include/attach.php b/include/attach.php index 172840b96..237b06217 100644 --- a/include/attach.php +++ b/include/attach.php @@ -1994,3 +1994,222 @@ function get_filename_by_cloudname($cloudname, $channel, $storepath) { } return null; } + + +// recursively copy a directory into cloud files +function copy_folder_to_cloudfiles($channel, $observer_hash, $srcpath, $cloudpath) +{ + if (!is_dir($srcpath) || !is_readable($srcpath)) { + logger('Error reading source path: ' . $srcpath, LOGGER_NORMAL); + return false; + } + $nodes = array_diff(scandir($srcpath), array('.', '..')); + foreach ($nodes as $node) { + $clouddir = $cloudpath . '/' . $node; // Sub-folder in cloud files destination + $nodepath = $srcpath . '/' . $node; // Sub-folder in source path + if(is_dir($nodepath)) { + $x = attach_mkdirp($channel, $observer_hash, array('pathname' => $clouddir)); + if(!$x['success']) { + logger('Error creating cloud path: ' . $clouddir, LOGGER_NORMAL); + return false; + } + // Recursively call this function where the source and destination are the subfolders + $success = copy_folder_to_cloudfiles($channel, $observer_hash, $nodepath, $clouddir); + if(!$success) { + logger('Error copying contents of folder: ' . $nodepath, LOGGER_NORMAL); + return false; + } + } elseif (is_file($nodepath) && is_readable($nodepath)) { + $x = attach_store($channel, $observer_hash, 'import', + array( + 'directory' => $cloudpath, + 'src' => $nodepath, + 'filename' => $node, + 'filesize' => @filesize($nodepath), + 'preserve_original' => true) + ); + if(!$x['success']) { + logger('Error copying file: ' . $nodepath , LOGGER_NORMAL); + logger('Return value: ' . json_encode($x), LOGGER_NORMAL); + return false; + } + } else { + logger('Error scanning source path', LOGGER_NORMAL); + return false; + } + } + + return true; +} +/** + * attach_move() + * This function performs an in place directory-to-directory move of a stored attachment or photo. + * The data is physically moved in the store/nickname storage location and the paths adjusted + * in the attach structure (and if applicable the photo table). The new 'album name' is recorded + * for photos and will show up immediately there. + * This takes a channel_id, attach.hash of the file to move (this is the same as a photo resource_id), and + * the attach.hash of the new parent folder, which must already exist. If $new_folder_hash is blank or empty, + * the file is relocated to the root of the channel's storage area. + * + * @fixme: this operation is currently not synced to clones !! + */ + +function attach_move($channel_id,$resource_id,$new_folder_hash) { + + $c = channelx_by_n($channel_id); + if(! $c) + return false; + + $r = q("select * from attach where hash = '%s' and uid = %d limit 1", + dbesc($resource_id), + intval($channel_id) + ); + if(! $r) + return false; + + $oldstorepath = $r[0]['content']; + + if($new_folder_hash) { + $n = q("select * from attach where hash = '%s' and uid = %d limit 1", + dbesc($new_folder_hash), + intval($channel_id) + ); + if(! $n) + return; + $newdirname = $n[0]['filename']; + $newstorepath = $n[0]['content'] . '/' . $resource_id; + } + else { + $newstorepath = 'store/' . $c['channel_address'] . '/' . $resource_id; + } + + rename($oldstorepath,$newstorepath); + + // duplicate detection. If 'overwrite' is specified, return false because we can't yet do that. + + $filename = $r[0]['filename']; + + $s = q("select filename, id, hash, filesize from attach where filename = '%s' and folder = '%s' ", + dbesc($filename), + dbesc($new_folder_hash) + ); + + if($s) { + $overwrite = get_pconfig($channel_id,'system','overwrite_dup_files'); + if($overwrite) { + // @fixme + return; + } + else { + if(strpos($filename,'.') !== false) { + $basename = substr($filename,0,strrpos($filename,'.')); + $ext = substr($filename,strrpos($filename,'.')); + } + else { + $basename = $filename; + $ext = ''; + } + + $v = q("select filename from attach where ( filename = '%s' OR filename like '%s' ) and folder = '%s' ", + dbesc($basename . $ext), + dbesc($basename . '(%)' . $ext), + dbesc($new_folder_hash) + ); + + if($v) { + $x = 1; + + do { + $found = false; + foreach($v as $vv) { + if($vv['filename'] === $basename . '(' . $x . ')' . $ext) { + $found = true; + break; + } + } + if($found) + $x++; + } + while($found); + $filename = $basename . '(' . $x . ')' . $ext; + } + else + $filename = $basename . $ext; + } + } + + $t = q("update attach set content = '%s', folder = '%s', filename = '%s' where id = %d", + dbesc($newstorepath), + dbesc($new_folder_hash), + dbesc($filename), + intval($r[0]['id']) + ); + + if($r[0]['is_photo']) { + $t = q("update photo set album = '%s', filename = '%s' where resource_id = '%s' and uid = %d", + dbesc($newdirname), + dbesc($filename), + dbesc($resource_id), + intval($channel_id) + ); + + $t = q("update photo set content = '%s' where resource_id = '%s' and uid = %d and imgscale = 0", + dbesc($newstorepath), + dbesc($resource_id), + intval($channel_id) + ); + } + + return true; + +} + + +function attach_folder_select_list($channel_id) { + + $r = q("select * from attach where is_dir = 1 and uid = %d", + intval($channel_id) + ); + + $out = []; + $out[''] = '/'; + + if($r) { + foreach($r as $rv) { + $x = attach_folder_rpaths($r,$rv); + if($x) + $out[$x[0]] = $x[1]; + } + } + return $out; +} + +function attach_folder_rpaths($all_folders,$that_folder) { + + $path = '/' . $that_folder['filename']; + $current_hash = $that_folder['hash']; + $parent_hash = $that_folder['folder']; + $error = false; + $found = false; + + if($parent_hash) { + do { + foreach($all_folders as $selected) { + if(! $selected['is_dir']) + continue; + if($selected['hash'] == $parent_hash) { + $path = '/' . $selected['filename'] . $path; + $current_hash = $selected['hash']; + $parent_hash = $selected['folder']; + $found = true; + break; + } + } + if(! $found) + $error = true; + } + while((! $found) && (! $error) && ($parent_hash != '')); + } + return (($error) ? false : [ $current_hash , $path ]); + +}
\ No newline at end of file |