FAQ - SISTEM
Publicado por Perfil removido 18/04/2005
[ Hits: 5.002 ]
Download faq-system-0.3.5.tar[1]
Este é um pacote de cgi-programas para manter um FAQ. Os dados são armazenados em um banco de dados de mysql. Características de chave incluem: fácil usar na interface web, gera o faq e veja o resultado ao mesmo tempo, vários tipos de formato formata poss
faq-system-0.3.5/ 40755 764 144 0 6727346156 12432 5 ustar thomas users faq-system-0.3.5/answer.cc 100644 764 144 10075 6727307346 14356 0 ustar thomas users #include "conf.h" int main(void) { //int i; char **tuple; Database *db; DBResult *res; db = new Database(); cgi C; C.initPage(); Pro p; string instance; instance = C.get_value("instance"); config CONF(instance); const char* SCRIPTSUPPORT; const char* RUN; const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* USER; const char* PASS; const char* HOST; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); SCRIPTSUPPORT = CONF.SCRIPTSUPPORT.c_str(); RUN = CONF.RUN.c_str(); // Initialise the database - for future releases if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } // Connect to database on localhost if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } string stage, question_id, topic_id, keys, answer, question; question_id = C.get_value("question_id"); answer = C.get_value("answer"); keys = C.get_value("keys"); stage = C.get_value("stage"); topic_id = C.get_value("topic_id"); question_id = C.get_value("question_id"); HTML h; cout << h.html() << h.body("#ffffff") << endl; if( stage == "prepare") { res = db->exec("SELECT value FROM %s WHERE question_id = '%s'", MYQUESTION, question_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { cout << "<h2>" << *(tuple) << "</h2>\n"; tuple = res->getTuple(); } cout << "<form name=answer action=\"" << URL << "/" << ADMIN << "/answer.cgi\" method=post>" << endl << h.font("arial","2") << "Answer this question." << h._font() << "<br></br>" << endl << h.font("arial","2") << "Value:" << h._font() << "<br></br>" << endl << h.textarea("answer", "", "15", "80") << "<br></br>" << endl << h.font("arial","2") << "Keywords:" << h._font() << "<br></br>" << endl << h.textarea("keys", "", "4", "30") << "<br></br>" << endl << h.in_hidden("question_id" ,question_id) << endl << h.in_hidden("topic_id",topic_id) << endl << "<input type=hidden name=instance value=\"" << instance << "\">\n" << h.in_submit("Save") << h.in_reset("Clear") << endl << h._form() << endl; } else { string tmp(""); /* int len = answer.length(); for(int i=0;i<len;i++) { if(answer[i] == char(39)) { tmp += "\\'"; } else tmp += answer[i]; } */ tmp = p.parse(answer); //cout << tmp << endl; res = db->exec("INSERT INTO %s VALUES(0, %s, '%s', '%s')",MYANSWER, question_id.c_str(), tmp.c_str(), keys.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't insert into table '%s': %s\n\n", MYANSWER, db->errorMessage()); delete res; delete db; exit(0); } cout << "Data inserted\n"; db->exec(res, "SELECT value FROM %s WHERE question_id = '%s'", MYQUESTION, question_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { question = *(tuple); tuple = res->getTuple(); } } // Pro p; cout << p.back("dbadmin", instance) << h._body() << h._html() << endl; if((strcmp(SCRIPTSUPPORT, "on")==0) && stage != "prepare") { string b; b = ""; b += topic_id + "." + question_id + "."; p.script("answer.cgi", question, b, instance,string(RUN)); } delete res; // Drop buffer delete db; // Close connection } faq-system-0.3.5/database.cc 100644 764 144 7520 6727307346 14604 0 ustar thomas users /* mysql C++ wrapper library Author: Roland Haenel <rh@ginster.net> This program is in the public domain. Distribute and use it freely. */ #include <unistd.h> #include <stdarg.h> #include <time.h> #include "database.h" Database::Database() { connected = false; // No connection yet strcpy(error, "No connection established"); } Database::~Database() { disconnect(); // Disconnect if connected to database } int Database::status() { if (connected == false) return DB_CONNECTION_NONE; return DB_CONNECTION_OK; } int Database::init() { return DB_COMMAND_OK; } char *Database::errorMessage() { if (connected == false) return error; return mysql_error(&mysql); } int Database::connect(const char *host, char *port, const char *db, const char* user, const char* pass) { char *unused = port; /* ORIGINAL if (mysql_connect(&mysql, host, NULL, NULL) == NULL) { strcpy(error, "Connect to database failed"); return DB_ERROR; } */ if (mysql_connect(&mysql, host, user, pass) == NULL) { strcpy(error, "Connect to database failed"); return DB_ERROR; } if (mysql_select_db(&mysql, db)) { mysql_close(&mysql); strcpy(error, "No such database"); return DB_ERROR; } unused++; // Just to suppress a compiler warning connected = true; return DB_CONNECTION_OK; } void Database::disconnect() { if (connected == false) return; mysql_close(&mysql); connected = false; } int Database::reset() { return DB_COMMAND_OK; } DBResult *Database::exec(char *sqlFormat, ...) { va_list ap; char sqlCommand[5000]; va_start(ap, sqlFormat); vsnprintf(sqlCommand, 5000, sqlFormat, ap); va_end(ap); return new DBResult(&mysql, sqlCommand); } void Database::exec(DBResult *res, char *sqlFormat, ...) { va_list ap; char sqlCommand[5000]; va_start(ap, sqlFormat); vsnprintf(sqlCommand, 5000, sqlFormat, ap); va_end(ap); res->init(&mysql, sqlCommand); } // ------------------- Database result implementation ------------------ DBResult::DBResult() { result = NULL; haveError = false; } DBResult::DBResult(MYSQL *mysql, char *query) { result = NULL; haveError = false; init(mysql, query); } DBResult::~DBResult() { if (result != NULL) // Free memory resources mysql_free_result(result); } void DBResult::init(MYSQL *mysql, char *query) { if (result != NULL) { mysql_free_result(result); result = NULL; } if (mysql_query(mysql, query) == 0) { // query OK result = mysql_store_result(mysql); if (result == NULL) { // empty query if (mysql_num_fields(mysql) == 0) haveError = false; else haveError = true; } else haveError = false; } else haveError = true; } int DBResult::status() { if (haveError) return DB_ERROR; if (result == NULL) return DB_COMMAND_OK; return DB_TUPLES_OK; } int DBResult::nrTuples() { if (result == NULL) return 0; return mysql_num_rows(result); } int DBResult::nrFields() { if (result == NULL) return 0; return mysql_num_fields(result); } char *DBResult::fieldName(int n) { MYSQL_FIELD *field; if (result == NULL) return NULL; mysql_field_seek(result, n); field = mysql_fetch_field(result); if (field == NULL) return NULL; return field->name; } int DBResult::fieldSize(int n) { MYSQL_FIELD *field; if (result == NULL) return 0; mysql_field_seek(result, n); field = mysql_fetch_field(result); if (field == NULL) return 0; return field->length; } int DBResult::fieldSize(char *name) { int i; if (result == NULL) return 0; for (i = 0; i < nrFields(); i++) if (!strcmp(name, fieldName(i))) return fieldSize(i); return 0; } void DBResult::seekTuple(int tuple) { if (result == NULL) return; mysql_data_seek(result, tuple); } char **DBResult::getTuple() { MYSQL_ROW row; if (result == NULL) return NULL; row = mysql_fetch_row(result); return row; } char **DBResult::getTuple(int tuple) { seekTuple(tuple); return getTuple(); } faq-system-0.3.5/delete.cc 100644 764 144 14467 6727307346 14332 0 ustar thomas users #include "conf.h" int main(void) { //int i; char **tuple; Database *db; DBResult *res; db = new Database(); cgi C; C.initPage(); string instance; instance = C.get_value("instance"); config CONF(instance); const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* USER; const char* PASS; const char* HOST; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); string warn, stage, mode, answer, topic, question, question_id, answer_id, topic_id, keys; string TABLE, hidden_mode, hidden_id, id, action, value; if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } // Connect to database on localhost if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } stage = C.get_value("stage"); mode = C.get_value("mode"); HTML h; cout << h.html() << h.body("#ffffff") << endl; if (mode == "topic") { topic_id = C.get_value("topic_id"); hidden_id = topic_id; TABLE = MYTOPIC; warn = "Warning! You are about to delete a TOPIC! Every related question and it's "; warn += "related answers will deleted too!<br><br>"; } else if (mode == "question") { question_id = C.get_value("question_id"); hidden_id = question_id; TABLE = MYQUESTION; warn = "Warning! You are about to delete a QUESTION! Every related answer will"; warn += " deleted too!<br><br>"; } else if (mode == "answer") { answer_id = C.get_value("answer_id"); hidden_id = answer_id; TABLE = MYANSWER; warn = "Warning! You are about to delete an ANSWER!<br><br>"; } warn += "<b>Are you sure?</b>\n"; id = mode + "_id"; if (stage == "prepare") { res = db->exec("SELECT value FROM %s WHERE %s = %s", TABLE.c_str(), id.c_str(), hidden_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { value = *(tuple); tuple = res->getTuple(); } cout << "<form name=modify action=\"" << URL << "/" << ADMIN << "/delete.cgi\" method=post>" << endl << "<h2>DELETE " << mode << ": \"" << value << "\"</h2>\n" << h.font("arial","2") << "<br></br>" << endl << warn << "<br></br>" << h._font() << endl; cout << h.in_hidden(id, hidden_id) << endl << h.in_hidden("mode", mode) << endl << h.in_hidden("stage", "delete") << endl << h.in_submit(" DELETE ") << h.in_hidden("instance",instance) << h._form() << endl; } else { int question_max; string *qid; if(mode == "topic") { // find out question_max res = db->exec("SELECT question_id FROM %s WHERE topic_id = %s", MYQUESTION, hidden_id.c_str()); tuple = res->getTuple(); question_max = 0; while (tuple != NULL) { question_max++; tuple = res->getTuple(); } qid = new string[question_max]; int a = 0; res = db->exec("SELECT question_id FROM %s WHERE topic_id = %s", MYQUESTION, hidden_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { qid[a] = *(tuple); a++; tuple = res->getTuple(); } // Delete all answers: for(int m=0; m<question_max; m++) { db->exec(res, "DELETE from %s WHERE question_id = %s", MYANSWER, qid[m].c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't delete answer number: %s. \n %s \n\n", qid[m].c_str(), db->errorMessage()); delete res; delete db; exit(0); } } // Delete all questions: db->exec(res, "DELETE from %s WHERE topic_id = %s", MYQUESTION, hidden_id.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't delete question. %s \n\n", db->errorMessage()); delete res; delete db; exit(0); } // Delete the topic: db->exec(res, "DELETE from %s WHERE topic_id = %s", MYTOPIC, hidden_id.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't delete question. %s \n\n", db->errorMessage()); delete res; delete db; exit(0); } } else if(mode == "question") { // Delete all answers: res = db->exec("DELETE from %s WHERE question_id = %s", MYANSWER, hidden_id.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't delete answer number: %s. \n %s \n\n", hidden_id.c_str(), db->errorMessage()); delete res; delete db; exit(0); } //Delete question: db->exec(res, "DELETE from %s WHERE question_id = %s", MYQUESTION, hidden_id.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't delete question. %s \n\n", db->errorMessage()); delete res; delete db; exit(0); } } else if(mode == "answer") { // Delete all answers: res = db->exec("DELETE from %s WHERE answer_id = %s", MYANSWER, hidden_id.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't delete answer. \n %s \n\n", db->errorMessage()); delete res; delete db; exit(0); } } cout << h.font("arial", "2") << mode << " deleted.<br><br>\n"; } Pro p; cout << p.back("dbadmin", instance) << endl; cout << h._body() << h._html() << endl; } faq-system-0.3.5/getanswer.cc 100644 764 144 6374 6727307346 15045 0 ustar thomas users #include "conf.h" int main(void) { //int i; char **tuple; Database *db; DBResult *res; db = new Database(); cgi C; C.initPage(); string instance; instance = C.get_value("instance"); config CONF(instance); const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* HOST; const char* USER; const char* PASS; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); // Initialise the database - for future releases if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } string stage, question, answer_id, question_id, topic_id, keys; string answer[10]; int i, u; question_id = C.get_value("question_id"); stage = C.get_value("stage"); HTML h; cout << h.html() << h.body("#ffffff") << endl; if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } // Connect to database on localhost if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } res = db->exec("SELECT value FROM %s WHERE question_id = %s", MYQUESTION, question_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { cout << "<h1>" << *(tuple) << "</h1>" << endl; tuple = res->getTuple(); } db->exec(res, "SELECT value FROM %s WHERE question_id = %s", MYANSWER, question_id.c_str()); tuple = res->getTuple(); i=0; while (tuple != NULL) { answer[i] = *(tuple); tuple = res->getTuple(); i++; } if (stage == "dbadmin") { u=0; db->exec(res, "SELECT answer_id FROM %s WHERE question_id = %s", MYANSWER, question_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { cout << "<p><A HREF=\"" << URL << "/" << ADMIN ; cout << "/modify.cgi?instance=" << instance << "&stage=prepare&mode=answer&answer_id=" << *(tuple) ; cout << "\">[ modify ]</A> "; cout << "<A HREF=\"" << URL << "/" << ADMIN << "/delete.cgi?instance=" << instance << "&stage=prepare&mode=answer&answer_id=" << *(tuple) << "\">[ delete ]</A><br><br>\n" << answer[u++] << "</p><br>"; tuple = res->getTuple(); } } else { for(u=0;u<i;u++) { cout << "<p>\n"; cout << answer[u]; cout << "</p>\n"; } } Pro p; if(stage == "dbadmin") cout << p.back("dbadmin", instance) << endl; else cout << p.back("user", instance) << endl; cout << h._body() << h._html() << endl; } faq-system-0.3.5/index.cc 100644 764 144 41410 6727340400 14147 0 ustar thomas users #include "conf.h" #include <fstream.h> int main(void) { int i; char **tuple; Database *db; DBResult *res; HTML h; cgi C; C.initPage(); string instance; instance = C.get_value("instance"); // instance = "dummy"; config CONF(instance); const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* USER; const char* PASS; const char* HOST; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); string TXT; int break_txt = 80; TXT = CONF.TXT; string format; if(CONF.FORMAT == "large") { format = "large"; } else { format = "topic"; } string NAV; NAV = CONF.NAV; // we check for valid values in class config! // we maybe here at the last point of the program! db = new Database(); // Initialise the database - for future releases if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } // Connect to database on localhost if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } //cout << "debug2\n"; int topic_max = 0, question_max; string *tmp, *question_id, *question; tmp = new string[10]; string temp, navbar; int answer_max; // determine the numer of rows in topic... res = db->exec("SELECT topic_id FROM %s ", MYTOPIC); tuple = res->getTuple(); while (tuple != NULL) { //topic_max++; tuple = res->getTuple(); topic_max++; } string topic[topic_max + 1]; int topic_id[topic_max + 1]; string topic_id_str[topic_max + 1]; // now get the real topic_id's db->exec(res, "SELECT topic_id FROM %s ORDER by topic_id", MYTOPIC); //db->exec(res, "SELECT topic_id FROM %s", MYTOPIC); tuple = res->getTuple(); i=0; while (tuple != NULL) { topic_id[i] = atoi(*(tuple)); topic_id_str[i] = *(tuple); tuple = res->getTuple(); i++; } // get the related topics... db->exec(res, "SELECT value FROM %s ORDER by topic_id", MYTOPIC); //db->exec(res, "SELECT value FROM %s", MYTOPIC); tuple = res->getTuple(); i = 0; while (tuple != NULL) { topic[i] = *(tuple); tuple = res->getTuple(); i++; } string Head, Foot, Index_Temp_f, Index_Header_f, Index_Footer_f; string Store_answer[20], Store_tmp[20], topic_f, anchor; char ch; string TXT_f = string(PATH) + "/" + TXT; string TXT_t = string(PATH) + "/" + TXT + ".temp"; ofstream INDEX_TXT(TXT_f.c_str()); ofstream TXT_TMP(TXT_t.c_str()); ifstream txt_t(TXT_t.c_str()); Index_Header_f = string(PATH) + "/" + string(HEADER); Index_Footer_f = string(PATH) + "/" + string(FOOTER); Index_Temp_f = string(PATH) + "/temp.html"; ofstream Index_Temp(Index_Temp_f.c_str()); ifstream Header_File(Index_Header_f.c_str()); ifstream Footer_File(Index_Footer_f.c_str()); if( !Header_File ) { Head = h.html() + h.body("#ffffff", "#000000", "#3333FF", "#3333FF", "#FF0000"); Head += h.title("Database Full Index") + "<p></p>\n"; } else { while( Header_File ) { Header_File.get(ch); Head += ch; } } if( !Footer_File ) { Foot = "<font size=1>created by faq-system " + string(VERSION); Foot += " <a href=mailto:" + string(AUTOR_MAIL) + ">" + string(AUTOR) + "</a></font>" + h._body() + h._html() + "\n"; } else { while( Footer_File ) { Footer_File.get(ch); Foot += ch; } } // ################ fullindex.html ######################## string Index_Name = string(PATH) + "/" + instance + ".html"; ofstream Index(Index_Name.c_str()); Index << Head; Index << "<a name=\"top\"></a>\n"; Index << "<h2>Table of Contents</h2>\n"; Index << "<p><hr></p>"; if(TXT != "") INDEX_TXT << "TABLE OF CONTENTS\n\n"; cout << h.html() << h.body("#ffffff", "#000000", "#3333FF", "#3333FF", "#FF0000"); cout << "<p>" << h.font("arial", "2"); cout << "<A HREF=\"" << URL << "/" << ADMIN << "/index.cgi?instance=" << instance << "\">[ reload site ]</A> "; cout << "<A HREF=\"" << URL << "/search.cgi?instance=" << instance << "&stage=prepare\">[ search ]</A> "; cout << "<A HREF=\"" << HTTP_BASE << "/" << instance << ".html\">[ full index ]</A> "; if(TXT != "") cout << "<A HREF=\"" << HTTP_BASE << "/" << TXT << "\">[ " << TXT << "]</A> "; cout << "<A HREF=\"" << HTTP_BASE << "/" ADMIN << "/help.html\">[ help ]</A> "; cout << "</p>" << h._font(); cout << "<p>" << h.font("arial", "+2"); cout << "<b> Topics </b>" << h._font(); cout << h.font("arial", "1") ; cout << " <A HREF=\"" << URL << "/" << ADMIN << "/topic.cgi?instance=" << instance; cout << "&stage=prepare\">[ new topic ]</A></p>" << endl; // tttttttttttttttttttt for(int t=0;t<topic_max;t++) { // create a string of t (!) char tee[5]; sprintf(tee, "%d", t+1); if(format == "large") { // create an Index Entry Index << "<b>" << t + 1 << ". " << topic[t] << "</b><br>\n<ul>\n"; } else { // create one file per topic... Index << "<a href=\"" << instance << "_topic_" << t + 1 << ".html\"><b>" << t + 1 << ". " << topic[t] << "</b></a><br>\n<ul>\n"; } topic_f = string(PATH) + "/" + instance + "_topic_" + tee + ".html"; ofstream topic_file(topic_f.c_str()); if(TXT != "") { INDEX_TXT << t + 1 << ". " << topic[t] << "\n"; TXT_TMP << "\n\n" << t + 1 << ". " << topic[t] << "\n\n"; } if(format == "topic") { topic_file << Head; topic_file << "<a name=\"top\"></a>\n"; topic_file << "\n<h1><u>" << t + 1 << ". " << topic[t] << "</u></h1>\n"; navbar = ""; navbar += "<a href=\"" + instance + ".html\">"; if(NAV == "text") navbar += "[ top ]"; else navbar += "<img src=top.gif border=0 alt=TOP>"; navbar += "</a> "; if(t == 0) { sprintf(tee, "%d", t+2); navbar += "<a href=\"" + instance + "_topic_" + tee + ".html\">"; if(NAV == "text") navbar += "[ next ]"; else navbar += "<img src=next.gif border=0 alt=NEXT>"; navbar += "</a> "; } else if(t == topic_max-1) { sprintf(tee, "%d", t); navbar += "<a href=\"" + instance + "_topic_" + tee + ".html\">"; if(NAV == "text") navbar += "[ previous ]"; else navbar += "<img src=previous.gif border=0 alt=PREVIOUS>"; navbar += "</a> "; } else { sprintf(tee, "%d", t); navbar += "<a href=\"" + instance + "_topic_" + tee + ".html\">"; if(NAV == "text") navbar += "[ previous ]"; else navbar += "<img src=previous.gif border=0 alt=PREVIOUS>"; navbar += "</a> "; sprintf(tee, "%d", t+2); navbar += "<a href=\"" + instance + "_topic_" + tee + ".html\">"; if(NAV == "text") navbar += "[ next ]"; else navbar += "<img src=next.gif border=0 alt=NEXT>"; navbar += "</a> "; } topic_file << navbar << "\n<p> </p><hr>\n"; } cout << "<p><b>" << h.font("arial", "3") << t + 1 << ". "; cout << topic[t] << h._font(); cout << h.font("arial", "1") << " <A HREF=\"" << URL ; cout << "/" << ADMIN << "/question.cgi?instance=" << instance << "&stage=prepare&topic_id="; cout << topic_id[t] << "\">[ ask ]</A> "; cout << "<A HREF=\"" << URL << "/" << ADMIN << "/modify.cgi?instance=" << instance << "&stage=prepare&mode=topic&topic_id="; cout << topic_id[t] << "\">[ modify ]</A> "; cout << "<A HREF=\"" << URL << "/" << ADMIN << "/delete.cgi?instance=" << instance << "&stage=prepare&mode=topic&topic_id=" << topic_id[t] << "\">[ delete ]</A>" << h._font(); cout << h._font(); cout << "</b></p>\n"; db->exec(res, "SELECT question_id FROM %s WHERE topic_id = %d", MYQUESTION, topic_id[t]); tuple = res->getTuple(); question_max = 0; while (tuple != NULL) { question_max++; tuple = res->getTuple(); } //cout << "debug IV\n"; question = new string[question_max]; question_id = new string[question_max]; db->exec(res, "SELECT value FROM %s WHERE topic_id = %d ORDER by question_id", MYQUESTION, topic_id[t]); tuple = res->getTuple(); i=0; while (tuple != NULL) { question[i] = *(tuple); tuple = res->getTuple(); i++; } db->exec(res, "SELECT question_id FROM %s WHERE topic_id = %d ORDER by question_id", MYQUESTION, topic_id[t]); tuple = res->getTuple(); i=0; while (tuple != NULL) { question_id[i] = *(tuple); tuple = res->getTuple(); i++; } for(int b=0; b<question_max; b++) { db->exec(res, "SELECT value FROM %s WHERE question_id = %s", MYANSWER, question_id[b].c_str()); tuple = res->getTuple(); answer_max = 0; while (tuple != NULL) { if( *(tuple) == NULL) { answer_max=0; break; } answer_max++; tuple = res->getTuple(); } cout << h.font("arial", "2") << endl; cout << " "; if( answer_max != 0 ) { // create anchor name i=0; db->exec(res, "SELECT value FROM %s WHERE question_id = %s", MYANSWER, question_id[b].c_str()); tuple = res->getTuple(); int p; string produce, store, store_txt, link, caption; //char *link, *caption; //link = new char[250]; //caption = new char[250]; while (tuple != NULL) { temp = *(tuple); int length = temp.length(); for(int pos=0; pos<length;pos++) { if(temp[pos] == '#') { if(temp[pos+1] == '#') { pos += 2; p=0; while(temp[pos] != '#') { link += temp[pos]; p++; pos++; } pos++; p=0; while(temp[pos] != '#') { caption += temp[pos]; p++; pos++; } if(TXT != "") store_txt += caption + " " + link; store += "<a href=\""; if(link[0] == '_') { string topic_link; int topic_link_pos = 0; int topic_link_len = link.length(); for(int p=0;p<topic_link_len;p++) { if(link[p] == '_') { if(topic_link_pos == 0) topic_link_pos++; } else { if(topic_link_pos == 1) { topic_link += link[p]; if(link[p+1] == '_') topic_link_pos++; } } } store += string(HTTP_BASE) + "/"; if(format == "large") store += instance + ".html#"; else store += instance + "_topic_" + topic_link + ".html#"; } store += link + "\">" + caption + "</a>"; link = ""; caption = ""; } else { store += temp[pos]; store_txt += temp[pos]; if(pos == break_txt) store_txt += "\n"; } } else { store += temp[pos]; store_txt += temp[pos]; if(pos == break_txt) store_txt += "\n"; } } Store_tmp[i] = store_txt; Store_answer[i] = store; store = ""; store_txt = ""; tuple = res->getTuple(); i++; } Index << "<li>"; if(format == "large") { Index << "<a href=\"#_" << topic_id[t] << "_" << b + 1 << "\">" << t + 1 << "." << b + 1 << ". " << question[b] << "</a><br>\n"; Index_Temp << "<a name=\"_" << t + 1 << "_" << b + 1 << "\"></a>\n"; Index_Temp << "<h3>" << t + 1 << "." << b + 1 << ". " << question[b] << "</h3>\n"; // here comes the answer: for(int m=0;m<i;m++) { Index_Temp << Store_answer[m].c_str() << "<br></br>\n"; } if(NAV == "text") { Index_Temp << endl << "<br>" << h.font("arial", "1"); Index_Temp << "<br></br><p><a href=\"#top\">[ top ]</a></p>" << h._font(); } else { Index_Temp << endl << "<br><br></br><p><a href=\"#top\">" << "<img src=\"top.gif\" border=0 width=\"10\" height=\"10\">" << "</a></p>"; } Index_Temp << "<hr><p> </p>" << endl; } else { Index << "<a href=\"" << instance << "_topic_" << t + 1 << ".html#_" << t + 1 << "_" << b + 1 << "\">" << t + 1 << "." << b + 1 << ". " << question[b] << "</a><br>\n"; topic_file << "<a name=\"_" << t + 1 << "_" << b + 1 << "\"></a>\n"; topic_file << "<h3>" << t + 1 << "." << b + 1 << ". " << question[b] << "</h3>\n"; // here comes the answer: for(int m=0;m<i;m++) { topic_file << Store_answer[m].c_str() << "<br></br>\n"; } if(NAV == "text") { topic_file << endl << "<br>" << h.font("arial", "1") << "<br></br><p><a href=\"#top\">[ top ]</a></p>" << h._font(); } else { topic_file << endl << "<br><br></br><p><a href=\"#top\">" << "<img src=\"top.gif\" border=0 width=\"10\" height=\"10\">" << "</a></p>"; } topic_file << h._font() << "<hr><p> </p>\n"; } if(TXT != "") { TXT_TMP << " " << t + 1 << "." << b + 1 << ". " << question[b] << "\n\n"; INDEX_TXT << " " << t + 1 << "." << b + 1 << ". " << question[b] << "\n"; for(int m=0;m<i;m++) TXT_TMP << Store_tmp[m].c_str() << "\n\n\n"; } cout << "<A HREF=\"" << URL << "/getanswer.cgi?instance=" << instance << "&stage=dbadmin&question_id="; cout << question_id[b] << "\">" << t + 1 << "." << b + 1 << ". "; cout << "<b>" << question[b] << "</b>"; cout << "</A><b>" << h.font("arial","1") << " [[ _" << t + 1 << "_" << b + 1 << " ]]" << h._font() << "</b>"; cout << "</A>"; } else { cout << t + 1 << "." << b + 1 << ". "; cout << "<b>" << question[b] << "</b>"; } cout << h._font(); cout << h.font("arial","1") << " <A HREF=\"" << URL << "/" << ADMIN << "/answer.cgi?instance=" << instance << "&stage=prepare&question_id="; cout << question_id[b] << "&topic_id=" << topic_id[t]; cout << "\">[ answer ]</A> "; cout << " <A HREF=\"" << URL << "/" << ADMIN << "/modify.cgi?instance=" << instance << "&stage=prepare&mode=question&question_id="; cout << question_id[b] << "&topic_id=" << topic_id[t]; cout << "\">[ modify ]</A> " ; cout << "<A HREF=\"" << URL << "/" << ADMIN << "/delete.cgi?instance=" << instance << "&stage=prepare&mode=question&question_id=" << question_id[b] << "\">[ delete ]</A> " << h._font(); cout << "<br>" << endl; } Index << "</ul>\n"; if(TXT != "") INDEX_TXT << "\n"; topic_file << "</ul>\n"; if(format == "topic") { topic_file << "<P></P>" << navbar; topic_file << "<br></br>" << Foot; } cout << "<P></P><br></br>"; } if(format == "large") { Index << "<p></p><p></p><hr><p></p><p></p>\n"; char buffer[1000]; ifstream f(Index_Temp_f.c_str()); while ( f ) { f.getline(buffer, 1000); Index << buffer << "\n"; } } if(TXT != "") { TXT_TMP.close(); INDEX_TXT << "\n\n\n\n"; char buf[1000]; //ifstream txt_t(TXT_t.c_str()); while ( txt_t ) { txt_t.getline(buf, 1000); INDEX_TXT << buf << "\n"; } INDEX_TXT << "\n\n\ncreated by faq-system " << VERSION << "\n"; } Index << Foot; cout << "<p><font size=1>faq-system " << VERSION << " . © 1999 Thomas Linden</font></p>"; cout << h._body() << h._html(); delete res; // Drop buffer delete db; // Close connection } faq-system-0.3.5/modify.cc 100644 764 144 12754 6727343572 14355 0 ustar thomas users #include "conf.h" int main(void) { //int i; char **tuple; Database *db; DBResult *res; db = new Database(); cgi C; C.initPage(); string instance; instance = C.get_value("instance"); config CONF(instance); const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* USER; const char* PASS; const char* HOST; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); string stage, mode, answer, topic, question, question_id, answer_id, topic_id, keys; string TABLE, hidden_mode, hidden_id, id, action, value; if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } // Connect to database on localhost if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } stage = C.get_value("stage"); mode = C.get_value("mode"); HTML h; cout << h.html() << h.body("#ffffff") << endl; if (stage == "prepare") { if (mode == "topic") { topic_id = C.get_value("topic_id"); hidden_id = topic_id; TABLE = MYTOPIC; } else if (mode == "question") { question_id = C.get_value("question_id"); hidden_id = question_id; TABLE = MYQUESTION; } else if (mode == "answer") { answer_id = C.get_value("answer_id"); hidden_id = answer_id; TABLE = MYANSWER; } id = mode + "_id"; res = db->exec("SELECT value FROM %s WHERE %s = %s", TABLE.c_str(), id.c_str(), hidden_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { value = *(tuple); tuple = res->getTuple(); } cout << "<form name=modify action=\"" << URL << "/" << ADMIN << "/modify.cgi\" method=post>" << endl << h.font("arial","2") << "<b>Modify a " << mode << ".</b>" << h._font() << "<br></br>" << endl << h.font("arial","2") << mode << ": " << h._font() << "<br></br>" << endl << h.textarea(mode, value, "15", "80") << "<br></br>" << endl; if (mode != "topic") { db->exec(res,"SELECT keywords FROM %s WHERE %s = %s", TABLE.c_str(), id.c_str(), hidden_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { keys = *(tuple); tuple = res->getTuple(); } cout << h.font("arial","2") << "key words: " << h._font() << "<br></br>" << endl << h.textarea("keys", keys, "4", "30") << "<br></br>" << endl; } cout << h.in_hidden(id, hidden_id) << endl << h.in_hidden("mode", mode) << endl << h.in_hidden("stage", "save") << endl << h.in_submit("Modify") << h.in_hidden("instance",instance) << h.in_reset("Clear") << endl << h._form() << endl; } else { // Modify stage if (mode == "topic") { hidden_id = C.get_value("topic_id"); value = C.get_value("topic"); TABLE = MYTOPIC; } else if (mode == "question") { hidden_id = C.get_value("question_id"); value = C.get_value("question"); TABLE = MYQUESTION; } else if (mode == "answer") { hidden_id = C.get_value("answer_id"); value = C.get_value("answer"); TABLE = MYANSWER; } id = mode + "_id"; string tmp(""); int len; len = value.length(); for(int i=0;i<len;i++) { if(value[i] == char(39)) tmp += "\\'"; else tmp += value[i]; } res = db->exec("UPDATE %s SET value = '%s' WHERE %s = %s", TABLE.c_str(), tmp.c_str(), id.c_str(), hidden_id.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't update into table '%s': %s\n\n", TABLE.c_str(), db->errorMessage()); delete res; delete db; exit(0); } /* cout << "Command: <b><br>" << endl; fprintf(stdout, "UPDATE %s SET keys = '%s' WHERE %s = %s", TABLE.c_str(), keys.c_str(), id.c_str(), hidden_id.c_str()); cout << "</b><br></br>\n"; */ if (mode != "topic") { keys = C.get_value("keys"); db->exec(res, "UPDATE %s SET keywords = '%s' WHERE %s = %s", TABLE.c_str(), keys.c_str(), id.c_str(), hidden_id.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't update into table '%s': %s\n\n", TABLE.c_str(), db->errorMessage()); delete res; delete db; exit(0); } } cout << "<b>Data in table \"" << TABLE << "\" updated</b><br></br>\n"; } Pro p; cout << p.back("dbadmin", instance) << endl; cout << h._body() << h._html() << endl; } faq-system-0.3.5/question.cc 100644 764 144 6213 6727307346 14705 0 ustar thomas users #include "conf.h" int main(void) { //int i; char **tuple; Database *db; DBResult *res; db = new Database(); cgi C; C.initPage(); Pro p; string instance; instance = C.get_value("instance"); config CONF(instance); const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* USER; const char* PASS; const char* HOST; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); // Initialise the database - for future releases if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } string stage; string topic_id; topic_id = C.get_value("topic_id"); stage = C.get_value("stage"); HTML h; cout << h.html() << h.body("#ffffff") << endl; if( stage == "prepare" ) { res = db->exec("SELECT value FROM %s WHERE topic_id = '%s'", MYTOPIC, topic_id.c_str()); tuple = res->getTuple(); while (tuple != NULL) { cout << "<h2>" << *(tuple) << "</h2>\n"; tuple = res->getTuple(); } cout << "<form name=ask action=\"" << URL << "/" << ADMIN << "/question.cgi\" method=post>" << endl << h.font("arial","2") << "Enter new question:" << h._font() << "<br></br>" << endl << h.font("arial","2") << "Question:" << h._font() << "<br></br>" << endl << h.textarea("question", "", "8", "60") << "<br></br>" << endl << h.font("arial","2") << "Keywords:" << h._font() << "<br></br>" << endl << h.textarea("keys", "", "4", "30") << "<br></br>" << endl << h.in_hidden("topic_id", topic_id) << endl << "<input type=hidden name=instance value=\"" << instance << "\">\n" << h.in_hidden("stage", "save") << endl << h.in_submit("Save") << h.in_reset("Clear") << endl << h._form() << endl; } else { string ques, ke, question, keys; ques = C.get_value("question"); if( ques == "" ) { cout << h.title("Error!") << "<h2>Value for \"QUESTION\" was empty!</h2>" << endl; } else { ke = C.get_value("keys"); question = p.parse(ques); keys = p.parse(ke); res = db->exec("INSERT INTO %s VALUES(0, %s, '%s', '%s')",MYQUESTION, topic_id.c_str(), question.c_str(), keys.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't insert into table '%s': %s\n\n", MYQUESTION, db->errorMessage()); delete res; delete db; exit(0); } cout << "Data inserted<br></br>\n"; cout << p.back("dbadmin", instance) << endl; } } cout << h._body() << h._html() << endl; delete res; // Drop buffer delete db; // Close connection } faq-system-0.3.5/search.cc 100644 764 144 11675 6727307346 14333 0 ustar thomas users #include "conf.h" int main(void) { //int i; char **tuple; Database *db; DBResult *res; db = new Database(); cgi C; C.initPage(); string instance; instance = C.get_value("instance"); config CONF(instance); const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* USER; const char* PASS; const char* HOST; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); // Initialise the database - for future releases if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } string stage; stage = C.get_value("stage"); // Connect to database on localhost if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } HTML h; cout << h.html() << h.body("ffffff") << endl; if(stage == "prepare") { string url(""); url = string(URL) + "/search.cgi"; cout << "<h2>Search the database</h2>\n" << h.font("arial","2") << endl << "Please enter your search query:\n<br></br>" << h.form( "search", url, "POST") << endl << h.textarea("expression", "", "2", "30") << "<br></br>" << endl << "Select a search method:<br>" << "<input type=radio name=mode value=PHRASE checked> An exact phrase match<br>\n" << "<input type=radio name=mode value=AND> Matches on all words (AND)<br>\n" << "<input type=radio name=mode value=OR> Matches on any word (OR)<br>\n" << "<input type=hidden name=instance value=\"" << instance << "\">\n" << "<br></br>\n" << "<input type=radio name=keymode value=KEY checked> Search only in \"keywords\"<br>\n" << "<input type=radio name=keymode value=ALL> Search the whole database<br>\n" << h.in_submit(" Search ") << endl << h._form() << endl << h._body() << h._html() << endl; } else { string expression, mode, keymode, usemode, tmp(""); expression = C.get_value("expression"); if(expression == "") { cout << "Nothing to search!<br></br>\n"; cout << "<A HREF=\"" << URL << "/search.cgi?instance=" << instance << "&stage=prepare" << "\">[ new search ]</A>\n"; cout << h._body() << h._html(); exit(0); } mode = C.get_value("mode"); keymode = C.get_value("keymode"); int len, count=0; len = expression.length(); tmp = "SELECT DISTINCT question_id from "; tmp += string(MYANSWER) + " WHERE "; if(mode != "PHRASE") { if(keymode == "ALL") tmp += "(value like '%"; else tmp += "keywords like '%"; for(int i=0;i<len;i++) { if(expression[i] == ' ') { if(keymode == "ALL") { tmp += "%') " + mode; tmp += " (value like '%"; } else { tmp += "%' " + mode; tmp += " keywords like '%"; } } else tmp += expression[i]; } if(keymode == "ALL") tmp += "%')"; else tmp += "%'"; } else { if(keymode == "ALL") tmp += "value like '%"; else tmp += "keywords like '%"; tmp += expression + "%'"; } cout << "<h2>Search Results:</h2>"; res = db->exec("%s", tmp.c_str()); tuple = res->getTuple(); while (tuple != NULL) { count++; tuple = res->getTuple(); } cout << "<p>" << h.font("arial","2") << count << " "; if(count <= 1) cout << "match"; else cout << "matches"; cout << " found in database:</p>" << h._font(); cout << "<hr>\n"; int i=0; string answer_id[count+1], question_id[count+1]; db->exec(res, "%s", tmp.c_str()); tuple = res->getTuple(); while (tuple != NULL) { question_id[i] = *(tuple); tuple = res->getTuple(); i++; } // start to output the results: i = 0; for(int c=0; c<count;c++) { db->exec(res, "SELECT value FROM %s WHERE question_id = %s", MYQUESTION, question_id[c].c_str()); tuple = res->getTuple(); while (tuple != NULL) { cout << h.font("arial","2") << "<A HREF=\"" << URL << "/getanswer.cgi?instance=" << instance << "&question_id=" << question_id[c] << "\">" << *(tuple) << "</A><br></br>" << h._font() << endl; tuple = res->getTuple(); } } cout << "<hr>\n"; cout << "<A HREF=\"" << URL << "/search.cgi?instance=" << instance << "&stage=prepare" << "\">[ new search ]</A>\n"; cout << h._body() << endl << h._html(); } delete res; // Drop buffer delete db; // Close connection } faq-system-0.3.5/topic.cc 100644 764 144 4403 6727307346 14153 0 ustar thomas users #include "conf.h" int main(void) { //int i; //char **tuple; Database *db; DBResult *res; db = new Database(); cgi C; C.initPage(); Pro p; string instance; instance = C.get_value("instance"); config CONF(instance); const char* MYDATABASE; const char* MYTOPIC; const char* MYANSWER; const char* MYQUESTION; const char* USER; const char* PASS; const char* HOST; HOST = CONF.HOST.c_str(); USER = CONF.USER.c_str(); PASS = CONF.PASS.c_str(); MYDATABASE = CONF.MYDATABASE.c_str(); MYTOPIC = CONF.MYTOPIC.c_str(); MYANSWER = CONF.MYANSWER.c_str(); MYQUESTION = CONF.MYQUESTION.c_str(); // Initialise the database - for future releases if (db->init() != DB_COMMAND_OK) { fprintf(stdout, "Unable to initialize database: %s\n\n", db->errorMessage()); exit(0); } string topic; string stage; stage = C.get_value("stage"); topic = C.get_value("topic"); HTML h; cout << h.html() << h.body("#ffffff") << endl; if( stage == "prepare" ) { string url; url = string(URL) + "/" + string(ADMIN) + "/topic.cgi"; cout << h.title("Add Topic") << endl << "<h2>Database Instance: " << instance << "</h2>" << endl << h.form( "store", url, "POST") << endl << h.font("arial","2") << "Topic:" << h._font() << "<br></br>" << endl << h.textarea("topic", "", "4", "30") << "<br></br>" << endl << "<input type=hidden name=instance value=\"" << instance << "\">\n" << h.in_submit("Save") << endl << h._form() << endl; } else { // Connect to database on localhost if (db->connect(HOST, "", MYDATABASE, USER, PASS) != DB_CONNECTION_OK) { fprintf(stdout, "Unable connect to database '%s': %s\n\n", MYDATABASE, db->errorMessage()); exit(0); } string tmp(""); tmp = p.parse(topic); res = db->exec("INSERT INTO %s VALUES(0, '%s')",MYTOPIC, tmp.c_str()); if (res->status() != DB_COMMAND_OK) { fprintf(stdout, "Can't insert into table '%s': %s\n\n", MYTOPIC, db->errorMessage()); delete res; delete db; exit(0); } cout << "Data inserted\n" << p.back("dbadmin", instance); } cout << h._body() << h._html() << endl; delete res; // Drop buffer delete db; // Close connection } faq-system-0.3.5/cgi.h 100644 764 144 20641 6727307346 13463 0 ustar thomas users /* Copyright (c) 1998 Thomas Linden. You have my permission to modify, copy, mutilate, or spindle this code as long as you don't use my name to make money. The software comes "as-is" and I cannot make any guarentees that is correct. It is distributed under the terms of the GNU General Public License Portions of this code was developed by Kelly Black at the University of New Hampshire, as these are the routines initPage() and getFormdata(), wich parses the browser input. These routines was taken from his cgiClass.h. Thanks to Kelly. */ #include <ctype.h> #include <string.h> // some c code here... #include <sys/types.h> #include <sys/stat.h> class cgi { public: // constructor cgi(void); // start page. Must be first thing called. // If non-null argument given it will load the // URL given in string. void initPage(char* = NULL); // this subroutine is called, if a new cgi object has been initialized // it starts the routine getFormdata and converts the resuls (char*) to // C++ strings (class string) and stores them in _name[100] and _value[100] // I hope 100 is enough... void get_all(); // the data from the form, a string array of 100 entrys string _name[100]; string _value[100]; int _num; // Environment variables of interest string getRefer(void); string getAgent(void); string getPragma(void); string getAccept(void); string getPath(void); string getPathInfo(void); string getPathTranslated(void); string getServerSoftware(void); string getServerNamer(void); string getServerPort(void); string getRemoteHost(void); string getRemoteAddress(void); string getGateway(void); string getProtocol(void); const char* getRequestMethod(void); string getScriptName(void); const char* getQueryString(void); string getSHLVL(void); string getPWD(void); string getLogName(void); string getUser(void); string getHost(void); string getHostType(void); // Get data from a form. // returns number of fields as well as // character arrays to the fields. The // first argument returns as the data within the // fields and the second argument returns the names // of the fields. void getFormData(char** &,char** &,int &); long getContentLength(void); // returns the value of the specified formelement as string string get_value(const string& form_name); enum Method { GET = 0, POST = 1 }; void turnErrorPrintingOn(void); void turnErrorPrintingOff(void); protected: private: void Error(const char* ,const char* = NULL,const char* = NULL); int outputError; }; // Constructor. Not much to do here but // initialize the variables cgi::cgi(void) { outputError = 1; get_all(); } void cgi::get_all() {
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituiçăo
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (3)
É cada coisa que me aparece! - năo é só 3% (3)
Melhorando a precisăo de valores flutuantes em python[AJUDA] (5)
[Python] Automaçăo de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas ŕs imagens de uma pasta