Main Page   Class Hierarchy   Compound List   File List   Compound 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 BEGIN_FASTDB_NAMESPACE
00015 
00016 enum cli_commands { 
00017     cli_cmd_close_session, 
00018     cli_cmd_prepare_and_execute,
00019     cli_cmd_execute,
00020     cli_cmd_get_first, 
00021     cli_cmd_get_last, 
00022     cli_cmd_get_next,
00023     cli_cmd_get_prev,
00024     cli_cmd_free_statement,
00025     cli_cmd_abort,
00026     cli_cmd_commit,
00027     cli_cmd_update,
00028     cli_cmd_remove,
00029     cli_cmd_remove_current,
00030     cli_cmd_insert,
00031     cli_cmd_prepare_and_insert,
00032     cli_cmd_describe_table,
00033     cli_cmd_show_tables,
00034     cli_cmd_precommit,
00035     cli_cmd_skip,
00036     cli_cmd_create_table,
00037     cli_cmd_drop_table,
00038     cli_cmd_alter_index,
00039     cli_cmd_freeze,
00040     cli_cmd_unfreeze,
00041     cli_cmd_seek,
00042     cli_cmd_alter_table,
00043     cli_cmd_last
00044 };
00045 
00046 static const int sizeof_type[] = { 
00047     sizeof(cli_oid_t), 
00048     sizeof(cli_bool_t), 
00049     sizeof(cli_int1_t), 
00050     sizeof(cli_int2_t), 
00051     sizeof(cli_int4_t), 
00052     sizeof(cli_int8_t), 
00053     sizeof(cli_real4_t), 
00054     sizeof(cli_real8_t),
00055     sizeof(cli_real8_t), // cli_decimal
00056     sizeof(char*), // cli_asciiz, 
00057     sizeof(char*), // cli_pasciiz,
00058     sizeof(char*), // cli_cstring,
00059     sizeof(cli_array_t), // cli_array_of_oid,
00060     sizeof(cli_array_t), // cli_array_of_bool,
00061     sizeof(cli_array_t), // cli_array_of_int1,
00062     sizeof(cli_array_t), // cli_array_of_int2,
00063     sizeof(cli_array_t), // cli_array_of_int4,
00064     sizeof(cli_array_t), // cli_array_of_int8,
00065     sizeof(cli_array_t), // cli_array_of_real4,
00066     sizeof(cli_array_t), // cli_array_of_real8, 
00067     sizeof(cli_array_t), // cli_array_of_decimal, 
00068     sizeof(cli_array_t), // cli_array_of_string,
00069     0, // cli_any,
00070     sizeof(cli_int8_t), // cli_datetime,
00071     sizeof(cli_int4_t), // cli_autoincrement,
00072     sizeof(cli_rectangle_t), // cli_rectangle,
00073     0  // cli_unknown
00074 };
00075 
00076 union cli_field_alignment {
00077     struct { char n; cli_oid_t v;  }  _cli_oid_t;
00078     struct { char n; cli_bool_t v;  } _cli_bool_t;
00079     struct { char n; cli_int1_t v;  } _cli_int1_t;
00080     struct { char n; cli_int2_t v;  } _cli_int2_t;
00081     struct { char n; cli_int4_t v;  } _cli_int4_t;
00082     struct { char n; cli_int8_t v;  } _cli_int8_t;
00083     struct { char n; cli_real4_t v; } _cli_real4_t;
00084     struct { char n; cli_real8_t v; } _cli_real8_t;
00085     struct { char n; cli_array_t v; } _cli_array_t;
00086     struct { char n; char*       v; } _cli_asciiz_t;
00087     struct { char n; cli_rectangle_t v; } _cli_rectangle_t;
00088 };
00089 
00090 #define CLI_ALIGNMENT(type) \
00091         (((char *)&(((union cli_field_alignment*)0)->_##type.v)) - ((char *)&(((union cli_field_alignment*)0)->_##type.n)))
00092 
00093 static const int alignof_type[] = { 
00094     CLI_ALIGNMENT(cli_oid_t), 
00095     CLI_ALIGNMENT(cli_bool_t), 
00096     CLI_ALIGNMENT(cli_int1_t), 
00097     CLI_ALIGNMENT(cli_int2_t), 
00098     CLI_ALIGNMENT(cli_int4_t), 
00099     CLI_ALIGNMENT(cli_int8_t), 
00100     CLI_ALIGNMENT(cli_real4_t), 
00101     CLI_ALIGNMENT(cli_real8_t),
00102     CLI_ALIGNMENT(cli_real8_t),
00103     CLI_ALIGNMENT(cli_asciiz_t),
00104     CLI_ALIGNMENT(cli_asciiz_t),
00105     CLI_ALIGNMENT(cli_asciiz_t),
00106     CLI_ALIGNMENT(cli_array_t), // cli_array_of_oid,
00107     CLI_ALIGNMENT(cli_array_t), // cli_array_of_bool,
00108     CLI_ALIGNMENT(cli_array_t), // cli_array_of_int1,
00109     CLI_ALIGNMENT(cli_array_t), // cli_array_of_int2,
00110     CLI_ALIGNMENT(cli_array_t), // cli_array_of_int4,
00111     CLI_ALIGNMENT(cli_array_t), // cli_array_of_int8,
00112     CLI_ALIGNMENT(cli_array_t), // cli_array_of_real4,
00113     CLI_ALIGNMENT(cli_array_t), // cli_array_of_real8, 
00114     CLI_ALIGNMENT(cli_array_t), // cli_array_of_decimal, 
00115     CLI_ALIGNMENT(cli_array_t), // cli_array_of_string,
00116     0, // cli_any,
00117     CLI_ALIGNMENT(cli_int8_t), // cli_datetime,
00118     CLI_ALIGNMENT(cli_int4_t), // cli_autoincrement,
00119     CLI_ALIGNMENT(cli_rectangle_t), // cli_rectangle,
00120     0  // cli_unknown
00121 };
00122 
00123 static const int fd2cli_type_mapping[] = {
00124     cli_bool,
00125     cli_int1,
00126     cli_int2,
00127     cli_int4,
00128     cli_int8,
00129     cli_real4,
00130     cli_real8,
00131     cli_asciiz,
00132     cli_oid
00133 };
00134 
00135 #if defined(__FreeBSD__)
00136 END_FASTDB_NAMESPACE
00137 #include <sys/param.h>
00138 #include <netinet/in.h>
00139 BEGIN_FASTDB_NAMESPACE
00140 #define USE_HTON_NTOH
00141 #elif defined(__linux__)
00142 //
00143 // At Linux inline assembly declarations of ntohl, htonl... are available
00144 //
00145 END_FASTDB_NAMESPACE
00146 #include <netinet/in.h>
00147 BEGIN_FASTDB_NAMESPACE
00148 #define USE_HTON_NTOH
00149 #else
00150 #if defined(_WIN32) && _M_IX86 >= 400
00151 #pragma warning(disable:4035) // disable "no return" warning
00152 #ifdef __BORLANDC__
00153 static
00154 #else
00155 inline 
00156 #endif
00157 int swap_bytes_in_dword(int val) {
00158     __asm {
00159           mov eax, val
00160           bswap eax
00161     }
00162 }
00163 #ifdef __BORLANDC__
00164 static
00165 #else
00166 inline 
00167 #endif
00168 short swap_bytes_in_word(short val) {
00169     __asm {
00170           mov ax, val
00171           xchg al,ah
00172     }
00173 }
00174 #pragma warning(default:4035)
00175 #define ntohl(w) swap_bytes_in_dword(w)
00176 #define htonl(w) swap_bytes_in_dword(w)
00177 #define ntohs(w) swap_bytes_in_word(w)
00178 #define htons(w) swap_bytes_in_word(w)
00179 
00180 #define USE_HTON_NTOH
00181 #endif
00182 #endif
00183 
00184 
00185 
00186 
00187 inline char* pack2(char* dst, int2 val) { 
00188     *dst++ = char(val >> 8);
00189     *dst++ = char(val);     
00190     return dst;
00191 }
00192 
00193 inline char* pack2(char* dst, char* src) { 
00194     return pack2(dst, *(int2*)src); 
00195 }
00196 
00197 inline void pack2(int2& val) { 
00198 #if BYTE_ORDER != BIG_ENDIAN
00199 #ifdef USE_HTON_NTOH
00200     val = htons(val);
00201 #else
00202     pack2((char*)&val, val); 
00203 #endif
00204 #endif
00205 }
00206 
00207 
00208 inline char* pack4(char* dst, int4 val) { 
00209     *dst++ = char(val >> 24);
00210     *dst++ = char(val >> 16);     
00211     *dst++ = char(val >> 8); 
00212     *dst++ = char(val);
00213     return dst;
00214 }
00215 
00216 inline char* pack4(char* dst, char* src) { 
00217     return pack4(dst, *(int4*)src); 
00218 }
00219 
00220 inline void pack4(int4& val) { 
00221 #if BYTE_ORDER != BIG_ENDIAN
00222 #ifdef USE_HTON_NTOH
00223     val = htonl(val);
00224 #else
00225     pack4((char*)&val, val); 
00226 #endif
00227 #endif
00228 }
00229 
00230 
00231 inline char* pack8(char* dst, char* src) { 
00232 #if BYTE_ORDER == BIG_ENDIAN
00233     return pack4( pack4(dst, src), src + 4);
00234 #else
00235     return pack4( pack4(dst, src + 4), src);
00236 #endif
00237 }
00238 
00239 inline char* pack8(char* dst, db_int8 val) { 
00240     return pack8(dst, (char*)&val);
00241 }
00242 
00243 inline char* pack_oid(char* dst, cli_oid_t oid)
00244 {
00245     return (sizeof(oid) == 4) ? pack4(dst, oid) : pack8(dst, (char*)&oid);
00246 }
00247 
00248 inline char* pack_rectangle(char* dst, cli_rectangle_t* rect)
00249 {
00250     if (sizeof(cli_coord_t) == 4) { 
00251         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00252             dst = pack4(dst, (char*)&rect->boundary[i]);
00253         }
00254     } else { 
00255         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00256             dst = pack8(dst, (char*)&rect->boundary[i]);
00257         }
00258     }
00259     return dst;
00260 }
00261 
00262 inline int2 unpack2(char* src) { 
00263     nat1* s = (nat1*)src;
00264     return (s[0] << 8) + s[1]; 
00265 }
00266 
00267 inline char* unpack2(char* dst, char* src) { 
00268     *(int2*)dst = unpack2(src);
00269     return src + 2;
00270 }
00271 
00272 inline void  unpack2(int2& val) { 
00273 #if BYTE_ORDER != BIG_ENDIAN
00274 #ifdef USE_HTON_NTOH
00275     val = ntohs(val);
00276 #else
00277     val = unpack2((char*)&val); 
00278 #endif
00279 #endif
00280 }
00281 
00282 
00283 inline int4  unpack4(char* src) { 
00284     nat1* s = (nat1*)src;
00285     return (((((s[0] << 8) + s[1]) << 8) + s[2]) << 8) + s[3];
00286 } 
00287 
00288 inline char* unpack4(char* dst, char* src) { 
00289     *(int4*)dst = unpack4(src);
00290     return src + 4;
00291 }
00292 
00293 inline void unpack4(int4& val) { 
00294 #if BYTE_ORDER != BIG_ENDIAN
00295 #ifdef USE_HTON_NTOH
00296     val = ntohl(val);
00297 #else
00298     val = unpack4((char*)&val); 
00299 #endif
00300 #endif
00301 }
00302 
00303 inline char* unpack8(char* dst, char* src) { 
00304 #if BYTE_ORDER == BIG_ENDIAN
00305     *(int4*)dst = unpack4(src);
00306     *((int4*)dst+1) = unpack4(src+4);
00307 #else
00308     *(int4*)dst = unpack4(src+4);
00309     *((int4*)dst+1) = unpack4(src);
00310 #endif
00311     return src + 8;
00312 }
00313 
00314 inline db_int8 unpack8(char* src) { 
00315     db_int8 val;
00316     unpack8((char*)&val, src);
00317     return val;
00318 }
00319 
00320 inline cli_oid_t unpack_oid(char* src)
00321 {
00322     cli_oid_t oid;
00323     if (sizeof(oid) == 4) {
00324         oid = unpack4(src);
00325     } else { 
00326         unpack8((char*)&oid, src);
00327     }
00328     return oid;
00329 }
00330 
00331 inline char* unpack_rectangle(cli_rectangle_t* rect, char* src)
00332 {
00333     if (sizeof(cli_coord_t) == 4) { 
00334         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00335             src = unpack4((char*)&rect->boundary[i], src);
00336         }
00337     } else { 
00338         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00339             src = unpack8((char*)&rect->boundary[i], src);
00340         }
00341     }
00342     return src;
00343 }
00344 
00345 struct cli_request { 
00346     int4 length;
00347     int4 cmd;
00348     int4 stmt_id;
00349     
00350     void pack() { 
00351         pack4(length);
00352         pack4(cmd);
00353         pack4(stmt_id);
00354     }
00355 
00356     void unpack() { 
00357         unpack4(length);
00358         unpack4(cmd);
00359         unpack4(stmt_id);
00360     }
00361 };
00362 
00363 END_FASTDB_NAMESPACE
00364 
00365 #endif

Generated on Mon Oct 23 13:23:58 2006 for FastDB by doxygen1.2.18