diff --git a/functions/login.cpp b/functions/login.cpp index b56fd42..695dc55 100755 --- a/functions/login.cpp +++ b/functions/login.cpp @@ -22,6 +22,12 @@ Login::Login() void Login::MakePost() { + if( request->session->id == 0 ) + { + log << log1 << "Login: can't login in a temporary session (skipped)" << logend; + return; + } + const std::wstring & login = request->PostVar(L"login"); const std::wstring & pass = request->PostVar(L"password"); const std::wstring & remem = request->PostVar(L"rememberme"); diff --git a/html/fun_createticket.html b/html/fun_createticket.html index b783b16..503b6ce 100755 --- a/html/fun_createticket.html +++ b/html/fun_createticket.html @@ -26,26 +26,26 @@ [for ticket_tab] - [ticket_tab_param]: + [ticket_tab_param_name]: [if ticket_tab_is_select] - [for ticket_tab_select_tab] - + [end] [end] [if-one ticket_tab_is_integer ticket_tab_is_progress ticket_tab_is_string] - + [end] [if ticket_tab_is_multistring] - + [end] @@ -54,7 +54,7 @@ [ticket_tab_value] [end] - + [end] @@ -64,7 +64,7 @@ [ticket_tab_value] [end] - + [end] diff --git a/html/fun_showthreads.html b/html/fun_showthreads.html index 29fac82..c9d809c 100755 --- a/html/fun_showthreads.html +++ b/html/fun_showthreads.html @@ -4,7 +4,7 @@ [if thread_can_create] [end] diff --git a/html/fun_showtickets.html b/html/fun_showtickets.html index d789279..671330a 100755 --- a/html/fun_showtickets.html +++ b/html/fun_showtickets.html @@ -4,7 +4,7 @@ [if ticket_can_create] [end] @@ -15,7 +15,9 @@ {tickets_header_name} [for ticket_tab] - [ticket_tab_param] + [if-any-no ticket_tab_is_images ticket_tab_is_files] + [ticket_tab_param_name] + [end] [end] [if winix_has_plugin "thread"] @@ -29,10 +31,12 @@ [if-no tickets_tab_subject_empty][tickets_tab_subject][else]<[tickets_tab_url]>[end] [for tickets_tab_conf_tab] - [if tickets_tab_conf_tab_is_progress] - progress [tickets_tab_conf_tab_value]% - [else] - [tickets_tab_conf_tab_value] + [if-any-no tickets_tab_conf_tab_is_images tickets_tab_conf_tab_is_files] + [if tickets_tab_conf_tab_is_progress] + progress [tickets_tab_conf_tab_value]% + [else] + [tickets_tab_conf_tab_value] + [end] [end] [end] diff --git a/html/fun_thread.html b/html/fun_thread.html index 555868e..bd35d51 100755 --- a/html/fun_thread.html +++ b/html/fun_thread.html @@ -4,13 +4,13 @@ [if thread_can_reply] [end]
- [if item_can_write]\[{edit}\][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] @@ -19,7 +19,7 @@ [for thread_sort_tab]
- [if thread_sort_tab_can_write]\[{edit}\][end] + [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] diff --git a/html/fun_ticket.html b/html/fun_ticket.html index 683729b..4983cc1 100755 --- a/html/fun_ticket.html +++ b/html/fun_ticket.html @@ -4,11 +4,11 @@
- [if ticket_can_edit]

\[{edit}\]

[end] + [if ticket_can_edit]

\[{edit}\]

[end] [for ticket_tab] - +
[ticket_tab_param]:[ticket_tab_param_name]: [if ticket_tab_is_images] @@ -38,14 +38,14 @@ [if thread_can_reply] [end] [for thread_sort_tab]
- [if thread_sort_tab_can_write]\[{edit}\][end] + [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] diff --git a/plugins/thread/tdb.cpp b/plugins/thread/tdb.cpp index 2d0ce3a..2896b10 100755 --- a/plugins/thread/tdb.cpp +++ b/plugins/thread/tdb.cpp @@ -110,7 +110,7 @@ Error TDb::GetThreads(const std::vector & file_id_tab, std::vector { CreateIdList(file_id_tab, list_id); - // should be sorted by file_id (is used in binary search later) + // they should be sorted by file_id (they are used in a binary search later) query.Clear(); query << R("select thread.file_id, thread.replies, thread.closed, thread.last_item, " "item.date_modification, item.user_id, item.guest_name " diff --git a/plugins/ticket/tdb.cpp b/plugins/ticket/tdb.cpp index 74ee8ef..69f3284 100755 --- a/plugins/ticket/tdb.cpp +++ b/plugins/ticket/tdb.cpp @@ -51,9 +51,10 @@ Error TDb::GetTicket(long file_id, Ticket & ticket) try { + // they should be sorted by param (they are used in a binary search later) query.Clear(); query << R("select file_id, param, int_value, str_value from plugins.ticket " - "where ticket.file_id=") << file_id << R(";"); + "where ticket.file_id=") << file_id << R(" order by param asc;"); r = AssertQuery(query); AssertResult(r, PGRES_TUPLES_OK); @@ -105,10 +106,12 @@ Error TDb::GetTickets(const std::vector & file_id_tab, std::vector try { + // ticket_tab must be sorted by file_id (they are used in a binary search later) + // and items in a ticket should be sorted by param (they are used in a binary search later too) query.Clear(); CreateIdList(file_id_tab, file_list); query << R("select file_id, param, int_value, str_value from plugins.ticket " - "where ticket.file_id in ") << R(file_list) << R(" order by file_id;"); + "where ticket.file_id in ") << R(file_list) << R(" order by file_id, param;"); // !! moze dodac operator <<(std::vector(long)) do query? @@ -135,7 +138,7 @@ Error TDb::GetTickets(const std::vector & file_id_tab, std::vector last_file_id = file_id; } - par.param = AssertValueInt(r, i, cparam); + par.param = AssertValueInt(r, i, cparam); par.int_value = AssertValueLong(r, i, cintvalue); AssertValueWide(r, i, cstrvalue, par.str_value); diff --git a/plugins/ticket/templates.cpp b/plugins/ticket/templates.cpp index b45e452..c3d2fdd 100755 --- a/plugins/ticket/templates.cpp +++ b/plugins/ticket/templates.cpp @@ -48,21 +48,54 @@ return percent; -bool find_ticket_value(const TicketConf::TicketItem & conf_item, const Ticket & ticket, size_t * ticket_par_index) +// binary search for conf_item.id in ticket.par_tab (ticket.par_tab must be sorted by 'param') +bool find_ticket_value(const TicketConf::TicketItem & conf_item, const Ticket & ticket, size_t & ticket_par_index) { - for(size_t a=0 ; a < ticket.par_tab.size() ; a++) + if( ticket.par_tab.empty() ) + return false; + + size_t o1 = 0; + size_t o2 = ticket.par_tab.size() - 1; + + if( ticket.par_tab[o1].param == conf_item.id ) { - if( ticket.par_tab[a].param == conf_item.id ) - { - *ticket_par_index = a; - return true; - } + ticket_par_index = o1; + return true; } + if( conf_item.id < ticket.par_tab[o1].param ) + return false; + + if( ticket.par_tab[o2].param == conf_item.id ) + { + ticket_par_index = o2; + return true; + } + + if( conf_item.id > ticket.par_tab[o2].param ) + return false; + + + while( o1 + 1 < o2 ) + { + ticket_par_index = (o1 + o2) / 2; + + if( ticket.par_tab[ticket_par_index].param == conf_item.id ) + return true; + + if( ticket.par_tab[ticket_par_index].param < conf_item.id ) + o1 = ticket_par_index; + else + o2 = ticket_par_index; + } + + return false; } + + void ticket_print_value(Info & i, size_t conf_index, const Ticket::TicketParam & ticket_param) { if( conf_index < ticket_info.cur_conf->tab.size() ) @@ -123,6 +156,52 @@ static bool has_ticket; static bool has_value; +// binary search for id in ticket_tab (ticket_tab must be sorted by 'file_id') +bool find_ticket(const std::vector & ticket_tab, long id, size_t & ticket_index) +{ + if( ticket_tab.empty() ) + return false; + + size_t o1 = 0; + size_t o2 = ticket_tab.size() - 1; + + if( ticket_tab[o1].file_id == id ) + { + ticket_index = o1; + return true; + } + + if( id < ticket_tab[o1].file_id ) + return false; + + if( ticket_tab[o2].file_id == id ) + { + ticket_index = o2; + return true; + } + + if( id > ticket_tab[o2].file_id ) + return false; + + + while( o1 + 1 < o2 ) + { + ticket_index = (o1 + o2) / 2; + + if( ticket_tab[ticket_index].file_id == id ) + return true; + + if( ticket_tab[ticket_index].file_id < id ) + o1 = ticket_index; + else + o2 = ticket_index; + } + + +return false; +} + + void tickets_tab(Info & i) { @@ -132,7 +211,10 @@ void tickets_tab(Info & i) if( i.res ) { - for(size_t a=0 ; aid; + has_ticket = find_ticket(ticket_info.ticket_tab, id, ticket_index); + +/* for(size_t a=0 ; aid ) { @@ -140,7 +222,7 @@ void tickets_tab(Info & i) ticket_index = a; } } - +*/ plugin.Call(WINIX_PL_THREAD_SET_SORTTAB_INDEX, item_sort_index); } } @@ -182,12 +264,18 @@ void tickets_tab_conf_tab(Info & i) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; const Ticket & ticket = ticket_info.ticket_tab[ticket_index]; - has_value = find_ticket_value(conf_item, ticket, &par_index); + has_value = find_ticket_value(conf_item, ticket, par_index); } } } +void tickets_tab_conf_tab_has_value(Info & i) +{ + i.res = has_value; +} + + void tickets_tab_conf_tab_value(Info & i) { if( has_value && @@ -203,7 +291,7 @@ void tickets_tab_conf_tab_value(Info & i) void tickets_tab_conf_tab_is_integer(Info & i) { - if( has_value && conf_tab_index < ticket_info.cur_conf->tab.size() ) + if( conf_tab_index < ticket_info.cur_conf->tab.size() ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; i.res = conf_item.type == TicketConf::TicketItem::TypeInteger; @@ -213,7 +301,7 @@ void tickets_tab_conf_tab_is_integer(Info & i) void tickets_tab_conf_tab_is_progress(Info & i) { - if( has_value && conf_tab_index < ticket_info.cur_conf->tab.size() ) + if( conf_tab_index < ticket_info.cur_conf->tab.size() ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; i.res = conf_item.type == TicketConf::TicketItem::TypeProgress; @@ -223,7 +311,7 @@ void tickets_tab_conf_tab_is_progress(Info & i) void tickets_tab_conf_tab_is_select(Info & i) { - if( has_value && conf_tab_index < ticket_info.cur_conf->tab.size() ) + if( conf_tab_index < ticket_info.cur_conf->tab.size() ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; i.res = conf_item.type == TicketConf::TicketItem::TypeSelect; @@ -233,7 +321,7 @@ void tickets_tab_conf_tab_is_select(Info & i) void tickets_tab_conf_tab_is_string(Info & i) { - if( has_value && conf_tab_index < ticket_info.cur_conf->tab.size() ) + if( conf_tab_index < ticket_info.cur_conf->tab.size() ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; i.res = conf_item.type == TicketConf::TicketItem::TypeString; @@ -243,7 +331,7 @@ void tickets_tab_conf_tab_is_string(Info & i) void tickets_tab_conf_tab_is_multistring(Info & i) { - if( has_value && conf_tab_index < ticket_info.cur_conf->tab.size() ) + if( conf_tab_index < ticket_info.cur_conf->tab.size() ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; i.res = conf_item.type == TicketConf::TicketItem::TypeMultistring; @@ -253,7 +341,7 @@ void tickets_tab_conf_tab_is_multistring(Info & i) void tickets_tab_conf_tab_is_images(Info & i) { - if( has_value && conf_tab_index < ticket_info.cur_conf->tab.size() ) + if( conf_tab_index < ticket_info.cur_conf->tab.size() ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; i.res = conf_item.type == TicketConf::TicketItem::TypeImages; @@ -263,7 +351,7 @@ void tickets_tab_conf_tab_is_images(Info & i) void tickets_tab_conf_tab_is_files(Info & i) { - if( has_value && conf_tab_index < ticket_info.cur_conf->tab.size() ) + if( conf_tab_index < ticket_info.cur_conf->tab.size() ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_tab_index]; i.res = conf_item.type == TicketConf::TicketItem::TypeFiles; @@ -308,13 +396,20 @@ void ticket_tab(Info & i) if( i.res ) { const TicketConf::TicketItem & conf_item = ticket_info.cur_conf->tab[conf_index]; - has_value = find_ticket_value(conf_item, *ticket_info.ticket, &par_index); + has_value = find_ticket_value(conf_item, *ticket_info.ticket, par_index); } } -void ticket_tab_param(Info & i) +void ticket_tab_param_id(Info & i) +{ + if( conf_index < ticket_info.cur_conf->tab.size() ) + i.out << ticket_info.cur_conf->tab[conf_index].id; +} + + +void ticket_tab_param_name(Info & i) { if( conf_index < ticket_info.cur_conf->tab.size() ) i.out << ticket_info.cur_conf->tab[conf_index].name; @@ -328,22 +423,14 @@ void ticket_tab_value(Info & i) } - -void ticket_tab_param_index(Info & i) -{ - if( conf_index < ticket_info.cur_conf->tab.size() ) - i.out << ticket_info.cur_conf->tab[conf_index].id; -} - - -void ticket_tab_int_value_index(Info & i) +void ticket_tab_value_int(Info & i) { if( has_value && par_index < ticket_info.ticket->par_tab.size() ) i.out << ticket_info.ticket->par_tab[par_index].int_value; } -void ticket_tab_str_value_index(Info & i) +void ticket_tab_value_str(Info & i) { if( has_value && par_index < ticket_info.ticket->par_tab.size() ) i.out << ticket_info.ticket->par_tab[par_index].str_value; @@ -363,6 +450,7 @@ void ticket_tab_is_progress(Info & i) i.res = ticket_info.cur_conf->tab[conf_index].type == TicketConf::TicketItem::TypeProgress; } + void ticket_tab_is_select(Info & i) { if( conf_index < ticket_info.cur_conf->tab.size() ) @@ -408,9 +496,7 @@ void ticket_tab_select_tab(Info & i) } -// !! zmienic nazwe na cos w stylu should_be_selected -// bo to nie tylko odczytuje nazwe z konfiga -void ticket_tab_select_tab_is_default(Info & i) +void ticket_tab_select_tab_is_selected(Info & i) { if( has_value && par_index < ticket_info.ticket->par_tab.size() ) { @@ -513,8 +599,9 @@ using namespace ns_ticket_tab; fun->Insert("tickets_tab_subject", tickets_tab_subject); fun->Insert("tickets_tab_url", tickets_tab_url); - fun->Insert("tickets_tab_conf_tab", tickets_tab_conf_tab); - fun->Insert("tickets_tab_conf_tab_value", tickets_tab_conf_tab_value); + fun->Insert("tickets_tab_conf_tab", tickets_tab_conf_tab); + fun->Insert("tickets_tab_conf_tab_has_value", tickets_tab_conf_tab_has_value); + fun->Insert("tickets_tab_conf_tab_value", tickets_tab_conf_tab_value); fun->Insert("tickets_tab_conf_tab_is_integer", tickets_tab_conf_tab_is_integer); fun->Insert("tickets_tab_conf_tab_is_progress", tickets_tab_conf_tab_is_progress); @@ -527,29 +614,29 @@ using namespace ns_ticket_tab; - fun->Insert("ticket_tab", ticket_tab); + fun->Insert("ticket_tab", ticket_tab); - fun->Insert("ticket_tab_param", ticket_tab_param); - fun->Insert("ticket_tab_value", ticket_tab_value); - fun->Insert("ticket_tab_param_index", ticket_tab_param_index); - fun->Insert("ticket_tab_int_value_index", ticket_tab_int_value_index); - fun->Insert("ticket_tab_str_value_index", ticket_tab_str_value_index); + fun->Insert("ticket_tab_param_id", ticket_tab_param_id); + fun->Insert("ticket_tab_param_name", ticket_tab_param_name); + fun->Insert("ticket_tab_value", ticket_tab_value); + fun->Insert("ticket_tab_value_int", ticket_tab_value_int); + fun->Insert("ticket_tab_value_str", ticket_tab_value_str); - fun->Insert("ticket_tab_is_integer", ticket_tab_is_integer); - fun->Insert("ticket_tab_is_progress", ticket_tab_is_progress); - fun->Insert("ticket_tab_is_select", ticket_tab_is_select); - fun->Insert("ticket_tab_is_string", ticket_tab_is_string); - fun->Insert("ticket_tab_is_multistring", ticket_tab_is_multistring); - fun->Insert("ticket_tab_is_images", ticket_tab_is_images); - fun->Insert("ticket_tab_is_files", ticket_tab_is_files); + fun->Insert("ticket_tab_is_integer", ticket_tab_is_integer); + fun->Insert("ticket_tab_is_progress", ticket_tab_is_progress); + fun->Insert("ticket_tab_is_select", ticket_tab_is_select); + fun->Insert("ticket_tab_is_string", ticket_tab_is_string); + fun->Insert("ticket_tab_is_multistring", ticket_tab_is_multistring); + fun->Insert("ticket_tab_is_images", ticket_tab_is_images); + fun->Insert("ticket_tab_is_files", ticket_tab_is_files); - fun->Insert("ticket_tab_select_tab", ticket_tab_select_tab); - fun->Insert("ticket_tab_select_tab_is_default", ticket_tab_select_tab_is_default); - fun->Insert("ticket_tab_select_tab_id", ticket_tab_select_tab_id); - fun->Insert("ticket_tab_select_tab_name", ticket_tab_select_tab_name); + fun->Insert("ticket_tab_select_tab", ticket_tab_select_tab); + fun->Insert("ticket_tab_select_tab_is_selected", ticket_tab_select_tab_is_selected); + fun->Insert("ticket_tab_select_tab_id", ticket_tab_select_tab_id); + fun->Insert("ticket_tab_select_tab_name", ticket_tab_select_tab_name); - fun->Insert("ticket_tab_files_tab", ticket_tab_files_tab); - fun->Insert("ticket_tab_files_tab_index", ticket_tab_files_tab_index); + fun->Insert("ticket_tab_files_tab", ticket_tab_files_tab); + fun->Insert("ticket_tab_files_tab_index", ticket_tab_files_tab_index); }