which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@8626 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			220 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
// report.cgi: applicazione per avere qualche piccolo report/status
 | 
						|
// sui partecipanti ai corsi
 | 
						|
 | 
						|
#include <libpq++.h>
 | 
						|
#include "applicat.h"
 | 
						|
#include "questionnaire.h"
 | 
						|
 | 
						|
class Report_Application : public Application
 | 
						|
{
 | 
						|
private:
 | 
						|
 | 
						|
  String     _dbname;
 | 
						|
  String     _utente;
 | 
						|
  String     _azione; //ACCESSI, VERIFICHE, LOGGATI
 | 
						|
  String     _modulo; // Numero del modulo
 | 
						|
  String     _testnum; // Livello di test
 | 
						|
  String     _correct_answers;
 | 
						|
  String     _corso;
 | 
						|
  Questionnaire _questionario;
 | 
						|
  PgEnv      _environment;
 | 
						|
  PgDatabase *_db;
 | 
						|
  
 | 
						|
protected:
 | 
						|
  virtual bool create();
 | 
						|
  virtual bool destroy();
 | 
						|
  virtual void main_func();
 | 
						|
  void report();
 | 
						|
public:
 | 
						|
  Report_Application() {_db = NULL;}
 | 
						|
  virtual ~Report_Application() {};
 | 
						|
};
 | 
						|
 | 
						|
bool Report_Application::create()
 | 
						|
{
 | 
						|
  _modulo  = "";
 | 
						|
  _testnum = "";
 | 
						|
  _corso = "";
 | 
						|
  _dbname = POSTGRES_DB;
 | 
						|
  _environment.Port(POSTGRES_PORT);
 | 
						|
  _environment.Host(POSTGRES_HOST);
 | 
						|
  print_header("Report per utenti");
 | 
						|
  char *t1, *t2;
 | 
						|
  char *ccc = getenv("CONTENT_LENGTH");
 | 
						|
  int cl = ccc != NULL ? atoi(ccc) : 0;
 | 
						|
  if (cl < 512)
 | 
						|
    for (int x = 0; cl && (!feof(stdin)); x++) {
 | 
						|
      t1 = fmakeword(stdin, '&', &cl);
 | 
						|
      t2 = makeword(t1, '=');
 | 
						|
      unescape_url(t1);
 | 
						|
      unescape_url(t2);
 | 
						|
      if (!strcmp(t2,"AZIONE"))
 | 
						|
	_azione = t1;
 | 
						|
      if (!strcmp(t2,"UTENTE"))
 | 
						|
	_utente = t1;
 | 
						|
      if (!strcmp(t2,"MODULO"))
 | 
						|
	_modulo = t1;
 | 
						|
      if (!strcmp(t2,"TESTNUM"))
 | 
						|
	_testnum = t1;
 | 
						|
    }
 | 
						|
  else {
 | 
						|
    cout << "<H2>Troppi dati inviati</H2><BR><BR>" << endl;
 | 
						|
    cout << "<P>L'applicazione ha ricevuto troppi dati sul buffer d'ingresso.</P><BR>" << endl;
 | 
						|
    return FALSE;
 | 
						|
  } 
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool Report_Application::destroy()
 | 
						|
{
 | 
						|
  print_footer();
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
void Report_Application::report()
 | 
						|
{
 | 
						|
  // The Last One... Query di selezione per ogni azione diversa
 | 
						|
  String command, command1;
 | 
						|
  if (_azione == "LOGGATI") {
 | 
						|
    command = "SELECT * FROM UTENTI WHERE logged='t'";
 | 
						|
    cout << "<H2>Elenco utenti collegati</H2><BR><BR>" << endl;
 | 
						|
  }
 | 
						|
  else
 | 
						|
    if (_azione == "ACCESSI") {
 | 
						|
      command = "SELECT * FROM ACCESSI WHERE loginname='";
 | 
						|
      command += _utente;
 | 
						|
      command += "'";
 | 
						|
      cout << "<H2>Elenco accessi effettuati per l'utente " << _utente << "</H2><BR><BR>" << endl;
 | 
						|
    }
 | 
						|
    else
 | 
						|
      if (_azione == "VERIFICHE") {
 | 
						|
	command = "SELECT * FROM VERIFICHE WHERE loginname='";
 | 
						|
	command += _utente;
 | 
						|
	command += "'";
 | 
						|
	if (!_modulo.empty() && !_testnum.empty()){
 | 
						|
	  command += " AND MODULO=";
 | 
						|
	  command += _modulo;
 | 
						|
	  command += " AND TESTNUM='";
 | 
						|
	  command += _testnum;
 | 
						|
	  command += "'";
 | 
						|
 | 
						|
	  // Selezione per reperire il correttore
 | 
						|
	  command1 = "SELECT * FROM CORRETTORI WHERE MODULO=";
 | 
						|
	  command1 += _modulo;
 | 
						|
	  command1 += " AND TESTNUM='";
 | 
						|
	  command1 += _testnum;
 | 
						|
	  command1 += "'";
 | 
						|
	  _db->ExecCommandOk(command1);
 | 
						|
	  if (_db->Tuples() > 0)
 | 
						|
	    _correct_answers = _db->GetValue(0,"risposte");
 | 
						|
 | 
						|
	  // Selezione per reperire a quale corso appartiene l'utente
 | 
						|
	  command1 = "SELECT * FROM UTENTI WHERE loginname='";
 | 
						|
	  command1 += _utente;
 | 
						|
	  command1 += "'";
 | 
						|
	  _db->ExecCommandOk(command1);
 | 
						|
	  if (_db->Tuples() > 0)
 | 
						|
	    _corso = _db->GetValue(0,"course");
 | 
						|
        }
 | 
						|
	
 | 
						|
	cout << "<H2>Elenco verifiche effettuate per l'utente " << _utente << "</H2><BR><BR>" << endl;
 | 
						|
      }
 | 
						|
      else
 | 
						|
	command = "SELECT * FROM UTENTI WHERE loginname='_'"; // Comando per ritornare 0 Tuple
 | 
						|
 | 
						|
  _db->ExecCommandOk(command);
 | 
						|
  const int tuples = _db->Tuples();
 | 
						|
 | 
						|
  if (tuples > 0) {
 | 
						|
    // Intestazione tabella
 | 
						|
    cout << "<CENTER><TABLE BORDER>" << endl;
 | 
						|
    cout << "<TR>";
 | 
						|
    if (_azione == "LOGGATI")
 | 
						|
      cout << "<TH>Log-name</TH><TH>Accesso in data</TH></TR>" << endl;
 | 
						|
      else
 | 
						|
	if (_azione == "ACCESSI")
 | 
						|
	  cout << "<TH>Log-Name</TH><TH>Ingresso</TH><TH>Uscita</TH></TR>" << endl;
 | 
						|
	  else
 | 
						|
	    if (_azione == "VERIFICHE")
 | 
						|
	      cout << "<TH>Log-name</TH><TH>Modulo</TH><TH>Liv. Test</TH><TH>Data verifica</TH><TH>Punteggio</TH></TR>" << endl;
 | 
						|
    for (int i = 0; i < tuples; i++) { // Ciclo sulle tuple ritornate
 | 
						|
      cout << "<TR>";
 | 
						|
      if (_azione == "LOGGATI")
 | 
						|
	cout << "<TD>" << _db->GetValue(i,"loginname") << "</TD><TD>" << _db->GetValue(i,"logindate") << "</TD>" << endl;
 | 
						|
	else
 | 
						|
	  if (_azione == "ACCESSI")
 | 
						|
	    cout << "<TD>" << _db->GetValue(i,"loginname") << "</TD><TD>" << _db->GetValue(i,"logindate") << "</TD><TD>" << _db->GetValue(i,"logoutdate") << "</TD>" << endl;
 | 
						|
	    else
 | 
						|
	      if (_azione == "VERIFICHE")
 | 
						|
		cout << "<TD>" << _db->GetValue(i,"loginname") 
 | 
						|
		     << "</TD><TD>" << _db->GetValue(i,"modulo") << "</TD><TD>" 
 | 
						|
		     << _db->GetValue(i,"testnum") << "</TD><TD>" 
 | 
						|
		     << _db->GetValue(i,"data") << "</TD><TD>" 
 | 
						|
		     << _db->GetValue(i,"punteggio") << "</TD>" << endl;
 | 
						|
      cout << "</TR>" << endl;
 | 
						|
    }
 | 
						|
      
 | 
						|
    cout << "</TABLE></CENTER>" << endl;
 | 
						|
 | 
						|
    if (_azione == "VERIFICHE" && !_modulo.empty() && !_testnum.empty()) {  
 | 
						|
      String user_answers, corso;
 | 
						|
      
 | 
						|
      trim(_corso);
 | 
						|
      for (int i=0; i<tuples; i++) { 
 | 
						|
	user_answers = _db->GetValue(i,"risposte");
 | 
						|
	_questionario.load(_correct_answers,user_answers);
 | 
						|
	_questionario.dump_html(_corso, atoi(_modulo), _testnum[0]);
 | 
						|
      }
 | 
						|
    }     
 | 
						|
  }
 | 
						|
  else
 | 
						|
    cout << "<p>Nessun record presente per la query selezionata</p>" << endl;
 | 
						|
  return;
 | 
						|
}
 | 
						|
 | 
						|
void Report_Application::main_func()
 | 
						|
{ 
 | 
						|
  if (_azione.empty() || (_azione != "LOGGATI" && _utente.empty())) { 
 | 
						|
    cout << "<H2>Impossibile eseguire il report</H2><BR><BR>" << endl;
 | 
						|
    cout << "<P>E' necessario specificare il tipo di report e/o l'utente.</P><BR>";
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  _db = new PgDatabase(_environment, _dbname);
 | 
						|
  if ( _db->ConnectionBad() )
 | 
						|
    print_database_error();
 | 
						|
  else
 | 
						|
    report();
 | 
						|
  delete _db;
 | 
						|
  return;
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char* argv[])
 | 
						|
{
 | 
						|
  Report_Application* a = new Report_Application();
 | 
						|
 
 | 
						|
  a->run(argc, argv);
 | 
						|
 | 
						|
  delete a;
 | 
						|
  
 | 
						|
  exit(0);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |