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

cliproto.h

00001 //-< CLIPROTO.H >----------------------------------------------------*--------*
00002 // GigaBASE                  Version 1.0         (c) 1999  GARRET    *     ?  *
00003 // (Post Relational 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_GIGABASE_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_insert,
00030     cli_cmd_prepare_and_insert,
00031     cli_cmd_describe_table,
00032     cli_cmd_show_tables,
00033     cli_cmd_login,
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     0, // cli_rectangle,
00073     0  // cli_unknown
00074 };
00075 
00076 static const int gb2cli_type_mapping[] = {
00077     cli_bool,
00078     cli_int1,
00079     cli_int2,
00080     cli_int4,
00081     cli_int8,
00082     cli_real4,
00083     cli_real8,
00084     cli_asciiz,
00085     cli_oid
00086 };
00087 
00088 
00089 #if defined(__FreeBSD__)
00090 #include <sys/param.h>
00091 #include <netinet/in.h>
00092 #define USE_HTON_NTOH
00093 #elif defined(__linux__)
00094 //
00095 // At Linux inline assembly declarations of ntohl, htonl... are available
00096 //
00097 #include <netinet/in.h>
00098 #define USE_HTON_NTOH
00099 #else
00100 #if defined(_WIN32) && _M_IX86 >= 400 && !defined(__BCPLUSPLUS__) && !defined(__MINGW32__)
00101 #pragma warning(disable:4035) // disable "no return" warning
00102 #ifdef __BORLANDC__
00103 static
00104 #else
00105 inline 
00106 #endif
00107 int swap_bytes_in_dword(int val) {
00108     __asm {
00109           mov eax, val
00110           bswap eax
00111     }
00112 }
00113 #ifdef __BORLANDC__
00114 static
00115 #else
00116 inline 
00117 #endif
00118 short swap_bytes_in_word(short val) {
00119     __asm {
00120           mov ax, val
00121           xchg al,ah
00122     }
00123 }
00124 #pragma warning(default:4035)
00125 #define ntohl(w) swap_bytes_in_dword(w)
00126 #define htonl(w) swap_bytes_in_dword(w)
00127 #define ntohs(w) swap_bytes_in_word(w)
00128 #define htons(w) swap_bytes_in_word(w)
00129 
00130 #define USE_HTON_NTOH
00131 #endif
00132 #endif
00133 
00134 
00135 
00136 
00137 inline char* pack2(char* dst, int2 val) {
00138     *dst++ = char(val >> 8);
00139     *dst++ = char(val);
00140     return dst;
00141 }
00142 
00143 inline char* pack2(char* dst, char const* src) {
00144     return pack2(dst, *(int2*)src);
00145 }
00146 
00147 inline void pack2(int2& val) {
00148 #if BYTE_ORDER != BIG_ENDIAN
00149 #ifdef USE_HTON_NTOH
00150     val = htons(val);
00151 #else
00152     pack2((char*)&val, val);
00153 #endif
00154 #endif
00155 }
00156 
00157 
00158 inline char* pack4(char* dst, int4 val) {
00159     *dst++ = char(val >> 24);
00160     *dst++ = char(val >> 16);
00161     *dst++ = char(val >> 8);
00162     *dst++ = char(val);
00163     return dst;
00164 }
00165 
00166 inline char* pack4(char* dst, char const* src) {
00167     return pack4(dst, *(int4*)src);
00168 }
00169 
00170 inline void pack4(int4& val) {
00171 #if BYTE_ORDER != BIG_ENDIAN
00172 #ifdef USE_HTON_NTOH
00173     val = htonl(val);
00174 #else
00175     pack4((char*)&val, val);
00176 #endif
00177 #endif
00178 }
00179 
00180 
00181 inline char* pack8(char* dst, char const* src) {
00182 #if BYTE_ORDER == BIG_ENDIAN
00183     return pack4( pack4(dst, src), src + 4);
00184 #else
00185     return pack4( pack4(dst, src + 4), src);
00186 #endif
00187 }
00188 
00189 inline char* pack8(char* dst, db_int8 val) {
00190     return pack8(dst, (char*)&val);
00191 }
00192 
00193 inline char* pack_oid(char* dst, cli_oid_t oid)
00194 {
00195     return (sizeof(oid) == 4) ? pack4(dst, oid) : pack8(dst, (char*)&oid);
00196 }
00197 
00198 inline char* pack_rectangle(char* dst, cli_rectangle_t* rect)
00199 {
00200     if (sizeof(cli_coord_t) == 4) { 
00201         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00202             dst = pack4(dst, rect->boundary[i]);
00203         }
00204     } else { 
00205         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00206             dst = pack8(dst, rect->boundary[i]);
00207         }
00208     }
00209     return dst;
00210 }
00211 
00212 #ifdef UNICODE
00213 inline char* pack_str(char* dst, char_t const* src) { 
00214     char_t ch;
00215     do {
00216         ch = *src++;
00217         *dst++ = (char)(ch >> 8);
00218         *dst++ = (char)ch;
00219     } while (ch != '\0');
00220     return dst;
00221 }
00222 inline char* pack_str(char* dst, char_t const* src, int n) { 
00223     char_t ch;
00224     while (--n >= 0) { 
00225         ch = *src++;
00226         *dst++ = (char)(ch >> 8);
00227         *dst++ = (char)ch;
00228     }
00229     return dst;
00230 }
00231 #else
00232 inline char* pack_str(char* dst, char const* src) { 
00233     while ((*dst++ = *src++) != '\0');
00234     return dst;
00235 }
00236 inline char* pack_str(char* dst, char const* src, int n) { 
00237     while (--n >= 0) { 
00238         *dst++ = *src++;
00239     }
00240     return dst;
00241 }
00242 #endif
00243 
00244 inline int2 unpack2(char const* src) {
00245     nat1* s = (nat1*)src;
00246     return (s[0] << 8) + s[1];
00247 }
00248 
00249 inline char* unpack2(char* dst, char* src) {
00250     *(int2*)dst = unpack2(src);
00251     return src + 2;
00252 }
00253 
00254 inline void  unpack2(int2& val) {
00255 #if BYTE_ORDER != BIG_ENDIAN
00256 #ifdef USE_HTON_NTOH
00257     val = ntohs(val);
00258 #else
00259     val = unpack2((char*)&val);
00260 #endif
00261 #endif
00262 }
00263 
00264 
00265 inline int4  unpack4(char const* src) {
00266     nat1* s = (nat1*)src;
00267     return (((((s[0] << 8) + s[1]) << 8) + s[2]) << 8) + s[3];
00268 }
00269 
00270 inline char* unpack4(char* dst, char* src) {
00271     *(int4*)dst = unpack4(src);
00272     return src + 4;
00273 }
00274 
00275 inline void unpack4(int4& val) {
00276 #if BYTE_ORDER != BIG_ENDIAN
00277 #ifdef USE_HTON_NTOH
00278     val = ntohl(val);
00279 #else
00280     val = unpack4((char*)&val);
00281 #endif
00282 #endif
00283 }
00284 
00285 inline char* unpack8(char* dst, char* src) {
00286 #if BYTE_ORDER == BIG_ENDIAN
00287     *(int4*)dst = unpack4(src);
00288     *((int4*)dst+1) = unpack4(src+4);
00289 #else
00290     *(int4*)dst = unpack4(src+4);
00291     *((int4*)dst+1) = unpack4(src);
00292 #endif
00293     return src + 8;
00294 }
00295 
00296 inline db_int8 unpack8(char* src) {
00297     db_int8 val;
00298     unpack8((char*)&val, src);
00299     return val;
00300 }
00301 
00302 inline cli_oid_t unpack_oid(char* src)
00303 {
00304     cli_oid_t oid;
00305     if (sizeof(oid) == 4) {
00306         oid = unpack4(src);
00307     } else {
00308         unpack8((char*)&oid, src);
00309     }
00310     return oid;
00311 }
00312 
00313 inline char* unpack_rectangle(cli_rectangle_t* rect, char* src)
00314 {
00315     if (sizeof(cli_coord_t) == 4) { 
00316         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00317             rect->boundary[i] = (cli_coord_t)unpack4(src);
00318             src += 4;
00319         }
00320     } else { 
00321         for (int i = 0; i < CLI_RECTANGLE_DIMENSION*2; i++) { 
00322             rect->boundary[i] = (cli_coord_t)unpack8(src);
00323             src += 8;
00324         }
00325     }
00326     return src;
00327 }
00328 
00329 #ifdef UNICODE
00330 inline char* skip_str(char* p) {
00331     while (p[0] != 0 || p[1] != 0) {
00332         p += 2;
00333     }
00334     return p + 2;
00335 }
00336 inline char* unpack_str(char_t* dst, char* src) {
00337     char_t ch;
00338     do {
00339         ch = (src[0] << 8) | (src[1] & 0xFF);
00340         src += sizeof(char_t);
00341         *dst++ = ch;
00342     } while (ch != '\0');
00343     return src;
00344 }
00345 inline char* unpack_str(char_t* dst, char* src, int n) {
00346     char_t ch;
00347     while (--n >= 0) { 
00348         ch = (src[0] << 8) | (src[1] & 0xFF);
00349         src += sizeof(char_t);
00350         *dst++ = ch;
00351     } 
00352     return src;
00353 }
00354 inline char_t unpack_char(char const* p) { 
00355     return (p[0] << 8) | (p[1] & 0xFF);
00356 }
00357 #else
00358 inline char* skip_str(char* p) {
00359     while (*p++ != 0);
00360     return p;
00361 }
00362 inline char* unpack_str(char* dst, char* src) {
00363     while ((*dst++ = *src++) != '\0');
00364     return src;
00365 }
00366 inline char* unpack_str(char* dst, char* src, int n) {
00367     while (--n >= 0) {
00368         *dst++ = *src++;
00369     }
00370     return src;
00371 }
00372 inline char_t unpack_char(char const* p) {
00373     return *p;
00374 }
00375 #endif
00376 
00377 struct cli_request {
00378     int4 length;
00379     int4 cmd;
00380     int4 stmt_id;
00381 #ifdef SECURE_SERVER
00382     int4 sig;
00383 #endif
00384 
00385     void pack() {
00386 #ifdef SECURE_SERVER
00387         int i, s = length + cmd + stmt_id;
00388         char *p = (char *)&length + sizeof(cli_request);
00389         for (i = 0; i < length - sizeof(cli_request); i++, p++) {
00390             s += (*p << 7) + (*p << 3) + i;
00391         }
00392         sig = s;
00393 #endif
00394         pack4(length);
00395         pack4(cmd);
00396         pack4(stmt_id);
00397 #ifdef SECURE_SERVER
00398         pack4(sig);
00399 #endif
00400     }
00401 
00402     void unpack() {
00403         unpack4(length);
00404         unpack4(cmd);
00405         unpack4(stmt_id);
00406 #ifdef SECURE_SERVER
00407         unpack4(sig);
00408 #endif
00409     }
00410 };
00411 
00412 END_GIGABASE_NAMESPACE
00413 
00414 #endif

Generated on Thu Feb 12 18:46:27 2004 for GigaBASE by doxygen 1.3.5