00001
00002
00003
00004
00005
00006
00007
00008
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),
00056 sizeof(char*),
00057 sizeof(char*),
00058 sizeof(char*),
00059 sizeof(cli_array_t),
00060 sizeof(cli_array_t),
00061 sizeof(cli_array_t),
00062 sizeof(cli_array_t),
00063 sizeof(cli_array_t),
00064 sizeof(cli_array_t),
00065 sizeof(cli_array_t),
00066 sizeof(cli_array_t),
00067 sizeof(cli_array_t),
00068 sizeof(cli_array_t),
00069 0,
00070 sizeof(cli_int8_t),
00071 sizeof(cli_int4_t),
00072 sizeof(cli_rectangle_t),
00073 0
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),
00107 CLI_ALIGNMENT(cli_array_t),
00108 CLI_ALIGNMENT(cli_array_t),
00109 CLI_ALIGNMENT(cli_array_t),
00110 CLI_ALIGNMENT(cli_array_t),
00111 CLI_ALIGNMENT(cli_array_t),
00112 CLI_ALIGNMENT(cli_array_t),
00113 CLI_ALIGNMENT(cli_array_t),
00114 CLI_ALIGNMENT(cli_array_t),
00115 CLI_ALIGNMENT(cli_array_t),
00116 0,
00117 CLI_ALIGNMENT(cli_int8_t),
00118 CLI_ALIGNMENT(cli_int4_t),
00119 CLI_ALIGNMENT(cli_rectangle_t),
00120 0
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
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