📄 clidb.cpp
字号:
//-< 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> </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\"> " "<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\"> " "<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\"> " "<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\"> " "<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\"> " "<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 + -