changed: DirContainer - uses std::list instead of std::vector as the main container
we do not have to rebuild indexes after deleting some items added: DirContainer::DelById(long id) changed: Dirs::CheckRootDir() addes the root dir if there is no one added: Dirs::DeleteDir(long id) - deletes specified directory (and its contents) (from the cache and the database) added: Db::DelDirById(long id) - deletes a dir from the database and its first children added: standard function rm can delete directories git-svn-id: svn://ttmath.org/publicrep/cmslu/trunk@487 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
@@ -10,21 +10,88 @@
|
||||
#include "content.h"
|
||||
|
||||
|
||||
void Content::FunRmDirRecursive()
|
||||
{
|
||||
data.dirs.MakePath(request.dir_table.back()->id, request.session->dir_old);
|
||||
|
||||
// this method deletes recursively all directories
|
||||
data.dirs.DeleteDir(request.dir_table.back()->id);
|
||||
|
||||
request.dir_table.erase(--request.dir_table.end());
|
||||
|
||||
if( request.dir_table.empty() )
|
||||
{
|
||||
// we have deleted the root directory
|
||||
|
||||
data.dirs.CheckRootDir();
|
||||
|
||||
Item * proot = data.dirs.GetRootDir();
|
||||
|
||||
if( proot )
|
||||
request.dir_table.push_back(proot);
|
||||
else
|
||||
// there is no a root dir
|
||||
// CheckRootDir() didn't add the root dir (probably problem with the database)
|
||||
// make sure that Content::Make() will check that the dir_table is empty and returns
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
request.session->done = Done::deleted_dir;
|
||||
request.session->done_status = Error::ok;
|
||||
request.session->done_timer = 2;
|
||||
|
||||
// redirect to the last valid directory
|
||||
RedirectTo(**(--request.dir_table.end()));
|
||||
}
|
||||
|
||||
|
||||
void Content::FunRmDir()
|
||||
{
|
||||
if( request.dir_table.size() == 1 )
|
||||
{
|
||||
// rm for the root dir
|
||||
// only the superuser can do it
|
||||
if( !request.session->puser || !request.session->puser->super_user )
|
||||
{
|
||||
request.status = Error::permision_denied;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Item * last_but_one_dir = *(--(--request.dir_table.end()));
|
||||
|
||||
if( !request.HasWriteAccess(*last_but_one_dir) )
|
||||
{
|
||||
request.status = Error::permision_denied;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( request.param_table.empty() )
|
||||
request.status = Error::permision_denied;
|
||||
else
|
||||
if( request.IsParam("confirm") )
|
||||
return;
|
||||
else
|
||||
if( request.IsParam("r") )
|
||||
FunRmDirRecursive();
|
||||
else
|
||||
request.status = Error::unknown_param;
|
||||
}
|
||||
|
||||
|
||||
void Content::FunRm()
|
||||
{
|
||||
// !! narazie usuwanie tylko dla plikow
|
||||
|
||||
if( !request.is_item )
|
||||
{
|
||||
request.status = Error::permision_denied;
|
||||
FunRmDir();
|
||||
return;
|
||||
}
|
||||
|
||||
if( !request.HasWriteAccess(*request.dir_table.back()) || !request.HasWriteAccess(request.item) )
|
||||
if( !request.HasWriteAccess(*request.dir_table.back()) )
|
||||
{
|
||||
request.status = Error::permision_denied;
|
||||
return;
|
||||
@@ -49,16 +116,15 @@ void Content::FunRm()
|
||||
}
|
||||
|
||||
request.session->done = Done::deleted_item;
|
||||
request.result = Request::redirect;
|
||||
|
||||
|
||||
RedirectTo(*request.dir_table.back());
|
||||
|
||||
request.session->done_timer = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !request.IsParam("confirm") )
|
||||
request.result = Request::err404;
|
||||
//request.result = Request::err404;
|
||||
request.status = Error::unknown_param;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user