From aff4cc516e10ff81e0f2335c91080cda04292f60 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Mon, 15 Mar 2010 17:09:45 +0000 Subject: [PATCH] added: 'rm' function can remove auth content now git-svn-id: svn://ttmath.org/publicrep/winix/trunk@597 e52654a7-88a9-db11-a3e9-0013d4bc506e --- content/content.h | 16 +++- content/mv.cpp | 4 +- content/rm.cpp | 170 +++++++++++++++++++++++++++++++------------ core/db.cpp | 16 +++- core/dirs.cpp | 31 ++------ core/dirs.h | 2 +- html/fun_upload.html | 2 +- 7 files changed, 162 insertions(+), 79 deletions(-) diff --git a/content/content.h b/content/content.h index 407b553..f910134 100755 --- a/content/content.h +++ b/content/content.h @@ -91,10 +91,20 @@ class Content void FunCKEditor(); - bool FunRmCheckAccess(); - void FunRmDirRecursive(); - void FunRmDir(); + + /* + rm + */ + bool RemoveCheckAccess(); + void RemoveAllDirs(); + void RemoveAllDirs(long dir_id); + void RemoveDir(); + void RemoveAuthPrepareQuery(); + void RemoveAuth(Item & item); + void RemoveFile(); void FunRm(); + Db::ItemQuery rm_auth_iq; + void FunNode(); void FunMkdir(); diff --git a/content/mv.cpp b/content/mv.cpp index 3edddfc..c6085de 100755 --- a/content/mv.cpp +++ b/content/mv.cpp @@ -275,6 +275,8 @@ void Content::MoveAuthContentOfDir(const Item & item) for(size_t i=0 ; i +#include #include "content.h" #include "../core/request.h" #include "../core/error.h" -#include "../core/db.h" #include "../core/data.h" -bool Content::FunRmCheckAccess() +bool Content::RemoveCheckAccess() { if( !request.is_item ) { @@ -38,19 +39,61 @@ return true; -void Content::FunRmDirRecursive() +void Content::RemoveAuthPrepareQuery() { - // this method deletes recursively all directories - data.dirs.DeleteDir(request.dir_table.back()->id); + rm_auth_iq.SetAll(true, false); + + rm_auth_iq.sel_parent_id = true; + rm_auth_iq.sel_type = true; + rm_auth_iq.sel_auth = true; + + rm_auth_iq.WhereType(Item::file); + rm_auth_iq.WhereAuth(Item::auth_none, false); +} + + + +void Content::RemoveAllDirs(long dir_id) +{ + DirContainer::ParentIterator pnext, p = data.dirs.FindFirstParent(dir_id); + for( ; p != data.dirs.ParentEnd() ; p = pnext ) + { + // this iterator p will be deleted by the next DeleteDir(p->second->id) + // (the next iterator we must calculate beforehand) + pnext = data.dirs.NextParent(p); + RemoveAllDirs(p->second->id); + } + + rm_auth_iq.WhereParentId(dir_id); + db.GetItems(request.item_table, rm_auth_iq); + + for(size_t i=0 ; iid); request.dir_table.erase(--request.dir_table.end()); if( request.dir_table.empty() ) { // we have deleted the root directory - - data.dirs.CheckRootDir(); - + data.dirs.CheckRootDir(); // adding a new root dir Item * proot = data.dirs.GetRootDir(); if( proot ) @@ -61,64 +104,101 @@ void Content::FunRmDirRecursive() // make sure that Content::Make() will check that the dir_table is empty and returns return; } - - - // redirect to the last valid directory - RedirectTo(**(--request.dir_table.end())); + + RedirectToLastDir(); } -void Content::FunRmDir() +void Content::RemoveDir() { if( request.param_table.empty() ) - request.status = WINIX_ERR_PERMISSION_DENIED; + request.status = WINIX_ERR_PERMISSION_DENIED; // use parameter "r" for removing a directory else - if( request.IsParam("confirm") ) - return; - else if( request.IsParam("r") ) - FunRmDirRecursive(); + RemoveAllDirs(); else request.status = WINIX_ERR_UNKNOWN_PARAM; } -void Content::FunRm() +void Content::RemoveAuth(Item & item) { - if( !FunRmCheckAccess() ) - return; - - if( !request.is_item ) - return FunRmDir(); - - if( request.param_table.empty() ) + if( item.auth_path.empty() ) { - if( db.DelItem( request.item ) ) - { - log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend; - TemplatesFunctions::pattern_cacher.DeletePattern(request.item); - - if( data.mounts.pmount->type == Mount::thread ) - db.EditThreadRemoveItem(request.item.parent_id); - else - if( data.mounts.pmount->type == Mount::ticket ) - db.EditTicketRemoveItem(request.item.id); + log << log1 << "Content: can't remove a static file: auth_path is empty" << logend; + return; + } - } - else - { - request.status = WINIX_ERR_NO_ITEM; - } - - RedirectTo(*request.dir_table.back()); + if( remove(item.auth_path.c_str()) == 0 ) + { + log << log1 << "Content: removed static file: " << item.auth_path << logend; + item.auth_path.clear(); + item.auth = Item::auth_none; + // we don't store it to db (will be removed or is removed already) } else { - if( !request.IsParam("confirm") ) - request.status = WINIX_ERR_UNKNOWN_PARAM; + int err = errno; + + log << log1 << "Content: can't remove a file: " << item.auth_path; + log.SystemErr(err); + log << logend; + + request.status = WINIX_ERR_PERMISSION_DENIED; } } +void Content::RemoveFile() +{ + // for safety we check if param_table is empty + // a user can use "confirm" but can make a mistake when typing + if( !request.param_table.empty() ) + { + request.status = WINIX_ERR_UNKNOWN_PARAM; + return; + } + + + if( db.DelItem( request.item ) ) + { + log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend; + TemplatesFunctions::pattern_cacher.DeletePattern(request.item); + + if( data.mounts.pmount->type == Mount::thread ) + db.EditThreadRemoveItem(request.item.parent_id); + else + if( data.mounts.pmount->type == Mount::ticket ) + db.EditTicketRemoveItem(request.item.id); + + if( request.item.auth != Item::auth_none ) + RemoveAuth(request.item); + } + else + { + request.status = WINIX_ERR_NO_ITEM; + } + + RedirectToLastDir(); +} + + + +void Content::FunRm() +{ + if( !RemoveCheckAccess() ) + return; + + if( request.IsParam("confirm") ) + return; // show confirmation dialog + + if( request.is_item ) + RemoveFile(); + else + RemoveDir(); +} + + + diff --git a/core/db.cpp b/core/db.cpp index 884c97d..a77910c 100755 --- a/core/db.cpp +++ b/core/db.cpp @@ -1352,8 +1352,6 @@ Error Db::DelItemCountContents(const Item & item, long & contents) AssertResultStatus(r, PGRES_TUPLES_OK); contents = atol( AssertValue(r, 0, 0) ); - - log << log2 << "counters: " << contents << logend; // !! nie potrzebne w logach } catch(const Error & e) { @@ -1830,8 +1828,13 @@ Error Db::RemoveThread(long dir_id) query << "delete from core.thread where dir_id='" << dir_id << "';"; const char * crows = PQcmdTuples(r); + long rows = 0; + if( crows ) - log << log2 << "Db: deleted " << atol(crows) << " rows from core.thread" << logend; + rows = atol(crows); + + if( rows > 0 ) + log << log2 << "Db: deleted " << rows << " rows from core.thread" << logend; r = AssertQuery(query.str()); AssertResultStatus(r, PGRES_COMMAND_OK); @@ -2081,8 +2084,13 @@ Error Db::RemoveTicket(long dir_id) query << "delete from core.ticket where dir_id='" << dir_id << "';"; const char * crows = PQcmdTuples(r); + long rows = 0; + if( crows ) - log << log2 << "Db: deleted " << atol(crows) << " rows from core.ticket" << logend; + rows = atol(crows); + + if( rows > 0 ) + log << log2 << "Db: deleted " << rows << " rows from core.ticket" << logend; r = AssertQuery(query.str()); AssertResultStatus(r, PGRES_COMMAND_OK); diff --git a/core/dirs.cpp b/core/dirs.cpp index e4564f0..6ab883c 100755 --- a/core/dirs.cpp +++ b/core/dirs.cpp @@ -387,31 +387,14 @@ void Dirs::SplitPath(const std::string & path, std::string & dir, std::string & - - - - - -// !! przeniesc to do rm -// mamy juz interfejs do chodzenia po parentach -void Dirs::DeleteDir(long id) +bool Dirs::DelDir(long dir_id) { - DirContainer::ParentIterator pnext, p = dir_table.FindFirstParent(id); - - for( ; p != dir_table.ParentEnd() ; p = pnext ) - { - // this iterator p will be deleted by the next DeleteDir(p->second->id) - // (the next iterator we must calculate beforehand) - pnext = dir_table.NextParent(p); - - DeleteDir(p->second->id); - } - - if( db.DelDirById(id) == WINIX_ERR_OK ) - dir_table.DelById(id); - - db.RemoveThread(id); - db.RemoveTicket(id); + return dir_table.DelById(dir_id); } + + + + + diff --git a/core/dirs.h b/core/dirs.h index dd52e75..05e8e2c 100755 --- a/core/dirs.h +++ b/core/dirs.h @@ -36,6 +36,7 @@ public: bool MakePath(long dir_id, std::string & path); bool ChangeParent(long dir_id, long new_parent_id); bool HasParent(long dir_id, long parent_id); + bool DelDir(long dir_id); int AnalyzePath(const std::string & path, long & dir_id, std::string & dir, std::string & file); static void SplitPath(const std::string & path, std::string & dir, std::string & file); @@ -53,7 +54,6 @@ public: Item * GetDir(long id); Item * AddDir(const Item & item); - void DeleteDir(long id); void CheckRootDir(); diff --git a/html/fun_upload.html b/html/fun_upload.html index 1d2defc..fdec8aa 100755 --- a/html/fun_upload.html +++ b/html/fun_upload.html @@ -6,7 +6,7 @@ [include "error.html"] -
+
{upload_form_legend}