added in ticket/templates.cpp binary search for tickets and tickets parameters

git-svn-id: svn://ttmath.org/publicrep/winix/trunk@707 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2011-01-21 16:16:52 +00:00
parent ab84a5169e
commit 61ac29b2de
9 changed files with 178 additions and 78 deletions

View File

@ -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");

View File

@ -26,26 +26,26 @@
[for ticket_tab]
<tr>
<th>[ticket_tab_param]:</th>
<th>[ticket_tab_param_name]:</th>
<td>
[if ticket_tab_is_select]
<select name="ticketparam[ticket_tab_param_index]">
<select name="ticketparam[ticket_tab_param_id]">
[for ticket_tab_select_tab]
<option [if ticket_tab_select_tab_is_default]selected [end]value="[ticket_tab_select_tab_id]">[ticket_tab_select_tab_name]</option>
<option [if ticket_tab_select_tab_is_selected]selected [end]value="[ticket_tab_select_tab_id]">[ticket_tab_select_tab_name]</option>
[end]
</select>
[end]
[if-one ticket_tab_is_integer ticket_tab_is_progress ticket_tab_is_string]
<input type="text" name="ticketparam[ticket_tab_param_index]" value="[ticket_tab_value]">
<input type="text" name="ticketparam[ticket_tab_param_id]" value="[ticket_tab_value]">
[end]
[if ticket_tab_is_multistring]
<textarea name="ticketparam[ticket_tab_param_index]">[ticket_tab_value]</textarea>
<textarea name="ticketparam[ticket_tab_param_id]">[ticket_tab_value]</textarea>
[end]
@ -54,7 +54,7 @@
<img src="[doc_base_url][ticket_tab_value]/-/thumb" alt="[ticket_tab_value]" height="150">
[end]
<input size="30" class="edit" type="file" name="ticketparam[ticket_tab_param_index]">
<input size="30" class="edit" type="file" name="ticketparam[ticket_tab_param_id]">
<input class="filesubmit" type="submit" name="fileuploadsubmit" value="Add">
[end]
@ -64,7 +64,7 @@
<a href="[doc_base_url][ticket_tab_value]/download">[ticket_tab_value]</a>
[end]
<input size="30" class="edit" type="file" name="ticketparam[ticket_tab_param_index]">
<input size="30" class="edit" type="file" name="ticketparam[ticket_tab_param_id]">
<input class="filesubmit" type="submit" name="fileuploadsubmit" value="Add">
[end]

View File

@ -4,7 +4,7 @@
[if thread_can_create]
<ul class="itemmenu">
<li><a href="[doc_base_url][dir]createthread">{thread_create_new}</a></li>
<li><a href="[doc_base_url][dir]createthread" rel="nofollow">{thread_create_new}</a></li>
</ul>
[end]

View File

@ -4,7 +4,7 @@
[if ticket_can_create]
<ul class="itemmenu">
<li><a href="[doc_base_url][dir]createticket">{ticket_create_new}</a></li>
<li><a href="[doc_base_url][dir]createticket" rel="nofollow">{ticket_create_new}</a></li>
</ul>
[end]
@ -15,7 +15,9 @@
<tr>
<th>{tickets_header_name}</th>
[for ticket_tab]
<th>[ticket_tab_param]</th>
[if-any-no ticket_tab_is_images ticket_tab_is_files]
<th>[ticket_tab_param_name]</th>
[end]
[end]
[if winix_has_plugin "thread"]
@ -29,10 +31,12 @@
<tr>
<td class="tickettabtitle"><a href="[doc_base_url][dir][tickets_tab_url]">[if-no tickets_tab_subject_empty][tickets_tab_subject][else]&lt;[tickets_tab_url]&gt;[end]</a></td>
[for tickets_tab_conf_tab]
[if tickets_tab_conf_tab_is_progress]
<td><img src="[doc_base_url_common]/{ticket_progress_image_path}/progress_[tickets_tab_conf_tab_progress_image_number].gif" alt="progress [tickets_tab_conf_tab_value]%"></td>
[else]
<td>[tickets_tab_conf_tab_value]</td>
[if-any-no tickets_tab_conf_tab_is_images tickets_tab_conf_tab_is_files]
[if tickets_tab_conf_tab_is_progress]
<td><img src="[doc_base_url_common]/{ticket_progress_image_path}/progress_[tickets_tab_conf_tab_progress_image_number].gif" alt="progress [tickets_tab_conf_tab_value]%"></td>
[else]
<td>[tickets_tab_conf_tab_value]</td>
[end]
[end]
[end]

View File

@ -4,13 +4,13 @@
[if thread_can_reply]
<ul class="itemmenu">
<li><a href="[doc_base_url][dir][item_url]/reply">{thread_reply_in_this_thread}</a></li>
<li><a href="[doc_base_url][dir][item_url]/reply" rel="nofollow">{thread_reply_in_this_thread}</a></li>
</ul>
[end]
<div class="threadbox">
[if item_can_write]<a class="threadedit" href="[item_link]/emacs">\[{edit}\]</a>[end]
[if item_can_write]<a class="threadedit" href="[item_link]/emacs" rel="nofollow">\[{edit}\]</a>[end]
[if mount_thread_arg_is "subject"]<h2[if mount_thread_arg_is "info"] class="withinfo"[end]>[item_subject]</h2>[end]
[if mount_thread_arg_is "info"][include "item_info.html"][end]
[item_print_content]
@ -19,7 +19,7 @@
[for thread_sort_tab]
<div class="threadbox[if-index even] threadboxcolor[end]">
[if thread_sort_tab_can_write]<a class="threadedit" href="[thread_sort_tab_link]/emacs">\[{edit}\]</a>[end]
[if thread_sort_tab_can_write]<a class="threadedit" href="[thread_sort_tab_link]/emacs" rel="nofollow">\[{edit}\]</a>[end]
[if mount_thread_arg_is "subject"]<h2[if mount_thread_arg_is "info"] class="withinfo"[end]>[thread_sort_tab_subject]</h2>[end]
[if mount_thread_arg_is "info"][include "thread_sort_tab_info.html"][end]
[thread_sort_tab_print_content]

View File

@ -4,11 +4,11 @@
<div class="ticketinfo">
[if ticket_can_edit]<p class="edit"><a href="[doc_base_url][dir][item_url]/editticket">\[{edit}\]</a></p>[end]
[if ticket_can_edit]<p class="edit"><a href="[doc_base_url][dir][item_url]/editticket" rel="nofollow">\[{edit}\]</a></p>[end]
<table>
[for ticket_tab]
<tr>
<th>[ticket_tab_param]:</th>
<th>[ticket_tab_param_name]:</th>
<td>
[if ticket_tab_is_images]
@ -38,14 +38,14 @@
[if thread_can_reply]
<ul class="itemmenu">
<li><a href="[doc_base_url][dir][item_url]/reply">{thread_reply_in_this_thread}</a></li>
<li><a href="[doc_base_url][dir][item_url]/reply" rel="nofollow">{thread_reply_in_this_thread}</a></li>
</ul>
[end]
[for thread_sort_tab]
<div class="threadbox[if-index even] threadboxcolor[end]">
[if thread_sort_tab_can_write]<a class="threadedit" href="[thread_sort_tab_link]/emacs">\[{edit}\]</a>[end]
[if thread_sort_tab_can_write]<a class="threadedit" href="[thread_sort_tab_link]/emacs" rel="nofollow">\[{edit}\]</a>[end]
[if mount_thread_arg_is "subject"]<h2[if mount_thread_arg_is "info"] class="withinfo"[end]>[thread_sort_tab_subject]</h2>[end]
[if mount_thread_arg_is "info"][include "thread_sort_tab_info.html"][end]
[thread_sort_tab_print_content]

View File

@ -110,7 +110,7 @@ Error TDb::GetThreads(const std::vector<long> & file_id_tab, std::vector<Thread>
{
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 "

View File

@ -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<long> & file_id_tab, std::vector<Ticket>
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<long> & file_id_tab, std::vector<Ticket>
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);

View File

@ -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> & 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 ; a<ticket_info.ticket_tab.size() ; ++a)
long id = ticket_info.item_sort_tab[item_sort_index]->id;
has_ticket = find_ticket(ticket_info.ticket_tab, id, ticket_index);
/* for(size_t a=0 ; a<ticket_info.ticket_tab.size() ; ++a)
{
if( ticket_info.ticket_tab[a].file_id == ticket_info.item_sort_tab[item_sort_index]->id )
{
@ -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);
}