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> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </center><hr><h1>wwwapi.h</h1><div class="fragment"><pre>00001 <font class="comment">//-&lt; WWWAPI.H &gt;------------------------------------------------------*--------*</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 ('&lt;','&gt;','"','&amp;') with (&amp;lt; &amp;gt; &amp;amp; &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-&gt;HTML</font>00027 <font class="comment">//   HTML-&gt;TAG</font>00028 <font class="comment">//   URL-&gt;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&amp; con);00040 00041     <font class="comment">//</font>00042     <font class="comment">// Append string to reply buffer</font>00043     <font class="comment">//</font>00044     WWWconnection&amp; append(<font class="keywordtype">char</font> <font class="keyword">const</font>* str);00045     00046     WWWconnection&amp; operator &lt;&lt; (<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&amp; operator &lt;&lt; (WWWencodingType type) { 00053         setEncoding(type);00054         <font class="keywordflow">return</font> *<font class="keyword">this</font>;00055     }00056     WWWconnection&amp; operator &lt;&lt; (<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>&amp; 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&amp; con, <font class="keywordtype">char</font>* page);00148 00149   <font class="keyword">public</font>:00150     WWWapi(<a class="code" href="classdbDatabase.html">dbDatabase</a>&amp; 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&amp; 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&amp; 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&amp; con);00188 00189     CGIapi(<a class="code" href="classdbDatabase.html">dbDatabase</a>&amp; 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&amp; 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>&amp; result);00204 00205   <font class="keyword">public</font>:00206     <font class="keyword">virtual</font> <font class="keywordtype">bool</font> serve(WWWconnection&amp; con);00207 00208     HTTPapi(<a class="code" href="classdbDatabase.html">dbDatabase</a>&amp; 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>&amp;      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&amp; api, <font class="comment">// WWWapi should be opened</font>00238                  <a class="code" href="classdbDatabase.html">dbDatabase</a>&amp; 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 + -
显示快捷键?