⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bugdb.cpp

📁 最新版本!fastdb是高效的内存数据库系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//-< 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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\">&nbsp;"
        "<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\">&nbsp;"
        "<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\">&nbsp;"
        "<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 + -