cliproto.h

来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· C头文件 代码 · 共 271 行

H
271
字号
//-< CLIPROTO.H >----------------------------------------------------*--------*// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *// (Main Memory Database Management System)                          *   /\|  *//                                                                   *  /  \  *//                          Created:     13-Jan-2000  K.A. Knizhnik  * / [] \ *//                          Last update: 13-Jan-2000  K.A. Knizhnik  * GARRET *//-------------------------------------------------------------------*--------*// Client-server communication protocol//-------------------------------------------------------------------*--------*#ifndef __CLIPROTO_H__#define __CLIPROTO_H__enum cli_commands {     cli_cmd_close_session,     cli_cmd_prepare_and_execute,    cli_cmd_execute,    cli_cmd_get_first,     cli_cmd_get_last,     cli_cmd_get_next,    cli_cmd_get_prev,    cli_cmd_free_statement,    cli_cmd_abort,    cli_cmd_commit,    cli_cmd_update,    cli_cmd_remove,    cli_cmd_insert,    cli_cmd_prepare_and_insert,    cli_cmd_describe_table,    cli_cmd_show_tables,    cli_cmd_precommit,    cli_cmd_skip,    cli_cmd_create_table,    cli_cmd_drop_table,    cli_cmd_alter_index,    cli_cmd_freeze,    cli_cmd_unfreeze,    cli_cmd_last};static const int sizeof_type[] = {     sizeof(cli_oid_t),     sizeof(cli_bool_t),     sizeof(cli_int1_t),     sizeof(cli_int2_t),     sizeof(cli_int4_t),     sizeof(cli_int8_t),     sizeof(cli_real4_t),     sizeof(cli_real8_t),    0, // cli_asciiz,     0, // cli_pasciiz,    0, // cli_array_of_oid,    0, // cli_array_of_bool,    0, // cli_array_of_int1,    0, // cli_array_of_int2,    0, // cli_array_of_int4,    0, // cli_array_of_int8,    0, // cli_array_of_real4,    0, // cli_array_of_real8,     4  // cli_autoincrement};static const int fd2cli_type_mapping[] = {    cli_bool,    cli_int1,    cli_int2,    cli_int4,    cli_int8,    cli_real4,    cli_real8,    cli_asciiz,    cli_oid};#if defined(__FreeBSD__)#include <sys/param.h>#define USE_HTON_NTOH#elif defined(__linux__)//// At Linux inline assembly declarations of ntohl, htonl... are available//#include <netinet/in.h>#define USE_HTON_NTOH#else#if defined(_WIN32) && _M_IX86 >= 400#pragma warning(disable:4035) // disable "no return" warning#ifdef __BORLANDC__static#elseinline #endifint swap_bytes_in_dword(int val) {    __asm {          mov eax, val          bswap eax    }}#ifdef __BORLANDC__static#elseinline #endifshort swap_bytes_in_word(short val) {    __asm {          mov ax, val          xchg al,ah    }}#pragma warning(default:4035)#define ntohl(w) swap_bytes_in_dword(w)#define htonl(w) swap_bytes_in_dword(w)#define ntohs(w) swap_bytes_in_word(w)#define htons(w) swap_bytes_in_word(w)#define USE_HTON_NTOH#endif#endifinline char* pack2(char* dst, int2 val) {     *dst++ = char(val >> 8);    *dst++ = char(val);         return dst;}inline char* pack2(char* dst, char* src) {     return pack2(dst, *(int2*)src); }inline void pack2(int2& val) { #if BYTE_ORDER != BIG_ENDIAN#ifdef USE_HTON_NTOH    val = htons(val);#else    pack2((char*)&val, val); #endif#endif}inline char* pack4(char* dst, int4 val) {     *dst++ = char(val >> 24);    *dst++ = char(val >> 16);         *dst++ = char(val >> 8);     *dst++ = char(val);    return dst;}inline char* pack4(char* dst, char* src) {     return pack4(dst, *(int4*)src); }inline void pack4(int4& val) { #if BYTE_ORDER != BIG_ENDIAN#ifdef USE_HTON_NTOH    val = htonl(val);#else    pack4((char*)&val, val); #endif#endif}inline char* pack8(char* dst, char* src) { #if BYTE_ORDER == BIG_ENDIAN    return pack4( pack4(dst, src), src + 4);#else    return pack4( pack4(dst, src + 4), src);#endif}inline char* pack8(char* dst, db_int8 val) {     return pack8(dst, (char*)&val);}inline char* pack_oid(char* dst, cli_oid_t oid){    return (sizeof(oid) == 4) ? pack4(dst, oid) : pack8(dst, (char*)&oid);}inline int2 unpack2(char* src) {     nat1* s = (nat1*)src;    return (s[0] << 8) + s[1]; }inline char* unpack2(char* dst, char* src) {     *(int2*)dst = unpack2(src);    return src + 2;}inline void  unpack2(int2& val) { #if BYTE_ORDER != BIG_ENDIAN#ifdef USE_HTON_NTOH    val = ntohs(val);#else    val = unpack2((char*)&val); #endif#endif}inline int4  unpack4(char* src) {     nat1* s = (nat1*)src;    return (((((s[0] << 8) + s[1]) << 8) + s[2]) << 8) + s[3];} inline char* unpack4(char* dst, char* src) {     *(int4*)dst = unpack4(src);    return src + 4;}inline void unpack4(int4& val) { #if BYTE_ORDER != BIG_ENDIAN#ifdef USE_HTON_NTOH    val = ntohl(val);#else    val = unpack4((char*)&val); #endif#endif}inline char* unpack8(char* dst, char* src) { #if BYTE_ORDER == BIG_ENDIAN    *(int4*)dst = unpack4(src);    *((int4*)dst+1) = unpack4(src+4);#else    *(int4*)dst = unpack4(src+4);    *((int4*)dst+1) = unpack4(src);#endif    return src + 8;}inline db_int8 unpack8(char* src) {     db_int8 val;    unpack8((char*)&val, src);    return val;}inline cli_oid_t unpack_oid(char* src){    cli_oid_t oid;    if (sizeof(oid) == 4) {	oid = unpack4(src);    } else { 	unpack8((char*)&oid, src);    }    return oid;}struct cli_request {     int4 length;    int4 cmd;    int4 stmt_id;        void pack() { 	pack4(length);	pack4(cmd);	pack4(stmt_id);    }    void unpack() { 	unpack4(length);	unpack4(cmd);	unpack4(stmt_id);    }};#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?