Added meta_types, extra_sql (). Lots of abstracting SQL calls, file listings, etc. Getting ready for journaling

This commit is contained in:
zone 2001-07-10 21:35:23 +00:00
parent 9b94656ff3
commit 17badebebb

View File

@ -39,6 +39,9 @@
define (VFS_REAL, 1024); define (VFS_REAL, 1024);
define (RELATIVE_ALL, RELATIVE_PATH); define (RELATIVE_ALL, RELATIVE_PATH);
/* These are used in calls to extra_sql () */
define (VFS_SQL_SELECT, 1);
/*! /*!
@class path_class @class path_class
@abstract helper class for path_parts @abstract helper class for path_parts
@ -77,6 +80,7 @@ class vfs
var $attributes; var $attributes;
var $override_acl; var $override_acl;
var $linked_dirs; var $linked_dirs;
var $meta_types;
/*! /*!
@function vfs @function vfs
@ -97,8 +101,17 @@ class vfs
/* 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", "link_directory", "link_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");
/*
These are stored in the MIME-type field and should normally be ignored.
Adding a type here will ensure it is normally ignored, but you will have to
explicitly add it to acl_check (), and to any other SELECT's in this file
*/
$this->meta_types = array ("journal");
/* We store the linked directories in an array now, so we don't have to make the SQL call again */ /* 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 != ''"); $query = $phpgw->db->query ("SELECT directory, name, link_directory, link_name FROM phpgw_vfs WHERE link_directory != '' AND link_name != ''" . $this->extra_sql (VFS_SQL_SELECT));
$this->linked_dirs = array ();
while ($phpgw->db->next_record ()) while ($phpgw->db->next_record ())
{ {
$this->linked_dirs[] = $phpgw->db->Record; $this->linked_dirs[] = $phpgw->db->Record;
@ -188,6 +201,33 @@ class vfs
return $string; return $string;
} }
/*!
@function extra_sql
@abstract Return extra SQL code that should be appended to certain queries
@param $query_type The type of query to get extra SQL code for, in the form of a VFS_SQL define
@result Extra SQL code
*/
function extra_sql ($query_type = VFS_SQL_SELECT)
{
global $phpgw, $phpgw_info;
$sql = " AND (mime_type != ";
reset ($this->meta_types);
while (list ($num, $type) = each ($this->meta_types))
{
if ($num)
$sql .= ", ";
$sql .= "'$type'";
}
$sql .= "OR mime_type IS NULL)";
return ($sql);
}
/*! /*!
@function path_parts @function path_parts
@abstract take a real or fake pathname and return an array of its component parts @abstract take a real or fake pathname and return an array of its component parts
@ -551,7 +591,7 @@ class vfs
We don't use ls () to get owner_id as we normally would, We don't use ls () to get owner_id as we normally would,
because ls () calls acl_check (), which would create an infinite loop because ls () calls acl_check (), which would create an infinite loop
*/ */
$query = $phpgw->db->query ("SELECT owner_id FROM phpgw_vfs WHERE directory='$p2->fake_leading_dirs_clean' AND name='$p2->fake_name_clean'", __LINE__, __FILE__); $query = $phpgw->db->query ("SELECT owner_id FROM phpgw_vfs WHERE directory='$p2->fake_leading_dirs_clean' AND name='$p2->fake_name_clean'" . $this->extra_sql (VFS_SQL_SELECT), __LINE__, __FILE__);
$phpgw->db->next_record (); $phpgw->db->next_record ();
$group_id = $phpgw->db->Record["owner_id"]; $group_id = $phpgw->db->Record["owner_id"];
@ -876,9 +916,8 @@ class vfs
$size = filesize ($t->real_full_path); $size = filesize ($t->real_full_path);
$query = $phpgw->db->query ("SELECT size, mime_type, deleteable, comment, app FROM phpgw_vfs WHERE directory='$f->fake_leading_dirs_clean' AND name='$f->fake_name_clean'", __LINE__, __FILE__); $ls_array = $this->ls ($f->fake_full_path, array ($f->mask), False, False, True);
$phpgw->db->next_record (); $record = $ls_array[0];
$record = $phpgw->db->Record;
if ($this->file_exists ($to, array ($relatives[1]))) if ($this->file_exists ($to, array ($relatives[1])))
{ {
@ -1129,9 +1168,8 @@ class vfs
} }
/* If the directory is linked, we delete the placeholder directory */ /* 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'"); $ls_array = $this->ls ($p->fake_full_path, array ($p->mask), False, False, True);
$phpgw->db->next_record (); $link_info = $ls_array[0];
$link_info = $phpgw->db->Record;
if ($link_info["link_directory"] && $link_info["link_name"]) if ($link_info["link_directory"] && $link_info["link_name"])
{ {
@ -1190,25 +1228,24 @@ class vfs
if (!mkdir ($p->real_full_path, 0770)) if (!mkdir ($p->real_full_path, 0770))
{ {
echo "$p->real_full_path<br>";
return False; return False;
} }
if (!$this->file_exists ($p->fake_full_path, array ($p->mask)))
{
$query = $phpgw->db->query ("INSERT INTO phpgw_vfs (owner_id, name, directory) VALUES ($this->working_id, '$p->fake_name_clean', '$p->fake_leading_dirs_clean')", __LINE__, __FILE__);
$this->set_attributes ($p->fake_full_path, array ($p->mask), array ("createdby_id" => $account_id, "size" => 1024, "mime_type" => "Directory", "created" => $this->now, "modified" => "NULL", deleteable => "Y", "app" => $currentapp));
$this->correct_attributes ($p->fake_full_path, array ($p->mask));
}
else else
{ {
if (!$this->file_exists ($p->fake_leading_dirs . "/" . $dir, array ($p->mask))) return False;
{
$query = $phpgw->db->query ("INSERT INTO phpgw_vfs (owner_id, name, directory) VALUES ($this->working_id, '$p->fake_name_clean', '$p->fake_leading_dirs_clean')", __LINE__, __FILE__);
$this->set_attributes ($p->fake_full_path, array ($p->mask), array ("createdby_id" => $account_id, "size" => 1024, "mime_type" => "Directory", "created" => $this->now, "modified" => "NULL", deleteable => "Y", "app" => $currentapp));
$this->correct_attributes ($p->fake_full_path, array ($p->mask));
}
else
{
return False;
}
return True;
} }
return True;
} }
/*! /*!
@ -1304,10 +1341,9 @@ class vfs
All this voodoo just decides which attributes to keep, and which to update All this voodoo just decides which attributes to keep, and which to update
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, link_directory, link_name FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__); $ls_array = $this->ls ($p->fake_full_path, array ($p->mask), False, False, True);
$phpgw->db->next_record (); $record = $ls_array[0];
$record = $phpgw->db->Record;
$attribute_names = array ("owner_id", "createdby_id", "modifiedby_id", "created", "modified", "size", "mime_type", "deleteable", "comment", "app", "link_directory", "link_name"); $attribute_names = array ("owner_id", "createdby_id", "modifiedby_id", "created", "modified", "size", "mime_type", "deleteable", "comment", "app", "link_directory", "link_name");
@ -1325,7 +1361,20 @@ 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', link_directory='$link_directory', link_name='$link_name' WHERE file_id='$record[file_id]'", __LINE__, __FILE__); $sql = "UPDATE phpgw_vfs SET ";
reset ($attribute_names);
while (list ($num, $attribute) = each ($attribute_names))
{
if ($num)
$sql .= ", ";
$sql .= "$attribute='" . $$attribute . "'";
}
$sql .= " WHERE file_id='$record[file_id]'";
$query = $phpgw->db->query ($sql, __LINE__, __FILE__);
if ($query) if ($query)
{ {
@ -1391,7 +1440,11 @@ class vfs
return False; return False;
} }
$query = $phpgw->db->query ("SELECT mime_type FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__); /*
We don't use ls () because it calls file_type () to determine if it has been
passed a directory
*/
$query = $phpgw->db->query ("SELECT mime_type FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'" . $this->extra_sql (VFS_SQL_SELECT), __LINE__, __FILE__);
$phpgw->db->next_record (); $phpgw->db->next_record ();
$mime_type = $phpgw->db->Record["mime_type"]; $mime_type = $phpgw->db->Record["mime_type"];
@ -1419,7 +1472,7 @@ class vfs
return $rr; return $rr;
} }
$query = $phpgw->db->query ("SELECT name FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__); $query = $phpgw->db->query ("SELECT name FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'" . $this->extra_sql (VFS_SQL_SELECT), __LINE__, __FILE__);
if ($phpgw->db->next_record ()) if ($phpgw->db->next_record ())
{ {
@ -1480,7 +1533,7 @@ class vfs
if ($checksubdirs) if ($checksubdirs)
{ {
$query = $phpgw->db->query ("SELECT size FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'"); $query = $phpgw->db->query ("SELECT size FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'" . $this->extra_sql (VFS_SQL_SELECT));
$phpgw->db->next_record (); $phpgw->db->next_record ();
$size += $phpgw->db->Record[0]; $size += $phpgw->db->Record[0];
} }
@ -1516,16 +1569,19 @@ class vfs
/*! /*!
@function ls @function ls
@abstract get directory listing or info about a single file @abstract get directory listing or info about a single file
@discussion Note: the entries are not guaranteed to be returned in any logical order @discussion Note: The entries are not guaranteed to be returned in any logical order
Note: The size for directories does not include subfiles/subdirectories.
If you need that, use $this->get_size ()
@param $dir File or Directory @param $dir File or Directory
@param $relatives Relativity array @param $relatives Relativity array
@param $checksubdirs Boolean, recursively list all sub directories as well? @param $checksubdirs Boolean, recursively list all sub directories as well?
@param $mime_type Only return entries matching MIME-type $mime_type. Can be any MIME-type, "Directory" or "\ " for those without MIME types @param $mime_type Only return entries matching MIME-type $mime_type. Can be any MIME-type, "Directory" or "\ " for those without MIME types
@param $nofiles Boolean. True means you want to return just the information about the directory $dir. If $dir is a file, $nofiles is implied. This is the equivalent of 'ls -ld $dir' @param $nofiles Boolean. True means you want to return just the information about the directory $dir. If $dir is a file, $nofiles is implied. This is the equivalent of 'ls -ld $dir'
@param $orderby How to order results
@result array of arrays. Subarrays contain full info for each file/dir. @result array of arrays. Subarrays contain full info for each file/dir.
*/ */
function ls ($dir = False, $relatives = array (RELATIVE_CURRENT), $checksubdirs = True, $mime_type = False, $nofiles = False) function ls ($dir = False, $relatives = array (RELATIVE_CURRENT), $checksubdirs = True, $mime_type = False, $nofiles = False, $orderby = "Directory")
{ {
global $phpgw, $phpgw_info; global $phpgw, $phpgw_info;
@ -1537,30 +1593,62 @@ class vfs
{ {
$p = $this->path_parts ($dir, array ($p->mask)); $p = $this->path_parts ($dir, array ($p->mask));
$query = $phpgw->db->query ("SELECT file_id, owner_id, createdby_id, modifiedby_id, created, modified, size, mime_type, deleteable, comment, app, directory, name FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'", __LINE__, __FILE__); $sql = "SELECT ";
reset ($this->attributes);
while (list ($num, $attribute) = each ($this->attributes))
{
if ($num)
$sql .= ", ";
$sql .= "$attribute";
}
$sql .= " FROM phpgw_vfs WHERE directory='$p->fake_leading_dirs_clean' AND name='$p->fake_name_clean'";
$sql .= $this->extra_sql (VFS_SQL_SELECT);
$query = $phpgw->db->query ($sql, __LINE__, __FILE__);
$phpgw->db->next_record (); $phpgw->db->next_record ();
$record = $phpgw->db->Record; $record = $phpgw->db->Record;
/* We return an array of one array to maintain the standard */ /* We return an array of one array to maintain the standard */
$rarray = array (array ("file_id" => $record["file_id"], "owner_id" => $record["owner_id"], "createdby_id" => $record["createdby_id"], "modifiedby_id" => $record["modifiedby_id"], "created" => $record["created"], "modified" => $record["modified"], "size" => $record["size"], "mime_type" => $record["mime_type"], "deleteable" => $record["deleteable"], "comment" => $record["comment"], "app" => $record["app"], "directory" => $record["directory"], "name" => $record["name"])); $rarray = array ();
reset ($this->attributes);
while (list ($num, $attribute) = each ($this->attributes))
{
$rarray[0][$attribute] = $record[$attribute];
}
return $rarray; return $rarray;
} }
$sql = "SELECT ";
reset ($this->attributes);
while (list ($num, $attribute) = each ($this->attributes))
{
if ($num)
$sql .= ", ";
$sql .= "$attribute";
}
$dir_clean = $this->db_clean ($dir); $dir_clean = $this->db_clean ($dir);
$sql = "SELECT file_id, owner_id, createdby_id, modifiedby_id, created, modified, size, mime_type, deleteable, comment, app, directory, name FROM phpgw_vfs WHERE directory LIKE '$dir_clean%'"; $sql .= " FROM phpgw_vfs WHERE directory LIKE '$dir_clean%'";
$sql .= $this->extra_sql (VFS_SQL_SELECT);
if ($mime_type) if ($mime_type)
{ {
$sql .= " AND mime_type='$mime_type'"; $sql .= " AND mime_type='$mime_type'";
} }
$sql .= " ORDER BY directory"; $sql .= " ORDER BY $orderby";
$query = $phpgw->db->query ($sql, __LINE__, __FILE__); $query = $phpgw->db->query ($sql, __LINE__, __FILE__);
$rarray = array (); $rarray = array ();
while ($phpgw->db->next_record ()) for ($i = 0; $phpgw->db->next_record (); $i++)
{ {
$record = $phpgw->db->Record; $record = $phpgw->db->Record;
@ -1576,7 +1664,11 @@ class vfs
continue; continue;
} }
$rarray[] = array ("file_id" => $record["file_id"], "owner_id" => $record["owner_id"], "createdby_id" => $record["createdby_id"], "modifiedby_id" => $record["modifiedby_id"], "created" => $record["created"], "modified" => $record["modified"], "size" => $record["size"], "mime_type" => $record["mime_type"], "deleteable" => $record["deleteable"], "comment" => $record["comment"], "app" => $record["app"], "directory" => $record["directory"], "name" => $record["name"]); reset ($this->attributes);
while (list ($num, $attribute) = each ($this->attributes))
{
$rarray[$i][$attribute] = $record[$attribute];
}
} }
return $rarray; return $rarray;