wwwapi_8h-source.html
来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· HTML 代码 · 共 263 行
HTML
263 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>wwwapi.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.2.15 --><center><a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </center><hr><h1>wwwapi.h</h1><div class="fragment"><pre>00001 <font class="comment">//-< WWWAPI.H >------------------------------------------------------*--------*</font>00002 <font class="comment">// FastDB Version 1.0 (c) 1999 GARRET * ? *</font>00003 <font class="comment">// (Main Memory Database Management System) * /\| *</font>00004 <font class="comment">// * / \ *</font>00005 <font class="comment">// Created: 27-Mar-99 K.A. Knizhnik * / [] \ *</font>00006 <font class="comment">// Last update: 1-Jul-99 K.A. Knizhnik * GARRET *</font>00007 <font class="comment">//-------------------------------------------------------------------*--------*</font>00008 <font class="comment">// API for creating Internet applications </font>00009 <font class="comment">//-------------------------------------------------------------------*--------*</font>00010 00011 <font class="preprocessor">#ifndef __WWWAPI_H__</font>00012 <font class="preprocessor"></font><font class="preprocessor">#define __WWWAPI_H__</font>00013 <font class="preprocessor"></font>00014 <font class="preprocessor">#include "stdtp.h"</font>00015 <font class="preprocessor">#include "sync.h"</font>00016 <font class="preprocessor">#include "sockio.h"</font>00017 <font class="preprocessor">#include "database.h"</font>00018 00019 <font class="keyword">enum</font> WWWencodingType { 00020 TAG = 0, <font class="comment">// HTML tags (no conversion)</font>00021 HTML = 1, <font class="comment">// replace ('<','>','"','&') with (&lt; &gt; &amp; &qout;)</font>00022 URL = 2 <font class="comment">// replace spaces with '+', and other special characters with %XX</font>00023 };00024 <font class="comment">//</font>00025 <font class="comment">// Automatic state shifts after each append operation:</font>00026 <font class="comment">// TAG->HTML</font>00027 <font class="comment">// HTML->TAG</font>00028 <font class="comment">// URL->TAG</font>00029 <font class="comment">//</font>00030 00031 <font class="keyword">class </font>FASTDB_DLL_ENTRY WWWconnection { 00032 <font class="keyword">friend</font> <font class="keyword">class </font>WWWapi;00033 <font class="keyword">friend</font> <font class="keyword">class </font>CGIapi;00034 <font class="keyword">friend</font> <font class="keyword">class </font>QueueManager;00035 <font class="keyword">friend</font> <font class="keyword">class </font>HTTPapi;00036 00037 <font class="keyword">public</font>:00038 <font class="keywordtype">void</font>* userData;00039 <font class="keyword">typedef</font> bool (*handler)(WWWconnection& con);00040 00041 <font class="comment">//</font>00042 <font class="comment">// Append string to reply buffer</font>00043 <font class="comment">//</font>00044 WWWconnection& append(<font class="keywordtype">char</font> <font class="keyword">const</font>* str);00045 00046 WWWconnection& operator << (<font class="keywordtype">char</font> <font class="keyword">const</font>* str) { 00047 <font class="keywordflow">return</font> append(str);00048 }00049 00050 <font class="keywordtype">void</font> setEncoding(WWWencodingType type) { encoding = type; }00051 00052 WWWconnection& operator << (WWWencodingType type) { 00053 setEncoding(type);00054 <font class="keywordflow">return</font> *<font class="keyword">this</font>;00055 }00056 WWWconnection& operator << (<font class="keywordtype">int</font> value) { 00057 <font class="keywordtype">char</font> buf[32];00058 sprintf(buf, <font class="stringliteral">"%d"</font>, value);00059 <font class="keywordflow">return</font> append(buf);00060 }00061 00062 <font class="keywordtype">char</font>* getStub() { <font class="keywordflow">return</font> stub; }00063 00064 <font class="keywordtype">char</font>* getAddress() { <font class="keywordflow">return</font> address; }00065 00066 <font class="keywordtype">char</font>* getPeer() { <font class="keywordflow">return</font> peer; }00067 00068 <font class="comment">//</font>00069 <font class="comment">// Compare content of the string with the end of the reply buffer</font>00070 <font class="comment">//</font>00071 <font class="keywordtype">bool</font> terminatedBy(<font class="keywordtype">char</font> <font class="keyword">const</font>* str) <font class="keyword">const</font>;00072 00073 <font class="comment">//</font>00074 <font class="comment">// Get value of variable from request string. If name is not present in </font>00075 <font class="comment">// string NULL is returned. Parameter 'n' can be used to get n-th</font>00076 <font class="comment">// value of variable for multiple selection slot. Zero value of n </font>00077 <font class="comment">// corresponds to the first variable's value, 1 - to the second,...</font>00078 <font class="comment">// When no more values are available NULL is returned.</font>00079 <font class="comment">//</font>00080 <font class="keywordtype">char</font>* get(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">int</font> n = 0);00081 00082 <font class="comment">//</font>00083 <font class="comment">// Associatte value with name</font>00084 <font class="comment">//</font>00085 <font class="keywordtype">void</font> addPair(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">char</font> <font class="keyword">const</font>* value);00086 00087 WWWconnection();00088 ~WWWconnection();00089 <font class="keyword">protected</font>: 00090 <font class="keyword">enum</font> { hash_table_size = 1013 };00091 socket_t* sock;00092 <font class="keywordtype">char</font>* reply_buf;00093 size_t reply_buf_size;00094 size_t reply_buf_used;00095 <font class="keywordtype">char</font>* stub;00096 <font class="keywordtype">char</font>* address;00097 <font class="keywordtype">char</font>* peer;00098 WWWconnection* next;00099 WWWencodingType encoding;00100 00101 00102 <font class="keyword">struct </font>name_value_pair { 00103 name_value_pair* next;00104 <font class="keywordtype">char</font> <font class="keyword">const</font>* name;00105 <font class="keywordtype">char</font> <font class="keyword">const</font>* value;00106 <font class="keywordtype">unsigned</font> hash_code;00107 };00108 00109 name_value_pair* hash_table[hash_table_size];00110 name_value_pair* free_pairs;00111 00112 <font class="keywordtype">char</font>* extendBuffer(size_t inc);00113 00114 00115 <font class="comment">//</font>00116 <font class="comment">// Deallocate all resources hold by connection. It is not possible to </font>00117 <font class="comment">// call get_value() or reply() method after this. Method reset()</font>00118 <font class="comment">// is implicitly called by WWWapi::get() method.</font>00119 <font class="comment">//</font>00120 <font class="keywordtype">void</font> reset();00121 00122 <font class="comment">//</font>00123 <font class="comment">// Unpack requests paramters</font>00124 <font class="comment">//</font>00125 <font class="keywordtype">char</font>* unpack(<font class="keywordtype">char</font>* body, size_t body_length);00126 };00127 00128 00129 <font class="keyword">class </font>FASTDB_DLL_ENTRY WWWapi { 00130 <font class="keyword">public</font>:00131 <font class="keyword">struct </font>dispatcher { 00132 <font class="keywordtype">char</font> <font class="keyword">const</font>* page;00133 WWWconnection::handler func;00134 <font class="comment">// filled by contracutor of WWWapi</font>00135 <font class="keywordtype">unsigned</font> hash_code;00136 dispatcher* collision_chain;00137 };00138 00139 <font class="keyword">protected</font>:00140 socket_t* sock;00141 <font class="keywordtype">bool</font> canceled;00142 <font class="keywordtype">char</font>* address;00143 <a class="code" href="classdbDatabase.html">dbDatabase</a>& db;00144 <font class="keyword">enum</font> { hash_table_size = 113 };00145 dispatcher* hash_table[hash_table_size];00146 00147 <font class="keywordtype">bool</font> dispatch(WWWconnection& con, <font class="keywordtype">char</font>* page);00148 00149 <font class="keyword">public</font>:00150 WWWapi(<a class="code" href="classdbDatabase.html">dbDatabase</a>& db, <font class="keywordtype">int</font> n_handlers, dispatcher* dispatch_table);00151 00152 <font class="comment">//</font>00153 <font class="comment">// Bind and listen socket</font>00154 <font class="comment">//</font>00155 <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* socket_address = <font class="stringliteral">"localhost:80"</font>, 00156 socket_t::socket_domain domain = socket_t::sock_global_domain, 00157 <font class="keywordtype">int</font> listen_queue = DEFAULT_LISTEN_QUEUE_SIZE);00158 00159 00160 <font class="comment">//</font>00161 <font class="comment">// Read and execute requests</font>00162 <font class="comment">//</font>00163 <font class="keyword">virtual</font> <font class="keywordtype">bool</font> serve(WWWconnection& con) = 0;00164 00165 <font class="comment">//</font>00166 <font class="comment">// Accept new connection by the socket</font>00167 <font class="comment">//</font>00168 <font class="keywordtype">bool</font> connect(WWWconnection& con);00169 00170 <font class="comment">//</font>00171 <font class="comment">// Cancel acception of connections</font>00172 <font class="comment">// </font>00173 <font class="keywordtype">void</font> cancel();00174 00175 <font class="comment">//</font>00176 <font class="comment">// Close socket</font>00177 <font class="comment">// </font>00178 <font class="keywordtype">void</font> close();00179 };00180 00181 00182 <font class="comment">//</font>00183 <font class="comment">// Interaction with WWW server by means of CGI protocol and CGIatub program</font>00184 <font class="comment">//</font>00185 <font class="keyword">class </font>FASTDB_DLL_ENTRY CGIapi : <font class="keyword">public</font> WWWapi { 00186 <font class="keyword">public</font>:00187 <font class="keyword">virtual</font> <font class="keywordtype">bool</font> serve(WWWconnection& con);00188 00189 CGIapi(<a class="code" href="classdbDatabase.html">dbDatabase</a>& db, <font class="keywordtype">int</font> n_handlers, dispatcher* dispatch_table) 00190 : WWWapi(db, n_handlers, dispatch_table) {}00191 };00192 00193 00194 <font class="comment">// </font>00195 <font class="comment">// Built-in implementation of sunset of subset of HTTP protocol</font>00196 <font class="comment">//</font>00197 <font class="keyword">class </font>FASTDB_DLL_ENTRY HTTPapi : <font class="keyword">public</font> WWWapi { 00198 <font class="keyword">protected</font>:00199 time_t connectionHoldTimeout;00200 <font class="keywordtype">bool</font> keepConnectionAlive;00201 00202 <font class="keywordtype">bool</font> handleRequest(WWWconnection& con, <font class="keywordtype">char</font>* begin, <font class="keywordtype">char</font>* end, 00203 <font class="keywordtype">char</font>* host, <font class="keywordtype">bool</font>& result);00204 00205 <font class="keyword">public</font>:00206 <font class="keyword">virtual</font> <font class="keywordtype">bool</font> serve(WWWconnection& con);00207 00208 HTTPapi(<a class="code" href="classdbDatabase.html">dbDatabase</a>& db, <font class="keywordtype">int</font> n_handlers, dispatcher* dispatch_table, 00209 <font class="keywordtype">bool</font> persistentConnections = <font class="keyword">false</font>,00210 time_t connectionHoldTimeoutSec = WAIT_FOREVER) 00211 : WWWapi(db, n_handlers, dispatch_table) 00212 {00213 keepConnectionAlive = persistentConnections;00214 connectionHoldTimeout = connectionHoldTimeoutSec;00215 }00216 };00217 00218 <font class="keyword">class </font>FASTDB_DLL_ENTRY QueueManager { 00219 WWWconnection* connectionPool;00220 WWWconnection* freeList;00221 WWWconnection* waitList;00222 dbMutex mutex;00223 dbLocalSemaphore go;00224 dbLocalEvent done;00225 dbThread* threads;00226 <font class="keywordtype">int</font> nThreads;00227 WWWapi* server;00228 <a class="code" href="classdbDatabase.html">dbDatabase</a>& db;00229 00230 <font class="keyword">static</font> <font class="keywordtype">void</font> thread_proc handleThread(<font class="keywordtype">void</font>* arg);00231 <font class="keywordtype">void</font> handle();00232 00233 <font class="keyword">public</font>:00234 <font class="keywordtype">void</font> stop();00235 <font class="keywordtype">void</font> start();00236 00237 QueueManager(WWWapi& api, <font class="comment">// WWWapi should be opened</font>00238 <a class="code" href="classdbDatabase.html">dbDatabase</a>& db,00239 <font class="keywordtype">int</font> nThreads = 8, 00240 <font class="keywordtype">int</font> connectionQueueLen = 64);00241 ~QueueManager();00242 };00243 00244 00245 <font class="preprocessor">#endif</font>00246 <font class="preprocessor"></font>00247 00248 </pre></div><hr><address align="right"><small>Generated on Fri Nov 15 21:06:29 2002 for FastDB by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.15 </small></address></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?