mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 09:23:03 +01:00
701 lines
20 KiB
C++
701 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);
|
|
|
|
#ifdef SCROLLABLE_CURSORS
|
|
This Protocol includes support for scrollable cursors
|
|
and is purposely being undefined so that changes can be made
|
|
to the remote protocol version to support new features without the 'fear' that
|
|
they will be turned off once SCROLLABLE_CURSORS is turned on.
|
|
|
|
#error PROTOCOL_SCROLLABLE_CURSORS this needs to be defined
|
|
|
|
#endif
|
|
|
|
// 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_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;
|
|
|
|
|
|
// 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* 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
|
|
#ifdef SCROLLABLE_CURSORS
|
|
USHORT p_data_direction; // direction to scroll before returning records
|
|
ULONG p_data_offset; // offset to scroll before returning records
|
|
#endif
|
|
} 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;
|
|
|
|
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
|
|
|
|
public:
|
|
packet()
|
|
{
|
|
memset(this, 0, sizeof(*this));
|
|
}
|
|
} PACKET;
|
|
|
|
#endif // REMOTE_PROTOCOL_H
|