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 + -
显示快捷键?