00001
00002
00003
00004
00005
00006
00007
00008
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),
00053 sizeof(char*),
00054 sizeof(char*),
00055 sizeof(char*),
00056 sizeof(cli_array_t),
00057 sizeof(cli_array_t),
00058 sizeof(cli_array_t),
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 0,
00067 sizeof(cli_int8_t),
00068 sizeof(cli_int4_t),
00069 0,
00070 0
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
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