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

📄 clidb.cpp

📁 实现内存数据库的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//-< CLIDB.CPP >-----------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:      7-Nov-99    K.A. Knizhnik  * / [] \ *
//                          Last update:  7-Nov-99    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Example of Web database publishing: Clients Database
//-------------------------------------------------------------------*--------*

#include "clidb.h"

dbDatabase db;

//- Client ------------------------------------------------

void Client::print(WWWconnection& con) const 
{ 
    con << TAG << "<OPTION VALUE=" << clientId << ">" << organization 
	<< "</OPTION>";
}
    
REGISTER(Client);


//- Manager ------------------------------------------------

bool Manager::loginFromAnyHost;

void Manager::print(WWWconnection& con) const 
{ 
    con << TAG << "<OPTION VALUE=\"" << name << "\">" << name 
	<< "</OPTION>";
}
    
REGISTER(Manager);

//- Segment ------------------------------------------------

void Segment::print(WWWconnection& con) const 
{ 
    con << TAG << "<OPTION VALUE=\"" << name << "\">" << name 
	<< "</OPTION>";
}
    
REGISTER(Segment);

//- History ------------------------------------------------

void History::print(WWWconnection& con) const 
{     
    ThreadContext& the = ThreadContext::of(con);
    char buf[64];
    
    con << TAG << "<OPTION VALUE=" << messageId << ">"  
	<< date.asString(buf, sizeof buf)
	<< " " << (the.managerForm 
		   ? the.clients.at(client)->organization 
		   : manager != null ? the.managers.at(manager)->name : "")
	<< "</OPTION>";
}
    
REGISTER(History);

//---- ClientSequencer -------------------------------------

REGISTER(Sequencer);


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);
    } 
}

//---- Thread Context --------------------------------------------------

ThreadContext& ThreadContext::of(WWWconnection& con)
{
    if (con.userData == NULL) { 
	con.userData = new ThreadContext;
    }
    return *(ThreadContext*)con.userData;
}

ThreadContext::ThreadContext() 
{
    qClient = "clientId=",clientId;
    qManager = "name=",&name;
    qClients = "start from",clientsArray,"order by organization";
    qManagers = "start from",managersArray,"order by name";
    qSegment = "name=",&name;
    qMessage = "messageId=",messageId;
    qMessages = "start from",messagesArray,
	        "order by",dbDateTime::descent("date");
}

//--- 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><BR>"

void mainMenuReference(WWWconnection& con)
{
    char* manager = con.get("manager");
    if (manager != NULL) { 
	con << TAG 
	    << "<P><HR><CENTER><A HREF=\"" << con.getStub() << "?socket=" 
	    << con.getAddress() << "&page=managerForm&manager=" 
	    << URL << manager << "\">Back to main menu</A></CENTER>";
    }
    con << TAG << "</BODY></HTML>";
}

bool error(WWWconnection& con, char const* msg)
{
    con << TAG << 
	HTML_HEAD "<TITLE>ClientDB error</TITLE></HEAD><BODY>"
	"<H1><FONT COLOR=\"#FF0000\">"
	<< msg << "</FONT></H1></BODY></HTML>";
    mainMenuReference(con);
    return true;
}



bool addManagerForm(WWWconnection& con)
{
    con << TAG << 
	HTML_HEAD "<TITLE>Add new manager</TITLE></HEAD>"
	BODY
	"<H2>Add manager</H2>"
	"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
	"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() << 
	"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"addManager\">"
	"<INPUT TYPE=hidden NAME=\"manager\" VALUE=\"" << con.get("manager") <<
	"\">"
	"<INPUT TYPE=hidden NAME=\"segment\" VALUE=\"" << con.get("segment") <<
	"\"><TABLE>"
	"<TR><TH ALIGN=LEFT>Manager name</TH>"
	"<TD><INPUT TYPE=text NAME=\"name\" SIZE=30></TD></TR>"
	"<TR><TH ALIGN=LEFT>Host IP address</TH>"
	"<TD><INPUT TYPE=text NAME=\"ipaddr\" SIZE=16 VALUE=\"*\"></TD></TR>"
	"<TR><TH ALIGN=LEFT>Administrator rights</TH>"
	"<TD><INPUT TYPE=CHECKBOX NAME=\"miniadmin\" VALUE=\"on\"></TD></TR>"
	"</TABLE>"
	"<INPUT TYPE=submit VALUE=\"Add\">&nbsp;"
	"<INPUT TYPE=reset VALUE=\"Reset\"></FORM>";
    mainMenuReference(con);
    return true;
}

bool addClientForm(WWWconnection& con)
{
    con << TAG << 
	HTML_HEAD "<TITLE>Add new client</TITLE></HEAD>"
	BODY
	"<H2>Add client</H2>"
	"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
	"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() << 
	"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"addClient\">"
	"<INPUT TYPE=hidden NAME=\"manager\" VALUE=\"" << con.get("manager") <<
	"\">"
	"<INPUT TYPE=hidden NAME=\"segment\" VALUE=\"" << con.get("segment") <<
	"\"><TABLE>"
	"<TR><TH ALIGN=LEFT>Organization</TH>"
	"<TD><INPUT TYPE=text NAME=\"organization\" SIZE=40></TD></TR>"
	"<TR><TH ALIGN=LEFT>Phone</TH>"
	"<TD><INPUT TYPE=text NAME=\"phone\" SIZE=20></TD></TR>"
	"<TR><TH ALIGN=LEFT>Phone2</TH>"
	"<TD><INPUT TYPE=text NAME=\"phone2\" SIZE=20></TD></TR>"
	"<TR><TH ALIGN=LEFT>Fax</TH>"
	"<TD><INPUT TYPE=text NAME=\"fax\" SIZE=20></TD></TR>"
	"<TR><TH ALIGN=LEFT>E-Mail</TH>"
	"<TD><INPUT TYPE=text NAME=\"email\" SIZE=30></TD></TR>"
	"<TR><TH ALIGN=LEFT>WWW address</TH>"
	"<TD><INPUT TYPE=text NAME=\"www\" SIZE=30></TD></TR>"
	"<TR><TH ALIGN=LEFT>Person</TH>"
	"<TD><INPUT TYPE=text NAME=\"person\" SIZE=40></TD></TR>"
	"<TR><TH ALIGN=LEFT>Person2</TH>"
	"<TD><INPUT TYPE=text NAME=\"person2\" SIZE=40></TD></TR>"
	"<TR><TH ALIGN=LEFT>CEO</TH>"
	"<TD><INPUT TYPE=text NAME=\"lpr\" SIZE=40></TD></TR>"
	"<TR><TH ALIGN=LEFT>Address</TH>"
	"<TD><INPUT TYPE=text NAME=\"addr\" SIZE=40></TD></TR>"
	"<TR><TH ALIGN=LEFT>Information</TH>"
	"<TD><INPUT TYPE=text NAME=\"info\" SIZE=40></TD></TR>"
	"<TR><TH ALIGN=LEFT>Status</TH>"
	"<TD><INPUT TYPE=text NAME=\"status\" SIZE=40></TD></TR>"
	"</TABLE><INPUT TYPE=submit VALUE=\"Add\">&nbsp;"
	"<INPUT TYPE=reset VALUE=\"Reset\"></FORM>";
    mainMenuReference(con);
    return true;
}


bool addSegmentForm(WWWconnection& con)
{
    con << TAG << 
	HTML_HEAD "<TITLE>Add new segment</TITLE></HEAD>"
	BODY
	"<H2>Add segment</H2>"
	"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
	"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() << 
	"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"addSegment\">"
	"<INPUT TYPE=hidden NAME=\"manager\" VALUE=\"" << con.get("manager") <<
	"\"><TABLE>"
	"<TR><TH ALIGN=LEFT>Segment name </TH>"
	"<TD><INPUT TYPE=text NAME=\"name\" SIZE=30></TD></TR>"
	"</TD></TR></TABLE><P>"
	"<INPUT TYPE=submit VALUE=\"Add\">&nbsp;"
	"<INPUT TYPE=reset VALUE=\"Reset\"></FORM>";
    mainMenuReference(con);
    return true;
}

bool addHistoryForm(WWWconnection& con)
{
    con << TAG << 
	HTML_HEAD "<TITLE>Add message</TITLE></HEAD>"
	BODY
	"<H2>Add message</H2>"
	"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
	"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() << 
	"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"addHistory\">"
	"<INPUT TYPE=hidden NAME=\"manager\" VALUE=\"" << con.get("manager") <<
	"\"><INPUT TYPE=hidden NAME=\"client\" VALUE=" << con.get("client") <<
	"\"><TEXTAREA NAME=\"message\" ROWS=10 COLS=60></TEXTAREA><P>"
	"<INPUT TYPE=submit VALUE=\"Add\">&nbsp;"
	"<INPUT TYPE=reset VALUE=\"Reset\"></FORM>";
    mainMenuReference(con);
    return true;
}


bool editManagerForm(WWWconnection& con)
{
    if (con.get("new")) { 
	return addManagerForm(con);
    }
    ThreadContext& the = ThreadContext::of(con);
    the.name = con.get("name");
    if (the.name == NULL) { 
	return error(con, "No manager was selected");
    }
    if (the.managers.select(the.qManager) == 0) { 
	return error(con, "No such manager");
    }
    
    con << TAG << 
	HTML_HEAD "<TITLE>Edit manager form</TITLE></HEAD>"
	BODY
	"<H2>Update manager</H2>"
	"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
	"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() << 
	"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"editManager\">"
	"<INPUT TYPE=hidden NAME=\"manager\" VALUE=\"" << con.get("manager") <<
	"\"><INPUT TYPE=hidden NAME=\"oldName\" VALUE=\"" << the.name << "\">"
	"<TABLE><TR><TH ALIGN=LEFT>Manager name</TH>"
	"<TD><INPUT TYPE=text NAME=\"name\" SIZE=30 VALUE=\"" 
        << the.managers->name << "\"></TD></TR>"
	"<TR><TH ALIGN=LEFT>Host IP address</TH>"
	"<TD><INPUT TYPE=text NAME=\"ipaddr\" SIZE=16 VALUE=\""
	<< the.managers->IPaddr << "\"</TD></TR>"
	"<TR><TH ALIGN=LEFT>Administrator rights</TH>"
	"<TD><INPUT TYPE=CHECKBOX NAME=\"miniadmin\" VALUE=\"on\""
	<< ((the.managers->flags & Manager::isMinAdmin)
	    ? "CHECKED" : "") << "></TD></TR></TABLE>"
	"<INPUT TYPE=submit NAME=\"action\" VALUE=\"Update\">&nbsp;"
	"<INPUT TYPE=submit NAME=\"action\" VALUE=\"Remove\"></FORM><P>"
	"<FORM METHOD=POST ACTION=\"" << con.getStub() << "\">"
	"<INPUT TYPE=HIDDEN NAME=\"socket\" VALUE=\"" << con.getAddress() << 
	"\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"editHistoryForm\">"
	"<INPUT TYPE=hidden NAME=\"manager\" VALUE=\"" << con.get("manager") <<
	"\"><SELECT NAME=\"messageId\" SIZE=15>";
    the.managerForm = true;
    if (the.managers->messages.length() != 0) { 
	print(con, the.managers->messages);
	con << TAG << 
	    "</SELECT><BR><INPUT TYPE=submit NAME=\"action\" VALUE=\"Select\"></FORM>";
    } else { 
	con << TAG << EMPTY_LIST "</FORM>";
    }
    mainMenuReference(con);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -