📄 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 1char 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>" "<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">" "<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() << "\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"userForm\">" "<INPUT TYPE=hidden NAME=\"myself\" VALUE=\"" << con.get("myself") << "\"><SELECT SIZE=20 NAME=\"name\">"; if (persons.select() != 0) { print(con, persons); con << TAG << "</SELECT><BR><INPUT TYPE=submit VALUE=\"Select\">"; } else { con << TAG << EMPTY_LIST; } con << TAG << "</FORM>"; mainMenuReference(con);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -