Added directory linking, slight modification to get_size ()

This commit is contained in:
zone 2001-07-09 05:09:27 +00:00
parent 5a3e21ab8d
commit 39ea83ff32

View File

@ -76,6 +76,7 @@ class vfs
var $working_lid; var $working_lid;
var $attributes; var $attributes;
var $override_acl; var $override_acl;
var $linked_dirs;
/*! /*!
@function vfs @function vfs
@ -94,7 +95,14 @@ class vfs
$this->override_acl = 0; $this->override_acl = 0;
/* File/dir attributes, each corresponding to a database field. Useful for use in loops */ /* File/dir attributes, each corresponding to a database field. Useful for use in loops */
$this->attributes = array ("file_id", "owner_id", "createdby_id", "modifiedby_id", "created", "modified", "size", "mime_type", "deleteable", "comment", "app", "directory", "name"); $this->attributes = array ("file_id", "owner_id", "createdby_id", "modifiedby_id", "created", "modified", "size", "mime_type", "deleteable", "comment", "app", "directory", "name", "link_directory", "link_name");
/* We store the linked directories in an array now, so we don't have to make the SQL call again */
$query = $phpgw->db->query ("SELECT directory, name, link_directory, link_name FROM phpgw_vfs WHERE link_directory != '' AND link_name != ''");
while ($phpgw->db->next_record ())
{
$this->linked_dirs[] = $phpgw->db->Record;
}
} }
/*! /*!
@ -186,25 +194,26 @@ class vfs
@param $string full real or fake path @param $string full real or fake path
@param $relatives Relativity array @param $relatives Relativity array
@param $object True returns an object instead of an array @param $object True returns an object instead of an array
@param $nolinks Don't check for links (made with make_link ()). Used internally to prevent recursion
@result $rarray/$robject Array or object containing the fake and real component parts of the path @result $rarray/$robject Array or object containing the fake and real component parts of the path
@discussion Returned values are: @discussion Returned values are:
mask mask
outside outside
fake_full_path fake_full_path
fake_leading_dirs fake_leading_dirs
fake_extra_path fake_extra_path BROKEN
fake_name fake_name
real_full_path real_full_path
real_leading_dirs real_leading_dirs
real_extra_path real_extra_path BROKEN
real_name real_name
fake_full_path_clean fake_full_path_clean
fake_leading_dirs_clean fake_leading_dirs_clean
fake_extra_path_clean fake_extra_path_clean BROKEN
fake_name_clean fake_name_clean
real_full_path_clean real_full_path_clean
real_leading_dirs_clean real_leading_dirs_clean
real_extra_path_clean real_extra_path_clean BROKEN
real_name_clean real_name_clean
"clean" values are run through vfs->db_clean () and "clean" values are run through vfs->db_clean () and
are safe for use in SQL queries that use key='value' are safe for use in SQL queries that use key='value'
@ -215,7 +224,7 @@ class vfs
outside is boolean, True if $relatives contains VFS_REAL outside is boolean, True if $relatives contains VFS_REAL
*/ */
function path_parts ($string, $relatives = array (RELATIVE_CURRENT), $object = True) function path_parts ($string, $relatives = array (RELATIVE_CURRENT), $object = True, $nolinks = False)
{ {
global $phpgw, $phpgw_info; global $phpgw, $phpgw_info;
$sep = SEP; $sep = SEP;
@ -306,6 +315,26 @@ class vfs
} }
} }
/* We check for linked dirs made with make_link (). This could be better, but it works */
if (!$nolinks)
{
reset ($this->linked_dirs);
while (list ($num, $link_info) = each ($this->linked_dirs))
{
if (ereg ("^$link_info[directory]/$link_info[name]", $rarray["fake_full_path"]))
{
$rarray["real_full_path"] = ereg_replace ("^$this->basedir", "", $rarray["real_full_path"]);
$rarray["real_full_path"] = ereg_replace ("^$link_info[directory]" . SEP . "$link_info[name]", $link_info["link_directory"] . SEP . $link_info["link_name"], $rarray["real_full_path"]);
$p = $this->path_parts ($rarray["real_full_path"], array (RELATIVE_NONE|VFS_REAL), True, True);
$rarray["real_leading_dirs"] = $p->real_leading_dirs;
$rarray["real_extra_path"] = $p->real_extra_path;
$rarray["real_name"] = $p->real_name;
}
}
}
/* /*
We have to count it before because new keys will be added, We have to count it before because new keys will be added,
which would create an endless loop which would create an endless loop
@ -547,7 +576,10 @@ class vfs
if (!$group_id) if (!$group_id)
{ {
$group_id = $this->account_id; if (!$group_id = $this->account_id)
{
$group_id = 0;
}
} }
$acl = CreateObject ("phpgwapi.acl", $group_id); $acl = CreateObject ("phpgwapi.acl", $group_id);
@ -1096,6 +1128,17 @@ class vfs
$this->rm ("$entry[directory]/$entry[name]", array ($p->mask)); $this->rm ("$entry[directory]/$entry[name]", array ($p->mask));
} }
/* If the directory is linked, we delete the placeholder directory */
$query = $phpgw->db->query ("SELECT directory, name, link_directory, link_name FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name'");
$phpgw->db->next_record ();
$link_info = $phpgw->db->Record;
if ($link_info["link_directory"] && $link_info["link_name"])
{
$path = $this->path_parts ($link_info["directory"] . "/" . $link_info["name"], array ($p->mask), True, True);
rmdir ($path->real_full_path);
}
/* Last, we delete the directory itself */ /* Last, we delete the directory itself */
$query = $phpgw->db->query ("DELETE FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__); $query = $phpgw->db->query ("DELETE FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__);
rmdir ($p->real_full_path); rmdir ($p->real_full_path);
@ -1168,6 +1211,52 @@ class vfs
} }
} }
/*!
@function make_link
@abstract Make a link from virtual directory $vdir to real directory $rdir
@discussion Making a link from $vdir to $rdir will cause path_parts () to substitute $rdir for the real
path variables when presented with $rdir
@param $vdir Virtual dir to make link from
@param $rdir Real dir to make link to
@param $relatives Relativity array
@result Boolean True/False
*/
function make_link ($vdir, $rdir, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
{
global $phpgw;
global $phpgw_info;
$account_id = $phpgw_info["user"]["account_id"];
$currentapp = $phpgw_info["flags"]["currentapp"];
$vp = $this->path_parts ($vdir, array ($relatives[0]));
$rp = $this->path_parts ($rdir, array ($relatives[1]));
if (!$this->acl_check ($vp->fake_full_path, array ($vp->mask), PHPGW_ACL_ADD))
{
return False;
}
if ((!$this->file_exists ($rp->real_full_path, array ($rp->mask))) && !mkdir ($rp->real_full_path, 0770))
{
return False;
}
if (!$this->mkdir ($vp->fake_full_path, array ($vp->mask)))
{
return False;
}
$size = $this->get_size ($rp->real_full_path, array ($rp->mask));
$this->set_attributes ($vp->fake_full_path, array ($vp->mask), array ("link_directory" => $rp->real_leading_dirs, "link_name" => $rp->real_name, "size" => $size));
$this->correct_attributes ($vp->fake_full_path, array ($vp->mask));
return True;
}
/*! /*!
@function set_attributes @function set_attributes
@abstract Update database entry for $file with the attributes in $attributes @abstract Update database entry for $file with the attributes in $attributes
@ -1186,6 +1275,8 @@ class vfs
deleteable deleteable
comment comment
app app
link_directory
link_name
*/ */
function set_attributes ($file, $relatives = array (RELATIVE_CURRENT), $attributes = array ()) function set_attributes ($file, $relatives = array (RELATIVE_CURRENT), $attributes = array ())
@ -1214,11 +1305,11 @@ class vfs
depending on if the attribute was supplied in the $attributes array depending on if the attribute was supplied in the $attributes array
*/ */
$query = $phpgw->db->query ("SELECT file_id, owner_id, createdby_id, modifiedby_id, created, modified, size, mime_type, deleteable, comment, app FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__); $query = $phpgw->db->query ("SELECT file_id, owner_id, createdby_id, modifiedby_id, created, modified, size, mime_type, deleteable, comment, app, link_directory, link_name FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__);
$phpgw->db->next_record (); $phpgw->db->next_record ();
$record = $phpgw->db->Record; $record = $phpgw->db->Record;
$attribute_names = array ("owner_id", "createdby_id", "modifiedby_id", "created", "modified", "size", "mime_type", "deleteable", "comment", "app"); $attribute_names = array ("owner_id", "createdby_id", "modifiedby_id", "created", "modified", "size", "mime_type", "deleteable", "comment", "app", "link_directory", "link_name");
while (list ($num, $attribute) = each ($attribute_names)) while (list ($num, $attribute) = each ($attribute_names))
{ {
@ -1234,7 +1325,7 @@ class vfs
$$attribute = $this->db_clean ($$attribute); $$attribute = $this->db_clean ($$attribute);
} }
$query = $phpgw->db->query ("UPDATE phpgw_vfs SET owner_id='$owner_id', createdby_id='$createdby_id', modifiedby_id='$modifiedby_id', created='$created', modified='$modified', size='$size', mime_type='$mime_type', deleteable='$deleteable', comment='$comment', app='$app' WHERE file_id='$record[file_id]'", __LINE__, __FILE__); $query = $phpgw->db->query ("UPDATE phpgw_vfs SET owner_id='$owner_id', createdby_id='$createdby_id', modifiedby_id='$modifiedby_id', created='$created', modified='$modified', size='$size', mime_type='$mime_type', deleteable='$deleteable', comment='$comment', app='$app', link_directory='$link_directory', link_name='$link_name' WHERE file_id='$record[file_id]'", __LINE__, __FILE__);
if ($query) if ($query)
{ {
@ -1360,6 +1451,17 @@ class vfs
return False; return False;
} }
/*
WIP - this should run through all of the subfiles/directories in the directory and tally up
their sizes. Should modify ls () to be able to return a list for files outside the virtual root
*/
if ($p->outside)
{
$size = filesize ($p->real_full_path);
return $size;
}
$ls_array = $this->ls ($p->fake_full_path, array ($p->mask), $checksubdirs, False, !$checksubdirs); $ls_array = $this->ls ($p->fake_full_path, array ($p->mask), $checksubdirs, False, !$checksubdirs);
while (list ($num, $file_array) = each ($ls_array)) while (list ($num, $file_array) = each ($ls_array))