Changeset 1915
- Timestamp:
- 2001-02-07T12:33:33+13:00 (23 years ago)
- Location:
- trunk/gsdl/src/recpt
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl/src/recpt/queryaction.cpp
r1888 r1915 33 33 #include "text_t.h" 34 34 #include "historydb.h" 35 #include "htmlutils.h" // for html_safe in do_action 36 #include "gsdltools.h" 35 37 36 38 void colinfo_t::clear () { … … 59 61 argsinfo.addarginfo (NULL, arg_ainfo); 60 62 63 // "ct" - 0 = mg, 1 = mgpp 64 arg_ainfo.shortname = "ct"; 65 arg_ainfo.longname = "collection type"; 66 arg_ainfo.multiplechar = false; 67 arg_ainfo.defaultstatus = cgiarginfo::weak; 68 arg_ainfo.argdefault = "0"; 69 arg_ainfo.savedarginfo = cgiarginfo::must; 70 argsinfo.addarginfo (NULL, arg_ainfo); 71 61 72 // "b" - 0 = simple, 1 = advanced 62 73 arg_ainfo.shortname = "b"; … … 122 133 argsinfo.addarginfo (NULL, arg_ainfo); 123 134 135 124 136 // "q" 125 137 arg_ainfo.shortname = "q"; … … 232 244 233 245 // "hd" history display - search history only displayed when 234 // this var set. 246 // this var set to something other than 0 247 // this number of records is displayed 235 248 arg_ainfo.shortname = "hd"; 236 249 arg_ainfo.longname = "history display"; 237 arg_ainfo.multiplechar = false;250 arg_ainfo.multiplechar = true; 238 251 arg_ainfo.multiplevalue = false; 239 252 arg_ainfo.defaultstatus = cgiarginfo::weak; … … 242 255 argsinfo.addarginfo (NULL, arg_ainfo); 243 256 244 245 // "hs" save - set to 1 in query form, so only save when submit 257 // "hs" save - set to 1 in query form, so only save when submit 246 258 // query 247 259 // 0 = no save 1 = save … … 254 266 argsinfo.addarginfo (NULL, arg_ainfo); 255 267 256 257 // "hcl" compress the list (show only the last 5)258 // 0 = expand, 1 = compress259 260 arg_ainfo.shortname = "hcl";261 arg_ainfo.longname = "history compress list";262 arg_ainfo.multiplechar = false;263 arg_ainfo.defaultstatus = cgiarginfo::weak;264 arg_ainfo.argdefault = "1";265 arg_ainfo.savedarginfo = cgiarginfo::must;266 argsinfo.addarginfo (NULL, arg_ainfo);267 268 269 268 // new arg for granularity, for mgpp collections 270 269 arg_ainfo.shortname = "g"; … … 276 275 argsinfo.addarginfo (NULL, arg_ainfo); 277 276 278 277 // "ds" - start date 279 278 arg_ainfo.shortname = "ds"; 280 279 arg_ainfo.longname = "start date"; … … 312 311 argsinfo.addarginfo (NULL, arg_ainfo); 313 312 313 // "qt" - 0 = text, 1 = form 314 arg_ainfo.shortname = "qt"; 315 arg_ainfo.longname = "query type"; 316 arg_ainfo.multiplechar = false; 317 arg_ainfo.defaultstatus = cgiarginfo::weak; 318 arg_ainfo.argdefault = "0"; 319 arg_ainfo.savedarginfo = cgiarginfo::must; 320 argsinfo.addarginfo (NULL, arg_ainfo); 321 322 // "qb" - 0 = regular, 1 = large 323 arg_ainfo.shortname = "qb"; 324 arg_ainfo.longname = "query box type"; 325 arg_ainfo.multiplechar = false; 326 arg_ainfo.defaultstatus = cgiarginfo::weak; 327 arg_ainfo.argdefault = "0"; 328 arg_ainfo.savedarginfo = cgiarginfo::must; 329 argsinfo.addarginfo (NULL, arg_ainfo); 330 331 // "fqn" - number of fields in the query form 332 arg_ainfo.shortname = "fqn"; 333 arg_ainfo.longname = "form query num fields"; 334 arg_ainfo.multiplechar = true; 335 arg_ainfo.defaultstatus = cgiarginfo::weak; 336 arg_ainfo.argdefault = "4"; 337 arg_ainfo.savedarginfo = cgiarginfo::must; 338 argsinfo.addarginfo (NULL, arg_ainfo); 339 340 // "fqf" - the list of field names in the form query 341 // - a comma separated list 342 arg_ainfo.shortname = "fqf"; 343 arg_ainfo.longname = "form query fields"; 344 arg_ainfo.multiplechar = true; 345 //arg_ainfo.multiplevalue = true; 346 arg_ainfo.defaultstatus = cgiarginfo::weak; 347 arg_ainfo.argdefault = ""; 348 arg_ainfo.savedarginfo = cgiarginfo::mustnot; 349 argsinfo.addarginfo (NULL, arg_ainfo); 350 351 // "fqv" - the list of values in the form query 352 // - a comma separated list 353 arg_ainfo.shortname = "fqv"; 354 arg_ainfo.longname = "form query values"; 355 arg_ainfo.multiplechar = true; 356 //arg_ainfo.multiplevalue = true; 357 arg_ainfo.defaultstatus = cgiarginfo::weak; 358 arg_ainfo.argdefault = ""; 359 arg_ainfo.savedarginfo = cgiarginfo::mustnot; 360 argsinfo.addarginfo (NULL, arg_ainfo); 361 362 363 // "fqs" - the list of stemming options in the form query 364 // - a comma separated list 365 arg_ainfo.shortname = "fqs"; 366 arg_ainfo.longname = "form query stems"; 367 arg_ainfo.multiplechar = true; 368 //arg_ainfo.multiplevalue = true; 369 arg_ainfo.defaultstatus = cgiarginfo::weak; 370 arg_ainfo.argdefault = ""; 371 arg_ainfo.savedarginfo = cgiarginfo::mustnot; 372 argsinfo.addarginfo (NULL, arg_ainfo); 373 374 375 // "fqk" - the list of casefolding options in the form query 376 // - a comma separated list 377 arg_ainfo.shortname = "fqk"; 378 arg_ainfo.longname = "form query casefolds"; 379 arg_ainfo.multiplechar = true; 380 //arg_ainfo.multiplevalue = true; 381 arg_ainfo.defaultstatus = cgiarginfo::weak; 382 arg_ainfo.argdefault = ""; 383 arg_ainfo.savedarginfo = cgiarginfo::mustnot; 384 argsinfo.addarginfo (NULL, arg_ainfo); 385 386 // "fqc" - the list of boolean operators in the form query 387 // - a comma separated list 388 arg_ainfo.shortname = "fqc"; 389 arg_ainfo.longname = "form query combines"; 390 arg_ainfo.multiplechar = true; 391 //arg_ainfo.multiplevalue = true; 392 arg_ainfo.defaultstatus = cgiarginfo::weak; 393 arg_ainfo.argdefault = ""; 394 arg_ainfo.savedarginfo = cgiarginfo::mustnot; 395 argsinfo.addarginfo (NULL, arg_ainfo); 396 397 // "fqa" - form query advanced - for "run query" 398 arg_ainfo.shortname = "fqa"; 399 arg_ainfo.longname = "form query advanced query"; 400 arg_ainfo.multiplechar = false; 401 arg_ainfo.defaultstatus = cgiarginfo::weak; 402 arg_ainfo.argdefault = "0"; 403 arg_ainfo.savedarginfo = cgiarginfo::mustnot; 404 argsinfo.addarginfo (NULL, arg_ainfo); 405 314 406 } 315 407 … … 373 465 } 374 466 //check hd argument 375 int arg_hd = args.getintarg("hd"); 376 if (arg_hd !=0 && arg_hd !=1) { 377 logout << "Warning: \"hd\" argument out of range (" << arg_hd << ")\n"; 378 cgiarginfo *hdinfo = argsinfo.getarginfo ("hd"); 379 if (hdinfo != NULL) args["hd"] = hdinfo->argdefault; 380 } 467 int arg_hd = args.getintarg("hd"); 468 if (arg_hd <0 ) { 469 logout << "Warning: \"hd\" argument less than 0 (" << arg_hd << ")\n"; 470 cgiarginfo *hdinfo = argsinfo.getarginfo ("hd"); 471 if (hdinfo != NULL) args["hd"] = hdinfo->argdefault; 472 } 473 381 474 //check hs argument 382 475 int arg_hs = args.getintarg("hs"); … … 387 480 } 388 481 389 // chech hcl argument 390 int arg_hcl = args.getintarg("hcl"); 391 if (arg_hcl !=0 && arg_hcl !=1) { 392 logout << "Warning: \"hcl\" argument out of range (" << arg_hcl << ")\n"; 393 cgiarginfo *hclinfo = argsinfo.getarginfo ("hcl"); 394 if (hclinfo != NULL) args["hcl"] = hclinfo->argdefault; 482 // check ct argument 483 int arg_ct = args.getintarg("ct"); 484 if (arg_ct !=0 && arg_ct !=1) { 485 logout << "Warning: \"ct\" argument out of range (" << arg_ct << ")\n"; 486 cgiarginfo *ctinfo = argsinfo.getarginfo ("ct"); 487 if (ctinfo != NULL) args["ct"] = ctinfo->argdefault; 488 } 489 490 // check qt argument 491 int arg_qt = args.getintarg("qt"); 492 if (arg_qt !=0 && arg_qt !=1) { 493 logout << "Warning: \"qt\" argument out of range (" << arg_qt << ")\n"; 494 cgiarginfo *qtinfo = argsinfo.getarginfo ("qt"); 495 if (qtinfo != NULL) args["qt"] = qtinfo->argdefault; 496 } 497 498 // check qb argument 499 int arg_qb = args.getintarg("qb"); 500 if (arg_qb !=0 && arg_qb !=1) { 501 logout << "Warning: \"qb\" argument out of range (" << arg_qb << ")\n"; 502 cgiarginfo *qbinfo = argsinfo.getarginfo ("qb"); 503 if (qbinfo != NULL) args["qb"] = qbinfo->argdefault; 504 } 505 506 // check fqa argument 507 int arg_fqa = args.getintarg("fqa"); 508 if (arg_fqa !=0 && arg_fqa !=1) { 509 logout << "Warning: \"fqa\" argument out of range (" << arg_fqa << ")\n"; 510 cgiarginfo *fqainfo = argsinfo.getarginfo ("fqa"); 511 if (fqainfo != NULL) args["fqa"] = fqainfo->argdefault; 512 } 513 514 // check fqn argument 515 int arg_fqn = args.getintarg("fqn"); 516 if (arg_fqn < -1) { 517 logout << "Warning: \"fqn\" argument less than -1 (" << arg_fqn << ")\n"; 518 cgiarginfo *fqninfo = argsinfo.getarginfo ("fqn"); 519 if (fqninfo != NULL) args["fqn"] = fqninfo->argdefault; 395 520 } 396 521 … … 406 531 407 532 void queryaction::define_internal_macros (displayclass &disp, cgiargsclass &args, 408 recptprotolistclass * /*protos*/,409 ostream & /*logout*/) {533 recptprotolistclass * protos, 534 ostream &logout) { 410 535 411 536 // define_internal_macros sets the following macros: … … 449 574 if (args.getintarg("s")) quotedquery += "_textstemon_"; 450 575 disp.setmacro ("quotedquery", "query", quotedquery); 576 577 define_form_macros(disp, args, protos, logout); 451 578 } 452 579 … … 478 605 macrovalue += "</select>\n"; 479 606 disp.setmacro (macroname + "selection", "Global", macrovalue); 607 } 608 609 // sets the selection box macro _fqfselection_. 610 void queryaction::set_fqfselection_macro (const FilterOption_t &option, 611 displayclass &disp) { 612 613 if (option.validValues.empty()) return; 614 text_t macrovalue = ""; 615 616 macrovalue += "<select name=\"fqf\" onChange=\"updatefqf();\">\n"; 617 618 text_tarray::const_iterator thisvalue = option.validValues.begin(); 619 text_tarray::const_iterator endvalue = option.validValues.end(); 620 621 while (thisvalue != endvalue) { 622 macrovalue += "<option value=\"" + *thisvalue + "\">_"; 623 macrovalue += *thisvalue + "_\n"; 624 thisvalue ++; 625 } 626 macrovalue += "</select>\n"; 627 disp.setmacro ("fqfselection", "query", macrovalue); 628 480 629 } 481 630 … … 530 679 if (it!=end) set_option_macro("g", args["g"], (*it).second, disp); 531 680 532 // define_history_macros(disp, args, protos, logout); 681 // should probably go into define_internal_macros 682 // _fqfselection_ 683 it = response.filterOptions.find("IndexField"); 684 if (it!=end) { 685 set_fqfselection_macro((*it).second, disp); 686 } 533 687 } 534 688 } // define external macros 689 690 void queryaction::define_form_macros (displayclass &disp, cgiargsclass &args, 691 recptprotolistclass *protos, ostream &logout) { 692 693 // defines the following macros 694 // _regformlist_ 695 // _advformlist_ 696 697 if (args["ct"]!="1" || args["qt"]!="1") 698 return; // dont need these macros 699 700 // mgpp & form query only needs the macros defined 701 text_t form = ""; 702 int argfqn = args.getintarg("fqn"); 703 704 if (args["b"] == "1") { // advanced form 705 form += "<tr>_firstadvformelement_</tr>\n"; 706 for (int i=1; i<argfqn; i++) { 707 form += "<tr>_advformelement_</tr>\n"; 708 } 709 disp.setmacro("advformlist", "query", form); 710 } 711 else { // simple form 712 for (int i=0; i<argfqn; i++) { 713 form += "<tr>_regformelement_</tr>\n"; 714 } 715 disp.setmacro("regformlist", "query", form); 716 } 717 718 } 535 719 536 720 void queryaction::define_history_macros (displayclass &disp, cgiargsclass &args, … … 543 727 text_t historylist; 544 728 int arghd = args.getintarg("hd"); 545 if (arghd != 1) {729 if (arghd == 0) { 546 730 historylist=""; 547 731 } … … 555 739 text_tarray::iterator here = entries.begin(); 556 740 text_tarray::iterator end = entries.end(); 557 int size=(int)entries.size(); 558 if (args["hcl"]==1&&size>5) { // compress the list 559 here = end-5; 560 count=size-4; 741 int numrecords=(int)entries.size(); 742 if (numrecords>arghd) { // only display some of them 743 numrecords = arghd; 561 744 } 562 historylist += "<table align=center width=500 border=0>\n"; 563 historylist += "<tr><td width=300 align=center>"; 564 historylist += "<a href=\"_httpclearhistory_\">_textclearhistory_</a></td>\n"; 565 566 if (size>5&&args["hcl"]==1) { //compress the list, show the expand button 567 568 historylist += "<td><a href=\"_gwcgi_?_optsite_e=_compressedoptions_&a=q&hcl=0\">_textexpand_</a></td>\n"; 569 } 570 else if (size >5 && args["hcl"]==0) { // expand the list, show contract button 571 historylist += "<td><a href=\"_gwcgi_?_optsite_e=_compressedoptions_&a=q&hcl=1\">_textcontract_</a></td>\n"; 572 } 573 historylist += "</table>\n"; 574 historylist += "<table align=center width=500 border=1>\n<tr><th colspan=4 align=center>"; 575 historylist += "_textsearchhistory_</th></tr>\n"; 576 historylist += "<tr><th width=40>#</th>\n<th width=340>_textquery_</th>\n"; 577 historylist += "<th width=60>_textresults_</th><th width=60>_textview_</th></tr>\n"; 578 579 while (here !=end ) { 580 text_t c; 745 historylist += "<form name=\"HistoryForm\"><table width=537>\n"; 746 747 for (int i=0; i<numrecords;i++) { 581 748 text_t query; 582 749 text_t numdocs; 583 750 text_t cgiargs; 584 text_t userinfo; 585 split_saved_query(*here,c, numdocs, cgiargs); 751 text_t userinfo; 752 text_t escquery; 753 split_saved_query(entries[i],numdocs,cgiargs); 586 754 parse_saved_args(cgiargs, "q", query); // get query string out 587 755 decode_cgi_arg(query); // un cgisafe it 756 escquery = escape_quotes(query); // escape the quotes 757 text_t histvalue = "histvalue"; 758 histvalue += i; 759 disp.setmacro(histvalue, "query", escquery); 760 format_user_info(cgiargs, userinfo, args, protos, logout); 588 761 589 format_user_info(cgiargs, userinfo, protos, logout); 590 591 historylist += "<tr> <td width=40 align=center>"+c+"</td>\n"; 592 historylist += "<td width=340 align=left>"+query+"</td><td width=60 align=center>"+numdocs+"</td>\n"; 593 historylist += "<td width=60 align=center><a href=\"_gwcgi_?_optsite_e=_compressedoptions_&"; 594 historylist += *here+"\"><img name=\"display\" src=\"_httpicondisplay_\" width=_widthdisplay_ "; 595 historylist += "height=_heightdisplay_ border=\"0\" alt=\"" + userinfo +"\"></a></td></tr>\n"; 596 here++; 597 count++; 762 historylist += "<tr><td align=right>_imagehistbutton_("; 763 historylist += i; 764 historylist += ")</td>\n"; 765 historylist += "<td><nobr><table border=1 cellspacing=0 "; 766 historylist += "cellpadding=0><tr><td width=365 align=left>" 767 + query 768 + "</td></tr></table></td><td width=110 align=center><small>" 769 + numdocs; 770 if (numdocs == 1) historylist += " _texthresult_"; 771 else historylist += " _texthresults_"; 772 if (!userinfo.empty()) { 773 historylist += "<br>( "+userinfo+" )</small></td>\n"; 774 } 598 775 } 599 historylist+="</table> \n\n";776 historylist+="</table></form>\n\n"; 600 777 601 } // if 778 } // if get history info 602 779 else { 603 780 historylist += "_textnohistory_"; … … 1040 1217 // do the query 1041 1218 request.filterResultOptions = FROID | FRmetadata | FRtermFreq; 1042 text_t formattedstring = args["q"]; 1043 if (!combine_query (args["z"], formattedstring, gsdlhome)) { 1044 args["q"]=formattedstring; 1045 } 1046 1047 format_querystring (formattedstring, args.getintarg("b")); 1048 add_dates(formattedstring, args.getintarg("ds"), args.getintarg("de"), 1219 text_t formattedstring = ""; 1220 1221 if (args["qt"]=="0") { // normal text search 1222 formattedstring = args["q"]; 1223 format_querystring (formattedstring, args.getintarg("b")); 1224 add_dates(formattedstring, args.getintarg("ds"), args.getintarg("de"), 1049 1225 args.getintarg("dsbc"), args.getintarg("debc")); 1050 set_queryfilter_options (request, formattedstring, args); 1051 collectproto->filter (collection, request, response, err, logout); 1052 if (err != noError) { 1053 outconvertclass text_t2ascii; 1054 logout << text_t2ascii 1055 << "queryaction::search_single_collections: call to QueryFilter failed " 1056 << "for " << collection << " collection (" << get_comerror_string (err) << ")\n"; 1226 } 1227 else if (args["qt"]=="1" ){ // form search 1228 1229 if (args["b"]=="1" && args["fqa"]=="1") { // explicit query 1230 formattedstring = args["q"]; 1231 } 1232 else { // form search 1233 if (args["b"]=="0") { // regular form 1234 parse_reg_query_form(formattedstring, args); 1235 } 1236 else { // advanced form 1237 parse_adv_query_form(formattedstring, args); 1238 } 1239 args["q"] = formattedstring; 1240 1241 // also reset the _cgiargq_ macro as it has changed now 1242 disp.setmacro("cgiargq", "Global", html_safe(args["q"])); 1243 1244 // reset the compressed options to include the q arg 1245 text_t compressedoptions = recpt->get_compressed_arg(args, logout); 1246 if (!compressedoptions.empty()) { 1247 disp.setmacro ("compressedoptions", "Global", dm_safe(compressedoptions)); 1248 // need a decoded version of compressedoptions for use within forms 1249 // as browsers encode values from forms before sending to server 1250 // (e.g. %25 becomes %2525) 1251 decode_cgi_arg (compressedoptions); 1252 disp.setmacro ("decodedcompressedoptions", "Global", dm_safe(compressedoptions)); 1253 } 1254 } // form search 1255 } // args["qt"]=1 1256 else { 1257 logout << "ERROR (query_action::search_single_collection): querytype not defined\n"; 1057 1258 return false; 1058 1259 } 1059 1260 1060 1061 define_query_macros (args, disp, response); 1062 1063 // save the query if appropriate 1064 if (!save_search_history(args, response)) 1065 logout << "save failed"; 1261 if (!formattedstring.empty()) { // do the query 1262 set_queryfilter_options (request, formattedstring, args); 1263 collectproto->filter (collection, request, response, err, logout); 1264 if (err != noError) { 1265 outconvertclass text_t2ascii; 1266 logout << text_t2ascii 1267 << "queryaction::search_single_collections: call to QueryFilter failed " 1268 << "for " << collection << " collection (" << get_comerror_string (err) << ")\n"; 1269 return false; 1270 } 1271 1272 define_query_macros (args, disp, response); 1273 1274 // save the query if appropriate 1275 if (!save_search_history(args, response)) 1276 logout << "save failed"; 1277 } 1066 1278 1067 1279 define_history_macros (disp, args, protos, logout); 1068 1280 1069 1281 textout << outconvert << disp << "_query:header_\n" 1070 1282 << "_query:content_"; … … 1096 1308 while (this_term != end_term) { 1097 1309 char *term = (*this_term).term.getcstr(); 1098 if(term[0]<'0' || term[0] >'9'){1310 // if(term[0]<'0' || term[0] >'9'){ 1099 1311 freqmsg += (*this_term).term + ": " + (*this_term).freq; 1100 1312 if ((this_term + 1) != end_term) 1101 1313 freqmsg += ", "; 1102 }1314 // } 1103 1315 delete term; 1104 1316 this_term ++; … … 1156 1368 bool queryaction::save_search_history (cgiargsclass &args, const FilterResponse_t &response) 1157 1369 { 1158 1159 1370 if (args["q"]=="") return true; // null query, dont save 1160 1371 if (args["hs"]=="0") return true; // only save when submit query 1161 1372 // displayed 1162 1373 // get userid 1163 1374 text_t userid = args["z"]; … … 1169 1380 query.push_back('+'); 1170 1381 } 1171 query += "a=q"; 1172 query += "&c="+args["c"]; 1382 query += "c="+args["c"]; 1173 1383 query += "&h="+args["h"]; 1174 1384 query += "&t="+args["t"]; … … 1178 1388 query += "&s="+args["s"]; 1179 1389 query += "&k="+args["k"]; 1180 1390 query += "&g="+args["g"]; 1391 1181 1392 text_t qstring = args["q"]; 1182 1393 text_t formattedquery =cgi_safe(qstring); 1183 1394 query += "&q="+formattedquery; 1184 1395 1185 if (set_history_info(userid, query, gsdlhome)) return true; 1396 bool display=false; 1397 int hd = args.getintarg("hd"); 1398 if (hd > 0) display=true; 1399 if (set_history_info(userid, query, gsdlhome, display)) return true; 1186 1400 else return false; 1187 1401 … … 1191 1405 1192 1406 1193 1194 1195 -
trunk/gsdl/src/recpt/queryaction.h
r1285 r1915 69 69 const FilterResponse_t &response); 70 70 71 void define_form_macros (displayclass &disp, cgiargsclass &args, 72 recptprotolistclass *protos, ostream &logout); 73 74 void set_fqfselection_macro (const FilterOption_t &option, 75 displayclass &disp); 76 77 71 78 void define_history_macros (displayclass &disp, cgiargsclass &args, 72 79 recptprotolistclass *protos, ostream &logout); … … 79 86 ostream &textout, ostream &logout); 80 87 81 82 83 bool search_multiple_collections (cgiargsclass &args, recptprotolistclass *protos, 84 browsermapclass *browsers, displayclass &disp, 85 outconvertclass &outconvert, ostream &textout, 88 bool search_multiple_collections (cgiargsclass &args, 89 recptprotolistclass *protos, 90 browsermapclass *browsers, 91 displayclass &disp, 92 outconvertclass &outconvert, 93 ostream &textout, 86 94 ostream &logout); 87 88 89 bool search_single_collection (cgiargsclass &args, const text_t &collection, 90 recptprotolistclass *protos, browsermapclass *browsers, 91 displayclass &disp, outconvertclass &outconvert, 95 96 bool search_single_collection (cgiargsclass &args, 97 const text_t &collection, 98 recptprotolistclass *protos, 99 browsermapclass *browsers, 100 displayclass &disp, 101 outconvertclass &outconvert, 92 102 ostream &textout, ostream &logout); 93 103 94 104 95 bool save_search_history(cgiargsclass &args, const FilterResponse_t &response);96 bool delete_search_history(cgiargsclass &args); 105 bool save_search_history(cgiargsclass &args, 106 const FilterResponse_t &response); 97 107 98 108 public:
Note:
See TracChangeset
for help on using the changeset viewer.