/********************************************************************** * * sqlqueryaction.cpp -- * Copyright (C) 2010 The New Zealand Digital Library Project * * A component of the Greenstone digital library software * from the New Zealand Digital Library Project at the * University of Waikato, New Zealand. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *********************************************************************/ #include "sqlqueryaction.h" #include "querytools.h" #include "formattools.h" #include "cgiutils.h" #include "OIDtools.h" #include "fileutil.h" #include "text_t.h" #include "historydb.h" #include "htmlutils.h" // for html_safe in do_action #include "gsdltools.h" #include // for strtol #include sqlqueryaction::sqlqueryaction () : basequeryaction() { cgiarginfo arg_ainfo; // this action uses cgi variable "a" arg_ainfo.shortname = "a"; arg_ainfo.longname = "action"; arg_ainfo.multiplechar = true; arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = "sqlq"; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); // "sqlqto" - 0 = not available, 1 = available arg_ainfo.shortname = "sqlqto"; arg_ainfo.longname = "sqlquery type options"; arg_ainfo.multiplechar = true; // can be empty or single char arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = g_EmptyText; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); // "sqlfqn" - number of fields in the query form arg_ainfo.shortname = "sqlfqn"; arg_ainfo.longname = "sql form query num fields"; arg_ainfo.multiplechar = true; arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = "4"; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); // "sqlfqf" - the list of field names in the form query // - a comma separated list arg_ainfo.shortname = "sqlfqf"; arg_ainfo.longname = "sql form query fields"; arg_ainfo.multiplechar = true; arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = g_EmptyText; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); // "sqlfqv" - the list of values in the form query // - a comma separated list arg_ainfo.shortname = "sqlfqv"; arg_ainfo.longname = "sql form query values"; arg_ainfo.multiplechar = true; arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = g_EmptyText; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); // "sqlfqc" - the list of boolean operators in the form query // - a comma separated list arg_ainfo.shortname = "sqlfqc"; arg_ainfo.longname = "sql form query combines"; arg_ainfo.multiplechar = true; arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = g_EmptyText; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); // **** // Looks like 'multiplevalue' is left undefined (e.g. not set in // constructor). This looks like a fairly major problem // in terms of leaving it undefine // => in the case of "sqlsf" leads to conflict over value it has // "sqlsf" - Sort field. Set to field to be used for sorting search reult // set arg_ainfo.shortname = "sqlsf"; arg_ainfo.longname = "sql sort field"; arg_ainfo.multiplechar = true; arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = g_EmptyText; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); // "sqlfilter" - boolean flag to control whether "delete all" or // "keep all" functionality is available arg_ainfo.shortname = "sqlfilter"; arg_ainfo.longname = "whether sql filtering is active or not"; arg_ainfo.multiplechar = false; arg_ainfo.multiplevalue = false; arg_ainfo.defaultstatus = cgiarginfo::weak; arg_ainfo.argdefault = "0"; arg_ainfo.savedarginfo = cgiarginfo::must; argsinfo.addarginfo (NULL, arg_ainfo); } sqlqueryaction::~sqlqueryaction () { } void sqlqueryaction::configure (const text_t &key, const text_tarray &cfgline) { action::configure (key, cfgline); } bool sqlqueryaction::init (ostream &logout) { return basequeryaction::init (logout); } bool sqlqueryaction::check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, recptprotolistclass* protos, ostream &logout) { // check sqlfqn argument int arg_sqlfqn = args.getintarg("sqlfqn"); if (arg_sqlfqn < -1) { logout << "Warning: \"sqlfqn\" argument less than -1 (" << arg_sqlfqn << ")\n"; cgiarginfo *sqlfqninfo = argsinfo.getarginfo ("sqlfqn"); if (sqlfqninfo != NULL) args["sqlfqn"] = sqlfqninfo->argdefault; } return basequeryaction::check_cgiargs(argsinfo,args,protos,logout); } void sqlqueryaction::define_external_macros (displayclass &disp, cgiargsclass &args, recptprotolistclass *protos, ostream &logout) { recptproto *collectproto = protos->getrecptproto (args["c"], logout); if (collectproto == NULL) return; ColInfoResponse_t *colinfo = recpt->get_collectinfo_ptr(collectproto, args["c"], logout); comerror_t err; InfoFilterOptionsResponse_t response; InfoFilterOptionsRequest_t request; request.filterName = "SQLQueryFilter"; collectproto->get_filteroptions (args["c"], request, response, err, logout); if (err == noError) { FilterOption_tmap::const_iterator it_dom; FilterOption_tmap::const_iterator it_ran; FilterOption_tmap::const_iterator end = response.filterOptions.end(); // _sqlfqfselection_ field list it_dom = response.filterOptions.find("IndexFieldDomain"); it_ran = response.filterOptions.find("IndexFieldRange"); if ((it_dom!=end) && (it_ran!=end)) { set_option_macro ("sqlfqf",args["sqlfqf"], true,true, (*it_dom).second, (*it_ran).second, disp); if (args["b"] == "1") { // set the sort field macro set_sfselection_macro(args["sqlsf"], (*it_dom).second,(*it_ran).second, disp); } } } } void sqlqueryaction::set_sfselection_macro(text_t current_value, const FilterOption_t &option_domain, const FilterOption_t &option_range, displayclass &disp) { // we need at least one option here to continue if (option_domain.validValues.size() < 1) { return; } if (option_range.validValues.size() < 1) { return; } text_t macrovalue = "