8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-30 19:23:03 +01:00
firebird-mirror/src/remote/protocol.h

717 lines
20 KiB
C++

/*
* PROGRAM: JRD Remote Interface/Server
* MODULE: protocol.h
* DESCRIPTION: Protocol Definition
*
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at http://www.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*
* 2002.02.15 Sean Leyne - This module needs to be cleanedup to remove obsolete ports/defines:
* - "EPSON", "XENIX" +++
*
* 2002.10.27 Sean Leyne - Code Cleanup, removed obsolete "Ultrix/MIPS" port
*
* 2002.10.28 Sean Leyne - Code cleanup, removed obsolete "MPEXL" port
* 2002.10.28 Sean Leyne - Code cleanup, removed obsolete "DecOSF" port
*
*/
#ifndef REMOTE_PROTOCOL_H
#define REMOTE_PROTOCOL_H
// dimitr: ask for asymmetric protocols only.
// Comment it out to return back to FB 1.0 behaviour.
#define ASYMMETRIC_PROTOCOLS_ONLY
// The protocol is defined blocks, rather than messages, to
// separate the protocol from the transport layer.
// p_cnct_version
const USHORT CONNECT_VERSION2 = 2;
// Protocol 4 is protocol 3 plus server management functions
const USHORT PROTOCOL_VERSION3 = 3;
const USHORT PROTOCOL_VERSION4 = 4;
// Protocol 5 includes support for a d_float data type
const USHORT PROTOCOL_VERSION5 = 5;
// Protocol 6 includes support for cancel remote events, blob seek,
// and unknown message type
const USHORT PROTOCOL_VERSION6 = 6;
// Protocol 7 includes DSQL support
const USHORT PROTOCOL_VERSION7 = 7;
// Protocol 8 includes collapsing first receive into a send, drop database,
// DSQL execute 2, DSQL execute immediate 2, DSQL insert, services, and
// transact request
const USHORT PROTOCOL_VERSION8 = 8;
// Protocol 9 includes support for SPX32
// SPX32 uses WINSOCK instead of Novell SDK
// In order to differentiate between the old implementation
// of SPX and this one, different PROTOCOL VERSIONS are used
const USHORT PROTOCOL_VERSION9 = 9;
// Protocol 10 includes support for warnings and removes the requirement for
// encoding and decoding status codes
const USHORT PROTOCOL_VERSION10 = 10;
// Since protocol 11 we must be separated from Borland Interbase.
// Therefore always set highmost bit in protocol version to 1.
// For unsigned protocol version this does not break version's compare.
const USHORT FB_PROTOCOL_FLAG = 0x8000;
const USHORT FB_PROTOCOL_MASK = static_cast<USHORT>(~FB_PROTOCOL_FLAG);
// Protocol 11 has support for user authentication related
// operations (op_update_account_info, op_authenticate_user and
// op_trusted_auth). When specific operation is not supported,
// we say "sorry".
const USHORT PROTOCOL_VERSION11 = (FB_PROTOCOL_FLAG | 11);
// Protocol 12 has support for asynchronous call op_cancel.
// Currently implemented asynchronously only for TCP/IP
// on superserver and superclassic.
const USHORT PROTOCOL_VERSION12 = (FB_PROTOCOL_FLAG | 12);
// Protocol 13 has support for authentication plugins (op_cont_auth).
const USHORT PROTOCOL_VERSION13 = (FB_PROTOCOL_FLAG | 13);
// Architecture types
enum P_ARCH
{
arch_generic = 1, // Generic -- always use canonical forms
//arch_apollo = 2,
arch_sun = 3,
//arch_vms = 4,
//arch_ultrix = 5,
//arch_alliant = 6,
//arch_msdos = 7,
arch_sun4 = 8,
arch_sunx86 = 9,
arch_hpux = 10,
//arch_hpmpexl = 11,
//arch_mac = 12,
//arch_macaux = 13,
arch_rt = 14,
//arch_mips_ultrix = 15,
//arch_hpux_68k = 16,
//arch_xenix = 17,
//arch_aviion = 18,
//arch_sgi = 19,
//arch_apollo_dn10k = 20,
//arch_cray = 21,
//arch_imp = 22,
//arch_delta = 23,
//arch_sco = 24,
//arch_next = 25,
//arch_next_386 = 26,
//arch_m88k = 27,
//arch_unixware = 28,
arch_intel_32 = 29, // generic Intel chip w/32-bit compilation
//arch_epson = 30,
//arch_decosf = 31,
//arch_ncr3000 = 32,
//arch_nt_ppc = 33,
//arch_dg_x86 = 34,
//arch_sco_ev = 35,
arch_linux = 36,
arch_freebsd = 37,
arch_netbsd = 38,
arch_darwin_ppc = 39,
arch_winnt_64 = 40,
arch_darwin_x64 = 41,
arch_darwin_ppc64 = 42,
arch_max = 43 // Keep this at the end
};
// Protocol Types
// p_acpt_type
//const USHORT ptype_page = 1; // Page server protocol
const USHORT ptype_rpc = 2; // Simple remote procedure call
const USHORT ptype_batch_send = 3; // Batch sends, no asynchrony
const USHORT ptype_out_of_band = 4; // Batch sends w/ out of band notification
const USHORT ptype_lazy_send = 5; // Deferred packets delivery
// Generic object id
typedef USHORT OBJCT;
const int MAX_OBJCT_HANDLES = 65000;
const int INVALID_OBJECT = MAX_USHORT;
// Statement flags
const USHORT STMT_BLOB = 1;
const USHORT STMT_NO_BATCH = 2;
const USHORT STMT_DEFER_EXECUTE = 4;
// Operation (packet) types
enum P_OP
{
op_void = 0, // Packet has been voided
op_connect = 1, // Connect to remote server
op_exit = 2, // Remote end has exitted
op_accept = 3, // Server accepts connection
op_reject = 4, // Server rejects connection
//op_protocol = 5, // Protocol selection
op_disconnect = 6, // Connect is going away
//op_credit = 7, // Grant (buffer) credits
//op_continuation = 8, // Continuation packet
op_response = 9, // Generic response block
// Page server operations
//op_open_file = 10, // Open file for page service
//op_create_file = 11, // Create file for page service
//op_close_file = 12, // Close file for page service
//op_read_page = 13, // optionally lock and read page
//op_write_page = 14, // write page and optionally release lock
//op_lock = 15, // seize lock
//op_convert_lock = 16, // convert existing lock
//op_release_lock = 17, // release existing lock
//op_blocking = 18, // blocking lock message
// Full context server operations
op_attach = 19, // Attach database
op_create = 20, // Create database
op_detach = 21, // Detach database
op_compile = 22, // Request based operations
op_start = 23,
op_start_and_send = 24,
op_send = 25,
op_receive = 26,
op_unwind = 27, // apparently unused, see protocol.cpp's case op_unwind
op_release = 28,
op_transaction = 29, // Transaction operations
op_commit = 30,
op_rollback = 31,
op_prepare = 32,
op_reconnect = 33,
op_create_blob = 34, // Blob operations
op_open_blob = 35,
op_get_segment = 36,
op_put_segment = 37,
op_cancel_blob = 38,
op_close_blob = 39,
op_info_database = 40, // Information services
op_info_request = 41,
op_info_transaction = 42,
op_info_blob = 43,
op_batch_segments = 44, // Put a bunch of blob segments
//op_mgr_set_affinity = 45, // Establish server affinity
//op_mgr_clear_affinity = 46, // Break server affinity
//op_mgr_report = 47, // Report on server
op_que_events = 48, // Que event notification request
op_cancel_events = 49, // Cancel event notification request
op_commit_retaining = 50, // Commit retaining (what else)
op_prepare2 = 51, // Message form of prepare
op_event = 52, // Completed event request (asynchronous)
op_connect_request = 53, // Request to establish connection
op_aux_connect = 54, // Establish auxiliary connection
op_ddl = 55, // DDL call
op_open_blob2 = 56,
op_create_blob2 = 57,
op_get_slice = 58,
op_put_slice = 59,
op_slice = 60, // Successful response to op_get_slice
op_seek_blob = 61, // Blob seek operation
// DSQL operations
op_allocate_statement = 62, // allocate a statment handle
op_execute = 63, // execute a prepared statement
op_exec_immediate = 64, // execute a statement
op_fetch = 65, // fetch a record
op_fetch_response = 66, // response for record fetch
op_free_statement = 67, // free a statement
op_prepare_statement = 68, // prepare a statement
op_set_cursor = 69, // set a cursor name
op_info_sql = 70,
op_dummy = 71, // dummy packet to detect loss of client
op_response_piggyback = 72, // response block for piggybacked messages
op_start_and_receive = 73,
op_start_send_and_receive = 74,
op_exec_immediate2 = 75, // execute an immediate statement with msgs
op_execute2 = 76, // execute a statement with msgs
op_insert = 77,
op_sql_response = 78, // response from execute, exec immed, insert
op_transact = 79,
op_transact_response = 80,
op_drop_database = 81,
op_service_attach = 82,
op_service_detach = 83,
op_service_info = 84,
op_service_start = 85,
op_rollback_retaining = 86,
// Two following opcode are used in vulcan.
// No plans to implement them completely for a while, but to
// support protocol 11, where they are used, have them here.
op_update_account_info = 87,
op_authenticate_user = 88,
op_partial = 89, // packet is not complete - delay processing
op_trusted_auth = 90,
op_cancel = 91,
op_cont_auth = 92,
op_ping = 93,
op_max
};
// Count String Structure
typedef struct cstring
{
USHORT cstr_length;
USHORT cstr_allocated;
UCHAR* cstr_address;
} CSTRING;
// CVC: Only used in p_blob, p_sgmt & p_ddl, to validate constness.
// We want to ensure our original bpb is not overwritten.
// In turn, p_blob is used only to create and open a blob, so it's correct
// to demand that those functions do not change the bpb.
// We want to ensure our incoming segment to be stored isn't overwritten,
// in the case of send/batch commands.
typedef struct cstring_const
{
USHORT cstr_length;
USHORT cstr_allocated;
const UCHAR* cstr_address;
} CSTRING_CONST;
#ifdef DEBUG_XDR_MEMORY
// Debug xdr memory allocations
const USHORT P_MALLOC_SIZE = 64; // Xdr memory allocations per packet
typedef struct p_malloc
{
P_OP p_operation; // Operation/packet type
ULONG p_allocated; // Memory length
UCHAR* p_address; // Memory address
// UCHAR* p_xdrvar; // XDR variable
} P_MALLOC;
#endif // DEBUG_XDR_MEMORY
// Connect Block (Client to server)
typedef struct p_cnct
{
P_OP p_cnct_operation; // OP_CREATE or OP_OPEN
USHORT p_cnct_cversion; // Version of connect protocol
P_ARCH p_cnct_client; // Architecture of client
CSTRING_CONST p_cnct_file; // File name
USHORT p_cnct_count; // Protocol versions understood
CSTRING_CONST p_cnct_user_id; // User identification stuff
struct p_cnct_repeat
{
USHORT p_cnct_version; // Protocol version number
P_ARCH p_cnct_architecture; // Architecture of client
USHORT p_cnct_min_type; // Minimum type
USHORT p_cnct_max_type; // Maximum type
USHORT p_cnct_weight; // Preference weight
} p_cnct_versions[10];
} P_CNCT;
#ifdef ASYMMETRIC_PROTOCOLS_ONLY
#define REMOTE_PROTOCOL(version, min_type, max_type, weight) \
{version, arch_generic, min_type, max_type, weight * 2}
#else
#define REMOTE_PROTOCOL(version, min_type, max_type, weight) \
{version, arch_generic, min_type, max_type, weight * 2}, \
{version, ARCHITECTURE, min_type, max_type, weight * 2 + 1}
#endif
/* User identification data, if any, is of form:
<type> <length> <data>
where
type is a byte code
length is an unsigned byte containing length of data
data is 'type' specific
*/
const UCHAR CNCT_user = 1; // User name
const UCHAR CNCT_passwd = 2;
//const UCHAR CNCT_ppo = 3; // Apollo person, project, organization. OBSOLETE.
const UCHAR CNCT_host = 4;
const UCHAR CNCT_group = 5; // Effective Unix group id
const UCHAR CNCT_user_verification = 6; // Attach/create using this connection
// will use user verification
typedef struct bid // BLOB ID
{
ULONG bid_quad_high;
ULONG bid_quad_low;
bid& operator =(const ISC_QUAD& v)
{
bid_quad_high = v.gds_quad_high;
bid_quad_low = v.gds_quad_low;
return *this;
}
operator ISC_QUAD() const
{
ISC_QUAD rc;
rc.gds_quad_high = bid_quad_high;
rc.gds_quad_low = bid_quad_low;
return rc;
}
} *BID;
// Accept Block (Server response to connect block)
typedef struct p_acpt
{
USHORT p_acpt_version; // Protocol version number
P_ARCH p_acpt_architecture; // Architecture for protocol
USHORT p_acpt_type; // Minimum type
} P_ACPT;
// Generic Response block
typedef struct p_resp
{
OBJCT p_resp_object; // Object id
struct bid p_resp_blob_id; // Blob id
CSTRING p_resp_data; // Data
ISC_STATUS_ARRAY p_resp_status_vector;
} P_RESP;
#define p_resp_partner p_resp_blob_id.bid_number
// Attach and create database
typedef struct p_atch
{
OBJCT p_atch_database; // Database object id
CSTRING_CONST p_atch_file; // File name
CSTRING_CONST p_atch_dpb; // Database parameter block
} P_ATCH;
// Compile request
typedef struct p_cmpl
{
OBJCT p_cmpl_database; // Database object id
CSTRING_CONST p_cmpl_blr; // Request blr
} P_CMPL;
// Start Transaction
typedef struct p_sttr
{
OBJCT p_sttr_database; // Database object id
CSTRING_CONST p_sttr_tpb; // Transaction parameter block
} P_STTR;
// Generic release block
typedef struct p_rlse
{
OBJCT p_rlse_object; // Object to be released
} P_RLSE;
// Data block (start, start and send, send, receive)
typedef struct p_data
{
OBJCT p_data_request; // Request object id
USHORT p_data_incarnation; // Incarnation of request
OBJCT p_data_transaction; // Transaction object id
USHORT p_data_message_number; // Message number in request
USHORT p_data_messages; // Number of messages
} P_DATA;
// Execute stored procedure block
typedef struct p_trrq
{
OBJCT p_trrq_database; // Database object id
OBJCT p_trrq_transaction; // Transaction object id
CSTRING p_trrq_blr; // Message blr
USHORT p_trrq_in_msg_length;
USHORT p_trrq_out_msg_length;
USHORT p_trrq_messages; // Number of messages
} P_TRRQ;
// Blob (create/open) and segment blocks
typedef struct p_blob
{
OBJCT p_blob_transaction; // Transaction
struct bid p_blob_id; // Blob id for open
CSTRING_CONST p_blob_bpb; // Blob parameter block
} P_BLOB;
typedef struct p_sgmt
{
OBJCT p_sgmt_blob; // Blob handle id
USHORT p_sgmt_length; // Length of segment
CSTRING_CONST p_sgmt_segment; // Data segment
} P_SGMT;
typedef struct p_seek
{
OBJCT p_seek_blob; // Blob handle id
SSHORT p_seek_mode; // mode of seek
SLONG p_seek_offset; // Offset of seek
} P_SEEK;
// Information request blocks
typedef struct p_info
{
OBJCT p_info_object; // Object of information
USHORT p_info_incarnation; // Incarnation of object
CSTRING_CONST p_info_items; // Information
CSTRING_CONST p_info_recv_items; // Receive information
USHORT p_info_buffer_length; // Target buffer length
} P_INFO;
// Event request block
typedef struct p_event
{
OBJCT p_event_database; // Database object id
CSTRING_CONST p_event_items; // Event description block
FPTR_EVENT_CALLBACK p_event_ast; // Address of ast routine
SLONG p_event_arg; // Argument to ast routine
SLONG p_event_rid; // Client side id of remote event
} P_EVENT;
// Prepare block
typedef struct p_prep
{
OBJCT p_prep_transaction;
CSTRING_CONST p_prep_data;
} P_PREP;
// Connect request block
typedef struct p_req
{
USHORT p_req_type; // Connection type
OBJCT p_req_object; // Related object
ULONG p_req_partner; // Partner identification
} P_REQ;
// p_req_type
const USHORT P_REQ_async = 1; // Auxiliary asynchronous port
// DDL request
typedef struct p_ddl
{
OBJCT p_ddl_database; // Database object id
OBJCT p_ddl_transaction; // Transaction
CSTRING_CONST p_ddl_blr; // Request blr
} P_DDL;
// Slice Operation
typedef struct p_slc
{
OBJCT p_slc_transaction; // Transaction
struct bid p_slc_id; // Slice id
CSTRING p_slc_sdl; // Slice description language
CSTRING p_slc_parameters; // Slice parameters
lstring p_slc_slice; // Slice proper
ULONG p_slc_length; // Number of elements
} P_SLC;
// Response to get_slice
typedef struct p_slr
{
lstring p_slr_slice; // Slice proper
ULONG p_slr_length; // Total length of slice
UCHAR* p_slr_sdl; // *** not transfered ***
USHORT p_slr_sdl_length; // *** not transfered ***
} P_SLR;
// DSQL structure definitions
typedef struct p_sqlst
{
OBJCT p_sqlst_transaction; // transaction object
OBJCT p_sqlst_statement; // statement object
USHORT p_sqlst_SQL_dialect; // the SQL dialect
CSTRING_CONST p_sqlst_SQL_str; // statement to be prepared
USHORT p_sqlst_buffer_length; // Target buffer length
CSTRING_CONST p_sqlst_items; // Information
// This should be CSTRING_CONST
CSTRING p_sqlst_blr; // blr describing message
USHORT p_sqlst_message_number;
USHORT p_sqlst_messages; // Number of messages
CSTRING p_sqlst_out_blr; // blr describing output message
USHORT p_sqlst_out_message_number;
} P_SQLST;
typedef struct p_sqldata
{
OBJCT p_sqldata_statement; // statement object
OBJCT p_sqldata_transaction; // transaction object
// This should be CSTRING_CONST, but fetch() has strange behavior.
CSTRING p_sqldata_blr; // blr describing message
USHORT p_sqldata_message_number;
USHORT p_sqldata_messages; // Number of messages
CSTRING p_sqldata_out_blr; // blr describing output message
USHORT p_sqldata_out_message_number;
ULONG p_sqldata_status; // final eof status
} P_SQLDATA;
typedef struct p_sqlfree
{
OBJCT p_sqlfree_statement; // statement object
USHORT p_sqlfree_option; // option
} P_SQLFREE;
typedef struct p_sqlcur
{
OBJCT p_sqlcur_statement; // statement object
CSTRING_CONST p_sqlcur_cursor_name; // cursor name
USHORT p_sqlcur_type; // type of cursor
} P_SQLCUR;
typedef struct p_trau
{
CSTRING p_trau_data; // Context
} P_TRAU;
typedef struct p_auth_continue
{
CSTRING p_data; // Request
CSTRING p_name; // Plugin name
} P_AUTH_CONT;
struct p_update_account
{
OBJCT p_account_database; // Database object id
CSTRING_CONST p_account_apb; // Account parameter block (apb)
};
struct p_authenticate
{
OBJCT p_auth_database; // Database object id
CSTRING_CONST p_auth_dpb; // Database parameter block w/ user credentials
CSTRING p_auth_items; // Information
CSTRING p_auth_recv_items; // Receive information
USHORT p_auth_buffer_length; // Target buffer length
};
typedef struct p_cancel_op
{
USHORT p_co_kind; // Kind of cancelation
} P_CANCEL_OP;
// Generalize packet (sic!)
typedef struct packet
{
#ifdef DEBUG_XDR_MEMORY
// When XDR memory debugging is enabled, p_malloc must be
// the first subpacket and be followed by p_operation (see
// server.c/zap_packet())
P_MALLOC p_malloc [P_MALLOC_SIZE]; // Debug xdr memory allocations
#endif
P_OP p_operation; // Operation/packet type
P_CNCT p_cnct; // Connect block
P_ACPT p_acpt; // Accept connection
P_RESP p_resp; // Generic response to a call
P_ATCH p_atch; // Attach or create database
P_RLSE p_rlse; // Release object
P_DATA p_data; // Data packet
P_CMPL p_cmpl; // Compile request
P_STTR p_sttr; // Start transactions
P_BLOB p_blob; // Create/Open blob
P_SGMT p_sgmt; // Put_segment
P_INFO p_info; // Information
P_EVENT p_event; // Que event
P_PREP p_prep; // New improved prepare
P_REQ p_req; // Connection request
P_DDL p_ddl; // Data definition call
P_SLC p_slc; // Slice operator
P_SLR p_slr; // Slice response
P_SEEK p_seek; // Blob seek
P_SQLST p_sqlst; // DSQL Prepare & Execute immediate
P_SQLDATA p_sqldata; // DSQL Open Cursor, Execute, Fetch
P_SQLCUR p_sqlcur; // DSQL Set cursor name
P_SQLFREE p_sqlfree; // DSQL Free statement
P_TRRQ p_trrq; // Transact request packet
P_TRAU p_trau; // Trusted authentication
p_update_account p_account_update;
p_authenticate p_authenticate_user;
P_CANCEL_OP p_cancel_op; // Cancel operation
P_AUTH_CONT p_auth_cont; // Request more auth data
public:
packet()
{
memset(this, 0, sizeof(*this));
}
} PACKET;
#endif // REMOTE_PROTOCOL_H