Main Page | Class Hierarchy | Class List | File List | Class Members

cliproto.h

00001 //-< CLIPROTO.H >----------------------------------------------------*--------*
00002 // FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
00003 // (Main Memory Database Management System)                          *   /\|  *
00004 //                                                                   *  /  \  *
00005 //                          Created:     13-Jan-2000  K.A. Knizhnik  * / [] \ *
00006 //                          Last update: 13-Jan-2000  K.A. Knizhnik  * GARRET *
00007 //-------------------------------------------------------------------*--------*
00008 // Client-server communication protocol
00009 //-------------------------------------------------------------------*--------*
00010 
00011 #ifndef __CLIPROTO_H__
00012 #define __CLIPROTO_H__
00013 
00014 enum cli_commands { 
00015     cli_cmd_close_session, 
00016     cli_cmd_prepare_and_execute,
00017     cli_cmd_execute,
00018     cli_cmd_get_first, 
00019     cli_cmd_get_last, 
00020     cli_cmd_get_next,
00021     cli_cmd_get_prev,
00022     cli_cmd_free_statement,
00023     cli_cmd_abort,
00024     cli_cmd_commit,
00025     cli_cmd_update,
00026     cli_cmd_remove,
00027     cli_cmd_insert,
00028     cli_cmd_prepare_and_insert,
00029     cli_cmd_describe_table,
00030     cli_cmd_show_tables,
00031     cli_cmd_precommit,
00032     cli_cmd_skip,
00033     cli_cmd_create_table,
00034     cli_cmd_drop_table,
00035     cli_cmd_alter_index,
00036     cli_cmd_freeze,
00037     cli_cmd_unfreeze,
00038     cli_cmd_seek,
00039     cli_cmd_alter_table,
00040     cli_cmd_last
00041 };
00042 
00043 static const int sizeof_type[] = { 
00044     sizeof(cli_oid_t), 
00045     sizeof(cli_bool_t), 
00046     sizeof(cli_int1_t), 
00047     sizeof(cli_int2_t), 
00048     sizeof(cli_int4_t), 
00049     sizeof(cli_int8_t), 
00050     sizeof(cli_real4_t), 
00051     sizeof(cli_real8_t),
00052     sizeof(cli_real8_t), // cli_decimal
00053     sizeof(char*), // cli_asciiz, 
00054     sizeof(char*), // cli_pasciiz,
00055     sizeof(char*), // cli_cstring,
00056     sizeof(cli_array_t), // cli_array_of_oid,
00057     sizeof(cli_array_t), // cli_array_of_bool,
00058     sizeof(cli_array_t), // cli_array_of_int1,
00059     sizeof(cli_array_t), // cli_array_of_int2,
00060     sizeof(cli_array_t), // cli_array_of_int4,
00061     sizeof(cli_array_t), // cli_array_of_int8,
00062     sizeof(cli_array_t), // cli_array_of_real4,
00063     sizeof(cli_array_t), // cli_array_of_real8, 
00064     sizeof(cli_array_t), // cli_array_of_decimal, 
00065     sizeof(cli_array_t), // cli_array_of_string,
00066     0, // cli_any,
00067     sizeof(cli_int8_t), // cli_datetime,
00068     sizeof(cli_int4_t), // cli_autoincrement,
00069     0, // cli_rectangle,
00070     0  // cli_unknown
00071 };
00072 
00073 static const int fd2cli_type_mapping[] = {
00074     cli_bool,
00075     cli_int1,
00076     cli_int2,
00077     cli_int4,
00078     cli_int8,
00079     cli_real4,
00080     cli_real8,
00081     cli_asciiz,
00082     cli_oid
00083 };
00084 
00085 #if defined(__FreeBSD__)
00086 #include <sys/param.h>
00087 #include <netinet/in.h>
00088 #define USE_HTON_NTOH
00089 #elif defined(__linux__)
00090 //
00091 // At Linux inline assembly declarations of ntohl, htonl... are available
00092 //
00093 #include <netinet/in.h>
00094 #define USE_HTON_NTOH
00095 #else
00096 #if defined(_WIN32) && _M_IX86 >= 400
00097 #pragma warning(disable:4035) // disable "no return" warning
00098 #ifdef __BORLANDC__
00099 static
00100 #else
00101 inline 
00102 #endif
00103 int swap_bytes_in_dword(int val) {
00104     __asm {
00105           mov eax, val
00106           bswap eax
00107     }
00108 }
00109 #ifdef __BORLANDC__
00110 static
00111 #else
00112 inline 
00113 #endif
00114 short swap_bytes_in_word(short val) {
00115     __asm {
00116           mov ax, val
00117           xchg al,ah
00118     }
00119 }
00120 #pragma warning(default:4035)
00121 #define ntohl(w) swap_bytes_in_dword(w)
00122 #define htonl(w) swap_bytes_in_dword(w)
00123 #define ntohs(w) swap_bytes_in_word(w)
00124 #define htons(w) swap_bytes_in_word(w)
00125 
00126 #define USE_HTON_NTOH
00127 #endif
00128 #endif
00129 
00130 
00131 
00132 
00133 inline char* pack2(char* dst, int2 val) { 
00134     *dst++ = char(val >> 8);
00135     *dst++ = char(val);     
00136     return dst;
00137 }
00138 
00139 inline char* pack2(char* dst, char* src) { 
00140     return pack2(dst, *(int2*)src); 
00141 }
00142 
00143 inline void pack2(int2& val) { 
00144 #if BYTE_ORDER != BIG_ENDIAN
00145 #ifdef USE_HTON_NTOH
00146     val = htons(val);
00147 #else
00148     pack2((char*)&val, val); 
00149 #endif
00150 #endif
00151 }
00152 
00153 
00154 inline char* pack4(char* dst, int4 val) { 
00155     *dst++ = char(val >> 24);
00156     *dst++ = char(val >> 16);     
00157     *dst++ = char(val >> 8); 
00158     *dst++ = char(val);
00159     return dst;
00160 }
00161 
00162 inline char* pack4(char* dst, char* src) { 
00163     return pack4(dst, *(int4*)src); 
00164 }
00165 
00166 inline void pack4(int4& val) { 
00167 #if BYTE_ORDER != BIG_ENDIAN
00168 #ifdef USE_HTON_NTOH
00169     val = htonl(val);
00170 #else
00171     pack4((char*)&val, val); 
00172 #endif
00173 #endif
00174 }
00175 
00176 
00177 inline char* pack8(char* dst, char* src) { 
00178 #if BYTE_ORDER == BIG_ENDIAN
00179     return pack4( pack4(dst, src), src + 4);
00180 #else
00181     return pack4( pack4(dst, src + 4), src);
00182 #endif
00183 }
00184 
00185 inline char* pack8(char* dst, db_int8 val) { 
00186     return pack8(dst, (char*)&val);
00187 }
00188 
00189 inline char* pack_oid(char* dst, cli_oid_t oid)
00190 {
00191     return (sizeof(oid) == 4) ? pack4(dst, oid) : pack8(dst, (char*)&oid);
00192 }
00193 
00194 inline int2 unpack2(char* src) { 
00195     nat1* s = (nat1*)src;
00196     return (s[0] << 8) + s[1]; 
00197 }
00198 
00199 inline char* unpack2(char* dst, char* src) { 
00200     *(int2*)dst = unpack2(src);
00201     return src + 2;
00202 }
00203 
00204 inline void  unpack2(int2& val) { 
00205 #if BYTE_ORDER != BIG_ENDIAN
00206 #ifdef USE_HTON_NTOH
00207     val = ntohs(val);
00208 #else
00209     val = unpack2((char*)&val); 
00210 #endif
00211 #endif
00212 }
00213 
00214 
00215 inline int4  unpack4(char* src) { 
00216     nat1* s = (nat1*)src;
00217     return (((((s[0] << 8) + s[1]) << 8) + s[2]) << 8) + s[3];
00218 } 
00219 
00220 inline char* unpack4(char* dst, char* src) { 
00221     *(int4*)dst = unpack4(src);
00222     return src + 4;
00223 }
00224 
00225 inline void unpack4(int4& val) { 
00226 #if BYTE_ORDER != BIG_ENDIAN
00227 #ifdef USE_HTON_NTOH
00228     val = ntohl(val);
00229 #else
00230     val = unpack4((char*)&val); 
00231 #endif
00232 #endif
00233 }
00234 
00235 inline char* unpack8(char* dst, char* src) { 
00236 #if BYTE_ORDER == BIG_ENDIAN
00237     *(int4*)dst = unpack4(src);
00238     *((int4*)dst+1) = unpack4(src+4);
00239 #else
00240     *(int4*)dst = unpack4(src+4);
00241     *((int4*)dst+1) = unpack4(src);
00242 #endif
00243     return src + 8;
00244 }
00245 
00246 inline db_int8 unpack8(char* src) { 
00247     db_int8 val;
00248     unpack8((char*)&val, src);
00249     return val;
00250 }
00251 
00252 inline cli_oid_t unpack_oid(char* src)
00253 {
00254     cli_oid_t oid;
00255     if (sizeof(oid) == 4) {
00256         oid = unpack4(src);
00257     } else { 
00258         unpack8((char*)&oid, src);
00259     }
00260     return oid;
00261 }
00262 
00263 struct cli_request { 
00264     int4 length;
00265     int4 cmd;
00266     int4 stmt_id;
00267     
00268     void pack() { 
00269         pack4(length);
00270         pack4(cmd);
00271         pack4(stmt_id);
00272     }
00273 
00274     void unpack() { 
00275         unpack4(length);
00276         unpack4(cmd);
00277         unpack4(stmt_id);
00278     }
00279 };
00280 
00281 #endif

Generated on Thu Feb 12 13:04:48 2004 for FastDB by doxygen 1.3.5