📄 bugdb.cpp
字号:
//-< BUGDB.CPP >----------------------------------------------------*--------*
// FastDB Version 1.0 (c) 1999 GARRET * ? *
// (Main Memory Database Management System) * /\| *
// * / \ *
// Created: 27-Mar-99 K.A. Knizhnik * / [] \ *
// Last update: 30-Jun-99 K.A. Knizhnik * GARRET *
//-------------------------------------------------------------------*--------*
// Example of database Web publishing: Bug Tracking Database
//-------------------------------------------------------------------*--------*
#include "bugdb.h"
//#define USE_EXTERNAL_HTTP_SERVER 1
char const* const eCATEGORY_STRING[] =
{
"",
"CRASH",
"PROGRAM_HANGS",
"UI_DISPLAY",
"UI_BEHAVIOR",
"CALCULATION",
"ERROR_HANDLING",
"PERFORMANCE",
"LICENSING",
"INSTALLATION",
"DOCUMENTATION",
"ENHANCEMENT",
"HOW_TO_QUESTION",
NULL
};
char const* const eSTATUS_STRING[] = {
"",
"OPENED",
"FIXED",
"CLOSED",
"PENDING_ENGINEER",
"PENDING_USER",
"POSTPONED",
"IRREPRODUCIBLE",
"WITHDRAWN",
"AS_DESIGNED",
NULL
};
char const* const eSEVERITY_STRING[] = {
"",
"FATAL",
"SERIOUS",
"MINOR",
NULL
};
char const* const eFIXING_PRIORITY_STRING[] = {
"",
"FIX_IMMEDIATELY",
"FIX_BEFORE_NEXT_BUILD_RELEASE",
"FIX_BEFORE_NEXT_MINOR_RELEASE",
"FIX_BEFORE_NEXT_MAJOR_RELEASE",
"FIX_IF_POSSIBLE",
"OPTIONAL",
NULL
};
dbDatabase db;
dbCursor<Bug> allBugs;
dbCursor<Bug> bugs(dbCursorForUpdate);
dbCursor<Report> reports(dbCursorForUpdate);
dbCursor<Person> persons(dbCursorForUpdate);
dbCursor<Software> products(dbCursorForUpdate);
dbCursor<Version> versions(dbCursorForUpdate);
dbCursor<BugSequencer> sequencer(dbCursorForUpdate);
dbQuery qBug;
dbQuery qReport;
dbQuery qAllReports;
dbQuery qVersion;
dbQuery qAllVersions;
dbQuery qPerson;
dbQuery qSoftware;
//
// Query paramters
//
char* key;
int bugId;
int reportId;
dbReference<Report> firstReport;
dbReference<Version> initialVersion;
int majorVersion;
int minorVersion;
//- Person ------------------------------------------------
void Person::print(WWWconnection& con) const
{
con << TAG << "<OPTION VALUE=\"" << sName << "\">" << sName << "</OPTION>";
}
REGISTER(Person);
//------- Version ---------------------------------------
void Version::print(WWWconnection& con) const
{
char buf[64];
con << TAG << "<OPTION VALUE=\"" << getVersionString() <<
"\">Version " << getVersionString() << " " << sLabel <<
" " << released.asString(buf, sizeof buf) << "</OPTION>";
}
int Version::getVersion() const
{
return majorVersionNumber*100 + minorVersionNumber;
}
char* Version::getVersionString() const
{
static char buf[16];
sprintf(buf, "%d.%02d", majorVersionNumber, minorVersionNumber);
return buf;
}
REGISTER(Version);
//----- Software -------------------------------------
int Software::getLastVersion() const
{
if (pVersions == null) {
return 0;
}
versions.at(pVersions);
return versions->getVersion();
}
char* Software::getLastVersionString() const
{
if (pVersions == null) {
return "";
}
versions.at(pVersions);
return versions->getVersionString();
}
void Software::print(WWWconnection& con) const
{
con << TAG << "<OPTION VALUE=\"" << sName << "\">" << sName << "</OPTION>";
}
REGISTER(Software);
//----- Report -------------------------------------------
void Report::print(WWWconnection& con) const
{
char buf[64];
if (pAuthor != null) {
persons.at(pAuthor);
con << TAG << "<OPTION VALUE=" << index << ">" << persons->sName << " "
<< creationDate.asString(buf, sizeof buf) << "</OPTION>";
} else {
con << TAG << "<OPTION VALUE=" << index << ">" << "Report from "
<< creationDate.asString(buf, sizeof buf) << "</OPTION>";
}
}
REGISTER(Report);
//--- Bug -----------------------------------------
void Bug::print(WWWconnection& con) const
{
con << TAG << "<OPTION VALUE=" << bugId << ">" << sOneLineSummary
<< "</OPTION>";
}
REGISTER(Bug);
//---- BugSequencer -------------------------------------
REGISTER(BugSequencer);
template<class T>
void print(WWWconnection& con, dbCursor<T>& cursor) {
do {
cursor->print(con);
} while(cursor.next());
}
template<class T>
void print(WWWconnection& con, dbArray<dbReference<T> > const& arr) {
dbCursor<T> cursor;
for (int i = 0, n = arr.length(); i < n; i++) {
cursor.at(arr[i])->print(con);
}
}
//--- HTML specific part -------------------------------------------
#define HTML_HEAD "Content-type: text/html\r\n\r\n\
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\"><HTML><HEAD>"
#define BODY "<BODY BGCOLOR=\"#c0c0c0\">"
#define EMPTY_LIST "<OPTION> </OPTION></SELECT>"
void mainMenuReference(WWWconnection& con)
{
char* myself = con.get("myself");
if (myself != NULL) {
con << TAG
<< "<P><HR><CENTER><A HREF=\"" << con.getStub() << "?socket="
<< con.getAddress() << "&page=userForm&myself="
<< URL << myself << "&name=" << URL << myself
<< "\">Back to main menu</A></CENTER>";
}
con << TAG << "</BODY></HTML>";
}
void error(WWWconnection& con, char const* msg)
{
con << TAG <<
HTML_HEAD "<TITLE>BUGDB error</TITLE></HEAD><BODY>"
"<H1><FONT COLOR=\"#FF0000\">"
<< msg << "</FONT></H1></BODY></HTML>";
mainMenuReference(con);
}
void message(WWWconnection& con, char const* msg)
{
con << TAG <<
HTML_HEAD "<TITLE>BUGDB message</TITLE></HEAD><BODY>"
"<H1><FONT COLOR=\"#004000\">"
<< msg << "</FONT></H1></BODY></HTML>";
mainMenuReference(con);
}
bool addUserForm(WWWconnection& con)
{
con << TAG <<
HTML_HEAD "<TITLE>Enter new user</TITLE></HEAD>"
BODY
"<H2>Add user</H2>"
"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() <<
"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"addUser\">"
"<INPUT TYPE=hidden NAME=\"myself\" VALUE=\"" << con.get("myself") <<
"\"><TABLE>"
"<TR><TH ALIGN=LEFT>User name:</TH>"
"<TD><INPUT TYPE=text NAME=\"name\" SIZE=30</TD></TR>"
"<TR><TH ALIGN=LEFT>E-mail:</TH>"
"<TD><INPUT TYPE=text NAME=\"email\" SIZE=30 </TD></TR></TABLE><P>"
"<INPUT TYPE=submit VALUE=\"Add\"> "
"<INPUT TYPE=reset VALUE=\"Reset\"></FORM>";
mainMenuReference(con);
return true;
}
bool addEngineerForm(WWWconnection& con)
{
con << TAG <<
HTML_HEAD "<TITLE>Enter new engineer</TITLE></HEAD>"
BODY
"<H2>Add engineer</H2>"
"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() <<
"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"addEngineer\">"
"<INPUT TYPE=hidden NAME=\"myself\" VALUE=\"" << con.get("myself") <<
"\"><TABLE>"
"<TR><TH ALIGN=LEFT>Engineer name:</TH>"
"<TD><INPUT TYPE=text NAME=\"name\" SIZE=30</TD></TR>"
"<TR><TH ALIGN=LEFT>E-mail:</TH>"
"<TD><INPUT TYPE=text NAME=\"email\" SIZE=30 </TD></TR></TABLE><P>"
"<INPUT TYPE=submit VALUE=\"Add\"> "
"<INPUT TYPE=reset VALUE=\"Reset\"></FORM>";
mainMenuReference(con);
return true;
}
bool addSoftwareForm(WWWconnection& con)
{
con << TAG <<
HTML_HEAD "<TITLE>Enter new software product</TITLE></HEAD>"
BODY
"<H2>Add software product</H2>"
"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() <<
"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"addSoftware\">"
"<INPUT TYPE=hidden NAME=\"myself\" VALUE=\"" << con.get("myself") <<
"\"><TABLE>"
"<TR><TH ALIGN=LEFT>Software name:</TH>"
"<TD><INPUT TYPE=text NAME=\"software\" SIZE=40</TD></TR>"
"<TR><TH ALIGN=LEFT>Version number:</TH>"
"<TD><INPUT TYPE=text NAME=\"version\" SIZE=8</TD></TR>"
"<TR><TH ALIGN=LEFT>Version label:</TH>"
"<TD><INPUT TYPE=text NAME=\"label\" SIZE=20</TD></TR>"
"<TR><TH ALIGN=LEFT>Version comment:</TH>"
"<TD><INPUT TYPE=text NAME=\"comment\" SIZE=40</TD></TR>"
"</TABLE><P><INPUT TYPE=submit VALUE=\"Add\"> "
"<INPUT TYPE=reset VALUE=\"Reset\"></FORM>";
mainMenuReference(con);
return true;
}
bool selectSoftwareForm(WWWconnection& con)
{
con << TAG <<
HTML_HEAD "<TITLE>Select software product</TITLE></HEAD>"
BODY
"<H2>Select software product</H2>"
"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() <<
"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"softwareForm\">"
"<INPUT TYPE=hidden NAME=\"myself\" VALUE=\"" << con.get("myself") <<
"\"><SELECT SIZE=15 NAME=\"software\">";
if (products.select() > 0) {
print(con, products);
con << TAG <<
"</SELECT><BR><INPUT TYPE=submit NAME=\"action\" VALUE=\"Select\">";
} else {
con << TAG << EMPTY_LIST;
}
con << TAG << "</FORM>";
mainMenuReference(con);
return true;
}
bool removeSoftwareForm(WWWconnection& con)
{
con << TAG <<
HTML_HEAD "<TITLE>Remove software product</TITLE></HEAD>"
BODY
"<H2>Remove software product</H2>"
"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() <<
"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"removeSoftware\">"
"<INPUT TYPE=hidden NAME=\"myself\" VALUE=\"" << con.get("myself") <<
"\"><SELECT SIZE=15 NAME=\"software\">";
if (products.select() != 0) {
print(con, products);
con << TAG << "</SELECT><BR><INPUT TYPE=\"submit\" VALUE=\"Remove\">";
} else {
con << TAG << EMPTY_LIST;
}
con << TAG << "</FORM>";
mainMenuReference(con);
return true;
}
bool selectPersonForm(WWWconnection& con)
{
con << TAG <<
HTML_HEAD "<TITLE>Select a person</TITLE></HEAD>"
BODY
"<H2>Select a person</H2>"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -