diff --git a/core/dirs.h b/core/dirs.h index 52378d7..acdc967 100755 --- a/core/dirs.h +++ b/core/dirs.h @@ -55,9 +55,9 @@ public: std::vector & out_dir_tab, std::wstring & out_item); static void SplitPath(const std::wstring & path, std::wstring & dir, std::wstring & file); - DirContainer::ParentIterator FindFirstChild(long parent_id); // !! zmienic w koncu nazwe na FindFirstChild + DirContainer::ParentIterator FindFirstChild(long parent_id); DirContainer::ParentIterator NextChild(DirContainer::ParentIterator i); - DirContainer::ParentIterator ParentEnd(); + DirContainer::ParentIterator ParentEnd(); // !! pozostalo do zamiany na child // these methods return null if there is no such a dir diff --git a/core/plugin.cpp b/core/plugin.cpp index 2167b4a..2344a8a 100755 --- a/core/plugin.cpp +++ b/core/plugin.cpp @@ -184,6 +184,7 @@ void Plugin::LoadPlugin(const char * filename) Fun1 fun_init; void * plugin_handle; int old_current_plugin; +PluginInfo info; if( !SetPointers(info) ) return; @@ -244,7 +245,7 @@ bool Plugin::HasPlugin(const std::wstring & name) -void Plugin::Call(int message, Slots::iterator & slot) +void Plugin::Call(int message, Slots::iterator & slot, PluginInfo & info) { if( !SetPointers(info) ) return; @@ -295,6 +296,7 @@ void Plugin::Call(int message, void * p1_, void * p2_, long l1_, long l2_) int ret_false_loc = 0; int ret_true_loc = 0; int old_current_plugin = current_plugin; +PluginInfo info; Slots::iterator i = slots.lower_bound(message); @@ -306,7 +308,7 @@ int old_current_plugin = current_plugin; info.l1 = l1_; info.l2 = l2_; - Call(message, i); + Call(message, i, info); if( info.res ) ++ret_true_loc; diff --git a/core/plugin.h b/core/plugin.h index 20dcf5f..ed687d0 100755 --- a/core/plugin.h +++ b/core/plugin.h @@ -202,12 +202,10 @@ private: typedef std::multimap Slots; Slots slots; - PluginInfo info; - std::string afilename; void * LoadInitFun(const char * filename, Fun1 & fun_init); - void Call(int message, Slots::iterator & slot); + void Call(int message, Slots::iterator & slot, PluginInfo & info); bool SetPointers(PluginInfo & info); }; diff --git a/core/pluginmsg.h b/core/pluginmsg.h index f113b1b..ac06250 100755 --- a/core/pluginmsg.h +++ b/core/pluginmsg.h @@ -56,8 +56,9 @@ // the is not any session available (cur->session is null) #define WINIX_CLOSE 3004 -// item was removed (rm function) +// a file or symlink was removed (rm function) // PluginInfo::l1 is the file (item) id +// !! moze zmienic nazwe i dodac symlink w nazwie? #define WINIX_FILE_REMOVED 3005 // directory was removed (rm function) diff --git a/core/version.h b/core/version.h index 858d1e1..d5dd3a4 100755 --- a/core/version.h +++ b/core/version.h @@ -13,7 +13,7 @@ #define WINIX_VER_MAJOR 0 #define WINIX_VER_MINOR 4 -#define WINIX_VER_REVISION 5 +#define WINIX_VER_REVISION 6 #endif diff --git a/db/db.cpp b/db/db.cpp index 6a96ecb..2db3633 100755 --- a/db/db.cpp +++ b/db/db.cpp @@ -433,9 +433,8 @@ long Db::GetContentId(long item_id) if( Rows(r) == 1 && Cols(r) == 1 ) result = AssertValueLong(r, 0, 0); } - catch(const Error & e) + catch(const Error) { - result = e; } ClearResult(r); @@ -1204,16 +1203,18 @@ return EndTrans(result); -Error Db::DelItemDelItem(const Item & item) +Error Db::DelItemDelItem(long item_id, int type) { - PGresult * r = 0; + PGresult * r = 0; Error result = WINIX_ERR_OK; try { query.Clear(); query << R("delete from core.item where id=") - << item.id + << item_id + << R(" and type=") + << type << R(";"); r = AssertQuery(query); @@ -1234,20 +1235,20 @@ return result; -Error Db::DelItemDelContent(const Item & item) +Error Db::DelItemDelContent(long content_id) { PGresult * r = 0; Error result = WINIX_ERR_OK; try { - result = DecrementContentRef(item.content_id); + result = DecrementContentRef(content_id); if( result == WINIX_ERR_OK ) { query.Clear(); query << R("delete from core.content where ref=0 and id=") - << item.content_id + << content_id << R(";"); r = AssertQuery(query); @@ -1278,17 +1279,17 @@ Error result = WINIX_ERR_NO_ITEM; if( item.type == Item::file ) { BeginTrans(); - result = DelItemDelContent(item); + result = DelItemDelContent(item.content_id); if( result == WINIX_ERR_OK ) - result = DelItemDelItem(item); + result = DelItemDelItem(item.id, 1); result = EndTrans(result); } else if( item.type == Item::symlink ) { - result = DelItemDelItem(item); + result = DelItemDelItem(item.id, 2); } else if( item.type == Item::dir ) @@ -1302,6 +1303,33 @@ return result; +Error Db::DelFileById(long file_id) +{ +Error result = WINIX_ERR_NO_ITEM; + + BeginTrans(); + + long content_id = GetContentId(file_id); + + if( content_id != -1 ) + { + result = DelItemDelContent(content_id); + + if( result == WINIX_ERR_OK ) + result = DelItemDelItem(file_id, 1); + } + + result = EndTrans(result); + +return result; +} + + + +Error Db::DelSymlinkById(long symlink_id) +{ + return DelItemDelItem(symlink_id, 2); +} void Db::GetDirs(DirContainer & dir_tab) diff --git a/db/db.h b/db/db.h index 7d8f607..51cb1bc 100755 --- a/db/db.h +++ b/db/db.h @@ -60,7 +60,10 @@ public: Error EditParentUrlById(Item & item, long id); Error EditFileById(const Item & item, long id); // file_path, file_fs, file_type Error EditHasThumbById(bool has_thumb, long id); + Error DelDirById(long id); + Error DelFileById(long file_id); + Error DelSymlinkById(long symlink_id); Error EditSubjectById(Item & item, long id); @@ -106,8 +109,8 @@ protected: PGresult * GetItemsQuery(const DbItemQuery & iq, bool skip_other_sel = false); - Error DelItemDelItem(const Item & item); - Error DelItemDelContent(const Item & item); + Error DelItemDelItem(long item_id, int type); + Error DelItemDelContent(long content_id); Error IncrementContentRef(long content_id); Error DecrementContentRef(long content_id); diff --git a/db/dbbase.cpp b/db/dbbase.cpp index 546b011..bfd504c 100755 --- a/db/dbbase.cpp +++ b/db/dbbase.cpp @@ -422,7 +422,7 @@ Error DbBase::EndTrans(Error err) } else { - // we returned the old err code + // we return the old err code RollbackTrans(); } diff --git a/functions/rm.cpp b/functions/rm.cpp index e7ca693..961cfb4 100755 --- a/functions/rm.cpp +++ b/functions/rm.cpp @@ -76,20 +76,20 @@ return true; void Rm::Prepare() { + // selecting files and symlinks (without directories) content_dir_iq.SetAll(false, false); content_dir_iq.sel_parent_id = true; content_dir_iq.sel_type = true; content_dir_iq.sel_url = true; content_dir_iq.sel_file = true; + content_dir_iq.WhereType(Item::dir, false); - static_iq.SetAll(false, false); - static_iq.sel_parent_id = true; - static_iq.sel_type = true; - static_iq.sel_url = true; - static_iq.sel_file = true; - - static_iq.WhereType(Item::file); - static_iq.WhereFileType(WINIX_ITEM_FILETYPE_NONE, false); + // selecting files, symlinks and directories + content_dir_iq2.SetAll(false, false); + content_dir_iq2.sel_parent_id = true; + content_dir_iq2.sel_type = true; + content_dir_iq2.sel_url = true; + content_dir_iq2.sel_file = true; } @@ -147,16 +147,31 @@ void Rm::RemoveFileOrSymlink(Item & item) TemplatesFunctions::pattern_cacher.DeletePattern(item); plugin.Call(WINIX_FILE_REMOVED, item.id); - - // !! nie potrzebne - //db->EditThreadRemoveItem(item.parent_id); if( item.file_type != WINIX_ITEM_FILETYPE_NONE ) RemoveStaticFile(item); } - else +} + + + +// for other uses (plugins etc) +void Rm::RemoveItemById(long item_id) +{ + // selecting files, symlinks and directories + rm_by_id_iq.SetAll(false, false); + rm_by_id_iq.sel_parent_id = true; + rm_by_id_iq.sel_type = true; + rm_by_id_iq.sel_url = true; + rm_by_id_iq.sel_file = true; + rm_by_id_iq.WhereId(item_id); + + if( db->GetItem(rm_by_id_item, rm_by_id_iq) == WINIX_ERR_OK ) { - // cur->request->status = WINIX_ERR_NO_ITEM; + if( rm_by_id_item.type == Item::dir ) + RemoveDir(rm_by_id_item); + else + RemoveFileOrSymlink(rm_by_id_item); } } @@ -175,19 +190,15 @@ void Rm::RemoveDirTree(long dir_id) plugin.Call(WINIX_DIR_PREPARE_TO_REMOVE, dir_id); - static_iq.WhereParentId(dir_id); - db->GetItems(static_item_tab, static_iq); + content_dir_iq.WhereParentId(dir_id); + db->GetItems(content_item_tab, content_dir_iq); - for(size_t i=0 ; iDelDirById(dir_id) == WINIX_ERR_OK ) { system->dirs.DelDir(dir_id); - - // !! nie potrzebne - //db->RemoveThread(dir_id); - plugin.Call(WINIX_DIR_REMOVED, dir_id); } } @@ -215,6 +226,21 @@ void Rm::RemoveFile() +void Rm::RemoveDirContent(const Item & dir) +{ + content_dir_iq2.WhereParentId(dir.id); + db->GetItems(content_item_tab2, content_dir_iq2); + + for(size_t i=0 ; irequest->IsParam(L"r") ) @@ -223,16 +249,7 @@ void Rm::RemoveDirContent() return; } - content_dir_iq.WhereParentId(cur->request->dir_tab.back()->id); - db->GetItems(item_tab, content_dir_iq); - - for(size_t i=0 ; irequest->dir_tab.back()); if( cur->request->status == WINIX_ERR_OK ) system->RedirectToLastDir(); @@ -261,8 +278,8 @@ void Rm::RemoveDir() void Rm::Clear() { - static_item_tab.clear(); - item_tab.clear(); + content_item_tab.clear(); + content_item_tab2.clear(); } diff --git a/functions/rm.h b/functions/rm.h index 5b9ea11..b8bf67b 100755 --- a/functions/rm.h +++ b/functions/rm.h @@ -26,25 +26,34 @@ public: bool HasAccess(); void MakePost(); + void RemoveDir(const Item & dir); + void RemoveDirContent(const Item & dir); + void RemoveFileOrSymlink(Item & item); + + // removing either a directory or a symlink or a file + void RemoveItemById(long item_id); + private: - // for static files - DbItemQuery static_iq; - std::vector static_item_tab; + // for deleting content in a directory (files and symlinks) + DbItemQuery content_dir_iq; + std::vector content_item_tab; std::wstring path; - // for directory content - DbItemQuery content_dir_iq; - std::vector item_tab; + // for deleting content in a directory (files, symlinks and directories) + DbItemQuery content_dir_iq2; + std::vector content_item_tab2; // for logging std::wstring old_url; + // for removing an item by id + DbItemQuery rm_by_id_iq; + Item rm_by_id_item; + bool HasAccess(const Item & item); void Prepare(); void Clear(); - void RemoveFileOrSymlink(Item & item); - void RemoveDir(const Item & dir); bool RemoveStaticFile(const std::wstring & path); void RemoveStaticFile(Item & item); void RemoveDirTree(long dir_id); diff --git a/html/fun_thread.html b/html/fun_thread.html index bd35d51..64ff499 100755 --- a/html/fun_thread.html +++ b/html/fun_thread.html @@ -9,22 +9,32 @@ [end] -
- [if item_can_write]\[{edit}\][end] - [if mount_thread_arg_is "subject"][item_subject][end] - [if mount_thread_arg_is "info"][include "item_info.html"][end] - [item_print_content] -
+[if-no thread_mount_arg_is "sort_desc"] +
+ [if item_can_write]\[{edit}\][end] + [if thread_mount_arg_is "subject"][item_subject][end] + [if thread_mount_arg_is "info"][include "item_info.html"][end] + [item_print_content] +
+[end] [for thread_sort_tab]
[if thread_sort_tab_can_write]\[{edit}\][end] - [if mount_thread_arg_is "subject"][thread_sort_tab_subject][end] - [if mount_thread_arg_is "info"][include "thread_sort_tab_info.html"][end] + [if thread_mount_arg_is "subject"][thread_sort_tab_subject][end] + [if thread_mount_arg_is "info"][include "thread_sort_tab_info.html"][end] [thread_sort_tab_print_content]
[end] +[if thread_mount_arg_is "sort_desc"] +
+ [if item_can_write]\[{edit}\][end] + [if thread_mount_arg_is "subject"][item_subject][end] + [if thread_mount_arg_is "info"][include "item_info.html"][end] + [item_print_content] +
+[end] diff --git a/html/fun_ticket.html b/html/fun_ticket.html index 4983cc1..88f8472 100755 --- a/html/fun_ticket.html +++ b/html/fun_ticket.html @@ -36,21 +36,23 @@ -[if thread_can_reply] - +[if winix_has_plugin "thread"] + + [if thread_can_reply] + + [end] + + + [for thread_sort_tab] +
+ [if thread_sort_tab_can_write]\[{edit}\][end] + [if thread_mount_arg_is "subject"][thread_sort_tab_subject][end] + [if thread_mount_arg_is "info"][include "thread_sort_tab_info.html"][end] + [thread_sort_tab_print_content] +
+ [end] + [end] - -[for thread_sort_tab] -
- [if thread_sort_tab_can_write]\[{edit}\][end] - [if mount_thread_arg_is "subject"][thread_sort_tab_subject][end] - [if mount_thread_arg_is "info"][include "thread_sort_tab_info.html"][end] - [thread_sort_tab_print_content] -
-[end] - - - diff --git a/html/thread_sort_tab_info.html b/html/thread_sort_tab_info.html index 91a96ad..1e5f66a 100755 --- a/html/thread_sort_tab_info.html +++ b/html/thread_sort_tab_info.html @@ -1,4 +1,4 @@ -

+

{added_by}: [thread_sort_tab_user], [thread_sort_tab_date_creation_nice][if-no thread_sort_tab_dates_equal], {last_modified}[if thread_sort_tab_users_different] {by}: [thread_sort_tab_modification_user],[else]:[end] diff --git a/main/main.cpp b/main/main.cpp index a523e13..b4048e6 100755 --- a/main/main.cpp +++ b/main/main.cpp @@ -39,6 +39,7 @@ void print_syntax() + int main(int argv, char ** argc) { std::srand(std::time(0)); diff --git a/plugins/stats/init.cpp b/plugins/stats/init.cpp index f362645..2c4087a 100755 --- a/plugins/stats/init.cpp +++ b/plugins/stats/init.cpp @@ -178,20 +178,6 @@ void RemoveFile(PluginInfo & info) void RemoveDir(PluginInfo & info) { -DbItemQuery query; -std::vector items; -size_t i; - - // !! may only files can be retrieved here? - query.SetAll(false, false); - query.WhereParentId(info.l1); - info.db->GetItems(items, query); - - // removing childs - for(i=0 ; irequest->status == WINIX_ERR_OK ) { thread.Clear(); - thread.file_id = cur->request->item.id; + thread.file_id = cur->request->item.id; cur->request->status = tdb->AddThread(thread); } diff --git a/plugins/thread/funthread.cpp b/plugins/thread/funthread.cpp index afdcca5..86bf58a 100755 --- a/plugins/thread/funthread.cpp +++ b/plugins/thread/funthread.cpp @@ -51,9 +51,6 @@ return true; void FunThread::PrepareThread(long file_id) { thread_info->Clear(); - - //cur->request->status = tdb->GetThreadByFileId(file_id, thread); - cur->request->status = tdb->GetAnswers(file_id, id_tab); if( !id_tab.empty() ) @@ -68,6 +65,7 @@ void FunThread::PrepareThread(long file_id) iq.WhereFileType(WINIX_ITEM_FILETYPE_NONE); db->GetItems(thread_info->item_tab, iq); + system->CheckAccessToItems(thread_info->item_tab); thread_info->item_sort_tab.resize(thread_info->item_tab.size()); @@ -75,8 +73,6 @@ void FunThread::PrepareThread(long file_id) for(size_t i=0 ; iitem_tab.size() ; ++i) thread_info->item_sort_tab[i] = &thread_info->item_tab[i]; } - - system->CheckAccessToItems(thread_info->item_tab); } diff --git a/plugins/thread/init.cpp b/plugins/thread/init.cpp index 2907c30..a2f0195 100755 --- a/plugins/thread/init.cpp +++ b/plugins/thread/init.cpp @@ -74,7 +74,7 @@ void AddMounts(PluginInfo & info) void RemoveThread(PluginInfo & i) { - + thread_info.RemoveThread(i.l1); } @@ -97,6 +97,9 @@ void SetSortTab(PluginInfo & info) typedef std::vector SortTab; SortTab * psort_tab = reinterpret_cast(info.p1); + // !! dodac jakies czyszczenie tej tablicy wskaznikow na koncu przetwarzania requestu + // aby kiedys przypadkowo nie odwolac sie do nie istniejacego obiektu + // poprzez bezposrednie uzycie jakiejs funkcji z ezc thread_info.item_sort_tab = *psort_tab; } @@ -130,23 +133,25 @@ void Init(PluginInfo & info) { using namespace Thread; - plugin.Assign(WINIX_CREATE_FUNCTIONS, AddFunctions); - plugin.Assign(WINIX_SELECT_DEFAULT_FUNCTION, SelectDefaultFunction); - plugin.Assign(WINIX_ADD_MOUNTS, AddMounts); - plugin.Assign(WINIX_FILE_REMOVED, RemoveThread); - plugin.Assign(WINIX_NOTIFY_ADD_TEMPLATE, AddNotifyTemplate); - plugin.Assign(WINIX_TEMPLATES_CREATEFUNCTIONS, AddEzcFunctions); + plugin.Assign(WINIX_CREATE_FUNCTIONS, AddFunctions); + plugin.Assign(WINIX_SELECT_DEFAULT_FUNCTION, SelectDefaultFunction); + plugin.Assign(WINIX_ADD_MOUNTS, AddMounts); + plugin.Assign(WINIX_FILE_REMOVED, RemoveThread); + plugin.Assign(WINIX_NOTIFY_ADD_TEMPLATE, AddNotifyTemplate); + plugin.Assign(WINIX_TEMPLATES_CREATEFUNCTIONS, AddEzcFunctions); // for other plugins - plugin.Assign(WINIX_PL_THREAD_SET_SORTTAB, SetSortTab); - plugin.Assign(WINIX_PL_THREAD_READ_THREADS, ReadThreads); + plugin.Assign(WINIX_PL_THREAD_SET_SORTTAB, SetSortTab); + plugin.Assign(WINIX_PL_THREAD_READ_THREADS, ReadThreads); plugin.Assign(WINIX_PL_THREAD_SET_SORTTAB_INDEX, SetSortTabIndex); - plugin.Assign(WINIX_PL_THREAD_PREPARE_THREAD, PrepareThread); + plugin.Assign(WINIX_PL_THREAD_PREPARE_THREAD, PrepareThread); tdb.SetConn(info.db->GetConn()); tdb.LogQueries(info.config->log_db_query); // thread_info and fun_show_threads are used in 'ticket' plugins too + thread_info.SetDb(info.db); + thread_info.SetTDb(&tdb); thread_info.SetSystem(info.system); thread_info.plugin_id = info.plugin_id; diff --git a/plugins/thread/pluginmsg.h b/plugins/thread/pluginmsg.h index 37dcb60..b0345e2 100755 --- a/plugins/thread/pluginmsg.h +++ b/plugins/thread/pluginmsg.h @@ -12,11 +12,13 @@ -#define WINIX_PL_THREAD_SET_SORTTAB 4000 -#define WINIX_PL_THREAD_READ_THREADS 4001 -#define WINIX_PL_THREAD_SET_SORTTAB_INDEX 4002 -#define WINIX_PL_THREAD_CAN_USE_REPLY 4003 -#define WINIX_PL_THREAD_PREPARE_THREAD 4004 +#define WINIX_PL_THREAD_SET_SORTTAB 4000 +#define WINIX_PL_THREAD_READ_THREADS 4001 +#define WINIX_PL_THREAD_SET_SORTTAB_INDEX 4002 +#define WINIX_PL_THREAD_PREPARE_THREAD 4003 + + + #endif diff --git a/plugins/thread/reply.cpp b/plugins/thread/reply.cpp index a66ff26..b8db9fd 100755 --- a/plugins/thread/reply.cpp +++ b/plugins/thread/reply.cpp @@ -21,6 +21,7 @@ namespace Thread Reply::Reply() { fun.url = L"reply"; + files_dir = 0; } @@ -37,22 +38,18 @@ void Reply::SetThreadInfo(ThreadInfo * pthread_info) } +/* + we can use 'reply' function everywhere where 'thread_dir' mount option is defined + if there is no such a thread in 'thread' table it will be added automatically +*/ bool Reply::HasAccess() { if( !cur->request->is_item ) return false; - Item * dir = thread_info->FindThreadDir(); + files_dir = thread_info->FindThreadDir(); - if( !dir || !system->HasWriteAccess(*dir) ) - return false; - - plugin.Call(WINIX_PL_THREAD_CAN_USE_REPLY); - - if( plugin.True() > 0 ) - return true; - - if( system->mounts.pmount->type != thread_info->mount_type_thread ) + if( !files_dir || !system->HasWriteAccess(*files_dir) ) return false; return true; @@ -62,13 +59,8 @@ return true; void Reply::MakePost() { - Item * dir = thread_info->FindThreadDir(); - - if( !dir ) - { - cur->request->status = WINIX_ERR_PERMISSION_DENIED; - return; - } + // !! jak bedzie dostepne assert + // ASSERT(files_dir) if( tdb->GetThreadByFileId(cur->request->item.id, thread) != WINIX_ERR_OK ) { @@ -85,7 +77,7 @@ void Reply::MakePost() functions->ReadItem(answer, Item::file); functions->SetUser(answer); functions->PrepareUrl(answer); - answer.parent_id = dir->id; + answer.parent_id = files_dir->id; answer.privileges = 0644; // !! tymczasowo if( functions->CheckAbuse() ) diff --git a/plugins/thread/reply.h b/plugins/thread/reply.h index 2615b32..4454832 100755 --- a/plugins/thread/reply.h +++ b/plugins/thread/reply.h @@ -38,6 +38,7 @@ private: ThreadInfo * thread_info; Item answer; Thread thread; + Item * files_dir; }; diff --git a/plugins/thread/showthreads.cpp b/plugins/thread/showthreads.cpp index 41ba1a2..51a64bc 100755 --- a/plugins/thread/showthreads.cpp +++ b/plugins/thread/showthreads.cpp @@ -96,17 +96,6 @@ void ShowThreads::ReadFiles() } -void ShowThreads::ReadThreads() -{ - // reading threads for the files - file_id_tab.resize(thread_info->item_sort_tab.size()); - - for(size_t i=0 ; iitem_sort_tab.size() ; ++i) - file_id_tab[i] = thread_info->item_sort_tab[i]->id; - - tdb->GetThreads(file_id_tab, thread_info->thread_tab); -} - void ShowThreads::CreatePointers() { @@ -118,7 +107,6 @@ void ShowThreads::CreatePointers() } - void ShowThreads::SortPointers() { int sort_type = 1; @@ -132,6 +120,19 @@ void ShowThreads::SortPointers() +void ShowThreads::ReadThreads() +{ + // reading threads for the files + file_id_tab.resize(thread_info->item_sort_tab.size()); + + for(size_t i=0 ; iitem_sort_tab.size() ; ++i) + file_id_tab[i] = thread_info->item_sort_tab[i]->id; + + tdb->GetThreads(file_id_tab, thread_info->thread_tab); +} + + + void ShowThreads::MakeGet() { thread_info->Clear(); diff --git a/plugins/thread/tdb.cpp b/plugins/thread/tdb.cpp index 2896b10..8d61d82 100755 --- a/plugins/thread/tdb.cpp +++ b/plugins/thread/tdb.cpp @@ -175,12 +175,12 @@ return status; -Error TDb::EditThreadAddItem(long file_id, long item_id) +Error TDb::EditThreadAddItem(long file_id, long answer_id) { query.Clear(); query << R("insert into plugins.thread_files (file_id, answer_id) values (") << file_id - << item_id + << answer_id << R(");"); Error status = DoCommand(query); @@ -190,7 +190,7 @@ Error TDb::EditThreadAddItem(long file_id, long item_id) query.Clear(); query << R("update plugins.thread set (last_item, replies) = (") - << item_id + << answer_id << R(", replies+1) where file_id=") << file_id << R(";"); diff --git a/plugins/thread/tdb.h b/plugins/thread/tdb.h index 5036620..f078023 100755 --- a/plugins/thread/tdb.h +++ b/plugins/thread/tdb.h @@ -17,6 +17,7 @@ #include "core/error.h" + namespace Thread { @@ -29,7 +30,7 @@ public: Error GetThreadByFileId(long file_id, Thread & thread); Error GetThreads(const std::vector & file_id_tab, std::vector & thread_tab); Error GetAnswers(long file_id, std::vector & answer_id_tab); - Error EditThreadAddItem(long file_id, long item_id); + Error EditThreadAddItem(long file_id, long answer_id); Error EditThreadRemoveItem(long file_id); Error RemoveThread(long file_id); long FindLastItem(long file_id); diff --git a/plugins/thread/templates.cpp b/plugins/thread/templates.cpp index 49dd8df..284a73d 100755 --- a/plugins/thread/templates.cpp +++ b/plugins/thread/templates.cpp @@ -472,6 +472,14 @@ void thread_can_create(Info & i) +void thread_mount_arg_is(Info & i) +{ + if( system->mounts.pmount ) + i.res = system->mounts.pmount->IsArg(thread_info.mount_par_thread, i.par); +} + + + void AddEzcFunctions(PluginInfo & info) @@ -518,6 +526,7 @@ void AddEzcFunctions(PluginInfo & info) fun->Insert("thread_can_reply", thread_can_reply); fun->Insert("thread_can_create", thread_can_create); + fun->Insert("thread_mount_arg_is", thread_mount_arg_is); } diff --git a/plugins/thread/threadinfo.cpp b/plugins/thread/threadinfo.cpp index 0be575b..69b6398 100755 --- a/plugins/thread/threadinfo.cpp +++ b/plugins/thread/threadinfo.cpp @@ -14,6 +14,17 @@ namespace Thread { +void ThreadInfo::SetDb(Db * pdb) +{ + db = pdb; +} + + +void ThreadInfo::SetTDb(TDb * ptdb) +{ + tdb = ptdb; +} + void ThreadInfo::SetSystem(System * psystem) { @@ -47,6 +58,18 @@ return out_dir_tab.back(); +void ThreadInfo::RemoveThread(long file_id) +{ + if( tdb->GetAnswers(file_id, remove_answer_id_tab) == WINIX_ERR_OK ) + { + for(size_t i=0 ; iDelFileById(remove_answer_id_tab[i]); + } + + tdb->RemoveThread(file_id); +} + + } // namespace diff --git a/plugins/thread/threadinfo.h b/plugins/thread/threadinfo.h index cbb16de..426b754 100755 --- a/plugins/thread/threadinfo.h +++ b/plugins/thread/threadinfo.h @@ -11,10 +11,11 @@ #define headerfile_winix_plugins_thread_threadinfo #include -#include "thread.h" #include "core/item.h" #include "core/system.h" - +#include "db/db.h" +#include "thread.h" +#include "tdb.h" @@ -26,10 +27,14 @@ class ThreadInfo public: + void SetDb(Db * pdb); + void SetTDb(TDb * ptdb); void SetSystem(System * psystem); + void Clear(); Item * FindThreadDir(); + // id of a mount type int mount_type_thread; @@ -57,11 +62,18 @@ public: // template index for notifications size_t template_index; + + void RemoveThread(long file_id); + + private: + Db * db; + TDb * tdb; System * system; std::vector out_dir_tab; + std::vector remove_answer_id_tab; Item out_item; diff --git a/plugins/ticket/Makefile.dep b/plugins/ticket/Makefile.dep index fa29b54..4400632 100755 --- a/plugins/ticket/Makefile.dep +++ b/plugins/ticket/Makefile.dep @@ -51,6 +51,7 @@ createticket.o: ../../functions/tinymce.h ../../functions/uname.h createticket.o: ../../functions/upload.h ../../functions/uptime.h createticket.o: ../../functions/who.h ../../functions/vim.h createticket.o: ../../core/htmlfilter.h sessiondata.h ../../core/plugindata.h +createticket.o: ../../functions/rm.h editticket.o: editticket.h tdb.h ticket.h ../../db/dbbase.h ../../db/dbconn.h editticket.o: ../../db/dbtextstream.h ../../core/textstream.h editticket.o: ../../core/misc.h ../../core/item.h ../../core/error.h @@ -99,7 +100,7 @@ editticket.o: ../../functions/uname.h ../../functions/upload.h editticket.o: ../../functions/uptime.h ../../functions/who.h editticket.o: ../../functions/vim.h ../../core/htmlfilter.h editticket.o: ../../functions/functionbase.h ../../core/synchro.h -editticket.o: sessiondata.h ../../core/plugindata.h +editticket.o: sessiondata.h ../../core/plugindata.h ../../functions/rm.h funticket.o: funticket.h tdb.h ticket.h ../../db/dbbase.h ../../db/dbconn.h funticket.o: ../../db/dbtextstream.h ../../core/textstream.h funticket.o: ../../core/misc.h ../../core/item.h ../../core/error.h @@ -206,9 +207,11 @@ init.o: ../../templates/templates.h ../../templates/patterncacher.h init.o: ../../templates/ckeditorgetparser.h ../../core/httpsimpleparser.h init.o: ../../core/log.h ../../templates/indexpatterns.h init.o: ../../core/sessionmanager.h sessiondata.h ../../core/plugindata.h -init.o: ../../plugins/thread/showthreads.h ../../plugins/thread/threadinfo.h -init.o: ../../plugins/thread/thread.h ../../plugins/thread/pluginmsg.h +init.o: ../../functions/rm.h ../../plugins/thread/showthreads.h +init.o: ../../plugins/thread/threadinfo.h ../../plugins/thread/thread.h +init.o: ../../plugins/thread/pluginmsg.h sessiondata.o: sessiondata.h ../../core/plugindata.h ticket.h +sessiondata.o: ../../functions/rm.h showtickets.o: showtickets.h tdb.h ticket.h ../../db/dbbase.h showtickets.o: ../../db/dbconn.h ../../db/dbtextstream.h showtickets.o: ../../core/textstream.h ../../core/misc.h ../../core/item.h @@ -324,7 +327,7 @@ templates.o: ../../templates/templates.h ../../templates/patterncacher.h templates.o: ../../templates/ckeditorgetparser.h templates.o: ../../core/httpsimpleparser.h ../../core/log.h templates.o: ../../templates/indexpatterns.h ../../core/sessionmanager.h -templates.o: sessiondata.h ../../core/plugindata.h +templates.o: sessiondata.h ../../core/plugindata.h ../../functions/rm.h templates.o: ../../plugins/thread/pluginmsg.h ticketconf.o: ticketconf.h ticketinfo.o: ticketinfo.h ticket.h ticketparser.h ticketconf.h @@ -375,6 +378,6 @@ ticketinfo.o: ../../functions/uptime.h ../../functions/who.h ticketinfo.o: ../../functions/vim.h ../../core/htmlfilter.h tdb.h ticketinfo.o: ../../db/dbbase.h ../../db/dbconn.h ../../db/dbtextstream.h ticketinfo.o: ../../core/error.h ../../core/log.h ../../core/misc.h -ticketinfo.o: sessiondata.h ../../core/plugindata.h +ticketinfo.o: sessiondata.h ../../core/plugindata.h ../../functions/rm.h ticketparser.o: ticketparser.h ticketconf.h ../../core/log.h ticketparser.o: ../../core/misc.h diff --git a/plugins/ticket/createticket.cpp b/plugins/ticket/createticket.cpp index 257704b..a4f0c72 100755 --- a/plugins/ticket/createticket.cpp +++ b/plugins/ticket/createticket.cpp @@ -53,7 +53,7 @@ return true; void CreateTicket::AddTicket(Ticket & ticket, Item & item) { - ticket.file_id = item.id; + ticket.file_id = item.id; cur->request->status = tdb->AddTicket(ticket); if( cur->request->status == WINIX_ERR_OK ) @@ -91,7 +91,7 @@ void CreateTicket::Submit(Ticket & ticket, Item & item) if( cur->request->status == WINIX_ERR_OK ) { log << log2 << "CreateTicket: added a new ticket" << logend; - RemoveTicket(); + RemoveTmpTicket(); system->RedirectTo(item); } else @@ -103,13 +103,14 @@ void CreateTicket::Submit(Ticket & ticket, Item & item) -void CreateTicket::RemoveTicket() +void CreateTicket::RemoveTmpTicket() { SessionData * session_data = reinterpret_cast( cur->session->plugin_data.Get(ticket_info->plugin_id) ); long dir_id = cur->request->dir_tab.back()->id; session_data->create_ticket_map.erase(dir_id); + session_data->create_file_map.erase(dir_id); } @@ -126,6 +127,17 @@ return ticket; } +std::vector & CreateTicket::PrepareFileMap() +{ + SessionData * session_data = reinterpret_cast( + cur->session->plugin_data.Get(ticket_info->plugin_id) ); + + long dir_id = cur->request->dir_tab.back()->id; + std::vector & file_map = session_data->GetFileTab(dir_id, session_data->create_file_map); + +return file_map; +} + void CreateTicket::MakePost() { @@ -135,8 +147,9 @@ void CreateTicket::MakePost() Ticket & ticket = PrepareTicket(); Item & item = cur->request->item; ticket_info->ticket = &ticket; + std::vector & file_map = PrepareFileMap(); - ticket_info->ReadTicketParams(ticket, false); + ticket_info->ReadTicketParams(ticket, false, &file_map); functions->ReadItem(item, Item::file); if( !cur->request->IsPostVar(L"fileuploadsubmit") ) diff --git a/plugins/ticket/createticket.h b/plugins/ticket/createticket.h index 07fd084..aa8d1ae 100755 --- a/plugins/ticket/createticket.h +++ b/plugins/ticket/createticket.h @@ -36,8 +36,9 @@ private: void AddTicket(Ticket & ticket, Item & item); void Submit(Ticket & ticket, Item & item); - void RemoveTicket(); + void RemoveTmpTicket(); Ticket & PrepareTicket(); + std::vector & PrepareFileMap(); TDb * tdb; TicketInfo * ticket_info; diff --git a/plugins/ticket/editticket.cpp b/plugins/ticket/editticket.cpp index 4394f04..e440e34 100755 --- a/plugins/ticket/editticket.cpp +++ b/plugins/ticket/editticket.cpp @@ -91,7 +91,7 @@ void EditTicket::Submit(Ticket & ticket, Item & item) if( cur->request->status == WINIX_ERR_OK ) { log << log2 << "EditTicket: ticket modified" << logend; - RemoveTicket(); + RemoveTmpTicket(); system->RedirectTo(item); } else @@ -104,13 +104,13 @@ void EditTicket::Submit(Ticket & ticket, Item & item) -void EditTicket::RemoveTicket() +void EditTicket::RemoveTmpTicket() { SessionData * session_data = reinterpret_cast( cur->session->plugin_data.Get(ticket_info->plugin_id) ); long file_id = cur->request->item.id; - session_data->create_ticket_map.erase(file_id); + session_data->edit_ticket_map.erase(file_id); session_data->new_file_map.erase(file_id); } diff --git a/plugins/ticket/editticket.h b/plugins/ticket/editticket.h index 567a56a..1bf01b9 100755 --- a/plugins/ticket/editticket.h +++ b/plugins/ticket/editticket.h @@ -34,7 +34,7 @@ public: private: - void RemoveTicket(); + void RemoveTmpTicket(); Ticket & PrepareTicket(); std::vector & PrepareFileMap(); std::wstring old_url; diff --git a/plugins/ticket/init.cpp b/plugins/ticket/init.cpp index bb1c3db..6ec99a3 100755 --- a/plugins/ticket/init.cpp +++ b/plugins/ticket/init.cpp @@ -88,7 +88,7 @@ void ProcessRequest(PluginInfo & info) void RemoveTicket(PluginInfo & i) { - tdb.RemoveTicket(i.l1); + ticket_info.RemoveTicket(i.l1); } @@ -107,6 +107,8 @@ void AddNotifyTemplate(PluginInfo & info) void CreateSession(PluginInfo & info) { SessionData * p = new SessionData(); + + p->fun_rm = &info.functions->fun_rm; info.cur->session->plugin_data.Assign(p); log << log4 << "Ticket: created ticket plugin data: " << (void*)p << logend; } @@ -115,14 +117,7 @@ void CreateSession(PluginInfo & info) void RemoveSession(PluginInfo & info) { delete info.plugin_data_base; - log << log4 << "Ticket: removed ticket plugin date: " << (void*)info.plugin_data_base << logend; -} - - -void CanUseReply(PluginInfo & info) -{ - if( info.system->mounts.pmount && info.system->mounts.pmount->type == ticket_info.mount_type_ticket ) - info.res = true; + log << log4 << "Ticket: removed ticket plugin data: " << (void*)info.plugin_data_base << logend; } @@ -149,7 +144,6 @@ using namespace Ticket; plugin.Assign(WINIX_NOTIFY_ADD_TEMPLATE, AddNotifyTemplate); plugin.Assign(WINIX_SESSION_CREATED, CreateSession); plugin.Assign(WINIX_SESSION_REMOVE, RemoveSession); - plugin.Assign(WINIX_PL_THREAD_CAN_USE_REPLY, CanUseReply); tdb.SetConn(info.db->GetConn()); tdb.LogQueries(info.config->log_db_query); diff --git a/plugins/ticket/sessiondata.cpp b/plugins/ticket/sessiondata.cpp index dc1d93d..54f8ad3 100755 --- a/plugins/ticket/sessiondata.cpp +++ b/plugins/ticket/sessiondata.cpp @@ -13,6 +13,39 @@ namespace Ticket { +SessionData::SessionData() +{ + fun_rm = 0; +} + + +SessionData::~SessionData() +{ + RemoveFileMap(create_file_map); + RemoveFileMap(new_file_map); +} + + + +void SessionData::RemoveFileMap(SessionData::FileMap & file_map) +{ +FileMap::iterator i; + + if( fun_rm ) + { + for(i=file_map.begin() ; i!=file_map.end() ; ++i) + { + for(size_t a=0 ; asecond.size() ; ++a) + { + long file_id = i->second[a]; + fun_rm->RemoveItemById(file_id); + } + } + + file_map.clear(); + } +} + Ticket & SessionData::GetTicket(long id, SessionData::TicketMap & ticket_map, bool * is_new) diff --git a/plugins/ticket/sessiondata.h b/plugins/ticket/sessiondata.h index 7341e36..86732db 100755 --- a/plugins/ticket/sessiondata.h +++ b/plugins/ticket/sessiondata.h @@ -15,6 +15,7 @@ #include #include "core/plugindata.h" #include "ticket.h" +#include "functions/rm.h" namespace Ticket @@ -23,9 +24,14 @@ namespace Ticket struct SessionData : public PluginDataBase { + SessionData(); + ~SessionData(); + + typedef std::map TicketMap; typedef std::map > FileMap; + // temporary tickets for 'createticket' function // TicketMap create_ticket_map; @@ -34,8 +40,14 @@ struct SessionData : public PluginDataBase // TicketMap edit_ticket_map; + + // temporary files for 'createticket' function + // these files should be deleted if a user will not click on the submit button + FileMap create_file_map; + // temporary files for 'editticket' function // these files should be deleted if a user will not click on the submit button + // !! zmienic nazwe na edit_file_map albo podobnie FileMap new_file_map; @@ -44,6 +56,10 @@ struct SessionData : public PluginDataBase std::vector & GetFileTab(long id, FileMap & file_map); + // for deleting new_file_map files + Fun::Rm * fun_rm; + + void RemoveFileMap(FileMap & file_map); }; diff --git a/plugins/ticket/showtickets.cpp b/plugins/ticket/showtickets.cpp index 2c98b4e..6601f71 100755 --- a/plugins/ticket/showtickets.cpp +++ b/plugins/ticket/showtickets.cpp @@ -62,7 +62,7 @@ bool ShowTickets::Sort::operator()(const Item * item1, const Item * item2) time_t time1 = Time(tm1); time_t time2 = Time(tm2); - return time1 < time2; + return time1 > time2; } } @@ -91,17 +91,6 @@ void ShowTickets::ReadFiles() } -void ShowTickets::ReadTickets() -{ - // reading tickets for the files - file_id_tab.resize(ticket_info->item_sort_tab.size()); - - for(size_t i=0 ; iitem_sort_tab.size() ; ++i) - file_id_tab[i] = ticket_info->item_sort_tab[i]->id; - - tdb->GetTickets(file_id_tab, ticket_info->ticket_tab); -} - void ShowTickets::CreatePointers() { @@ -127,6 +116,18 @@ void ShowTickets::SortPointers() +void ShowTickets::ReadTickets() +{ + // reading tickets for the files + file_id_tab.resize(ticket_info->item_sort_tab.size()); + + for(size_t i=0 ; iitem_sort_tab.size() ; ++i) + file_id_tab[i] = ticket_info->item_sort_tab[i]->id; + + tdb->GetTickets(file_id_tab, ticket_info->ticket_tab); +} + + void ShowTickets::MakeGet() { ticket_info->Clear(); diff --git a/plugins/ticket/showtickets.h b/plugins/ticket/showtickets.h index 45b14d2..d717aff 100755 --- a/plugins/ticket/showtickets.h +++ b/plugins/ticket/showtickets.h @@ -38,9 +38,9 @@ private: std::vector file_id_tab; void ReadFiles(); - void ReadTickets(); void CreatePointers(); void SortPointers(); + void ReadTickets(); struct Sort { diff --git a/plugins/ticket/tdb.cpp b/plugins/ticket/tdb.cpp index 69f3284..e3553e5 100755 --- a/plugins/ticket/tdb.cpp +++ b/plugins/ticket/tdb.cpp @@ -71,6 +71,8 @@ Error TDb::GetTicket(long file_id, Ticket & ticket) int cintvalue = AssertColumn(r, "int_value"); int cstrvalue = AssertColumn(r, "str_value"); + // !! mozna dodac uzycie ticket.par_tab.reserve() + for(int i=0 ; i 0 && ticket.par_tab[o2-1].param == conf_item.id ) + --o2; + ticket_par_index = o2; return true; } @@ -81,7 +85,12 @@ bool find_ticket_value(const TicketConf::TicketItem & conf_item, const Ticket & ticket_par_index = (o1 + o2) / 2; if( ticket.par_tab[ticket_par_index].param == conf_item.id ) + { + while( ticket_par_index > 0 && ticket.par_tab[ticket_par_index-1].param == conf_item.id ) + --ticket_par_index; + return true; + } if( ticket.par_tab[ticket_par_index].param < conf_item.id ) o1 = ticket_par_index; diff --git a/plugins/ticket/ticket.h b/plugins/ticket/ticket.h index d518522..b36f8a5 100755 --- a/plugins/ticket/ticket.h +++ b/plugins/ticket/ticket.h @@ -12,6 +12,7 @@ #include #include +#include namespace Ticket @@ -27,7 +28,6 @@ struct Ticket void Clear() { - // !! what about file_id? param = 0; int_value = 0; str_value.clear(); @@ -52,6 +52,19 @@ struct Ticket sort_id = 0; } + struct Sort + { + bool operator()(const TicketParam & par1, const TicketParam & par2) + { + return par1.param < par2.param; + } + }; + + void SortParTab() + { + std::sort(par_tab.begin(), par_tab.end(), Sort()); + } + Ticket() { diff --git a/plugins/ticket/ticketinfo.cpp b/plugins/ticket/ticketinfo.cpp index 58938bf..bf02e17 100755 --- a/plugins/ticket/ticketinfo.cpp +++ b/plugins/ticket/ticketinfo.cpp @@ -302,6 +302,7 @@ bool add = false; if( cur->request->status == WINIX_ERR_OK ) { add = true; + par.int_value = file.id; system->MakePath(file, par.str_value); if( file_map ) @@ -335,6 +336,8 @@ bool exists = false; ticket_param.Clear(); + log << log1 << "szukamy dla param_id: " << param_id << logend; + for(size_t i=0 ; itab.size() ; ++i) { if( param_id == cur_conf->tab[i].id ) @@ -420,10 +423,27 @@ PostFileTab::iterator i2; if( IsSubString(config->ticket_form_prefix, i2->first) ) ReadTicketParam(ticket, Toi(i2->first.c_str() + config->ticket_form_prefix.size()), i2->second, file_map); } + + ticket.SortParTab(); } +void TicketInfo::RemoveTicket(long file_id) +{ + if( tdb->GetTicket(file_id, rm_ticket) == WINIX_ERR_OK ) + { + for(size_t i=0 ; ifun_rm.RemoveItemById(id); + } + + tdb->RemoveTicket(file_id); + } +} + + } // namespace diff --git a/plugins/ticket/ticketinfo.h b/plugins/ticket/ticketinfo.h index 83b4d50..7c681e8 100755 --- a/plugins/ticket/ticketinfo.h +++ b/plugins/ticket/ticketinfo.h @@ -93,6 +93,8 @@ public: void CheckMinMaxValue(const TicketConf::TicketItem & conf_item, Ticket::TicketParam & par); void ReadTicketParams(Ticket & ticket, bool clear_ticket = true, std::vector * file_map = 0); + void RemoveTicket(long file_id); + private: Db * db; @@ -119,6 +121,9 @@ private: const TicketConf cur_conf_empty; const Ticket ticket_empty; + // for removing a ticket + Ticket rm_ticket; + bool GetConfContent(const std::wstring & path); bool ParseTicketConf(long mount_dir_id, const std::wstring & path); void ReadTicketConf(Mounts & mounts, bool skip_existing_configs); diff --git a/templates/mount.cpp b/templates/mount.cpp index ea616b6..9f917b0 100755 --- a/templates/mount.cpp +++ b/templates/mount.cpp @@ -33,12 +33,6 @@ void mount_page_arg_is(Info & i) } -// !! nie potrzebne -void mount_thread_arg_is(Info & i) -{ - //i.res = system->mounts.pmount->IsArg(system->mounts.MountParThread(), i.par); -} - void mount_has_html_template(Info & i) { diff --git a/templates/patterncacher.cpp b/templates/patterncacher.cpp index 23f2de6..7956860 100755 --- a/templates/patterncacher.cpp +++ b/templates/patterncacher.cpp @@ -118,10 +118,7 @@ PatternTab::iterator i; i = pattern_tab.find(item.id); if( i == pattern_tab.end() ) - { - //log << log2 << "PC: there is no such an item to update, id: " << item.id << ", url: " << item.url << logend; return; - } ++(i->second.used); CreatePattern(item, i->second.pattern); @@ -138,10 +135,7 @@ PatternTab::iterator i; i = pattern_tab.find(item.id); if( i == pattern_tab.end() ) - { - log << log3 << "PC: there is no such an item to delete, id: " << item.id << ", url: " << item.url << logend; return; - } log << log2 << "PC: deleted pattern, id: " << item.id << ", url: " << item.url << logend; diff --git a/templates/templates.cpp b/templates/templates.cpp index 1cec844..2e14da0 100755 --- a/templates/templates.cpp +++ b/templates/templates.cpp @@ -285,7 +285,6 @@ void Templates::CreateFunctions() */ ezc_functions.Insert("mount_type_is", mount_type_is); ezc_functions.Insert("mount_page_arg_is", mount_page_arg_is); - ezc_functions.Insert("mount_thread_arg_is", mount_thread_arg_is); ezc_functions.Insert("mount_has_html_template", mount_has_html_template); ezc_functions.Insert("mount_first_html_template", mount_first_html_template); diff --git a/templates/templates.h b/templates/templates.h index 34ee117..11e5510 100755 --- a/templates/templates.h +++ b/templates/templates.h @@ -216,7 +216,6 @@ namespace TemplatesFunctions */ void mount_type_is(Info & i); void mount_page_arg_is(Info & i); - void mount_thread_arg_is(Info & i); void mount_has_html_template(Info & i); void mount_first_html_template(Info & i);