mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 14:03:02 +01:00
364 lines
10 KiB
C
364 lines
10 KiB
C
/*
|
|
* PROGRAM: JRD Command Oriented Query Language
|
|
* MODULE: exe.h
|
|
* DESCRIPTION: Execution struct definitions
|
|
*
|
|
* 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): ______________________________________.
|
|
*/
|
|
|
|
#ifndef _QLI_EXE_H_
|
|
#define _QLI_EXE_H_
|
|
|
|
/* Request Language Block -- used for BLR, DYN, SDL, etc. */
|
|
|
|
typedef struct rlb {
|
|
struct blk rlb_header;
|
|
UCHAR *rlb_data; /* Pointer to end of BLR/DYN/SDL */
|
|
UCHAR *rlb_base; /* Pointer to start of buffer */
|
|
UCHAR *rlb_limit; /* Upper limit of string */
|
|
USHORT rlb_length; /* Length of string */
|
|
} *RLB;
|
|
|
|
/* RLB manipulation macros */
|
|
|
|
#define RLB_BUFFER_SIZE 2048
|
|
#define RLB_SAFETY_MARGIN 48
|
|
|
|
#define CHECK_RLB(in) (!in || (in->rlb_data > in->rlb_limit)) ? (in = GEN_rlb_extend (in)) : in;
|
|
#define RELEASE_RLB GEN_rlb_release (rlb);
|
|
#define STUFF(blr) *rlb->rlb_data++ = blr
|
|
#define STUFF_WORD(blr) {STUFF (blr); STUFF (blr >> 8);}
|
|
|
|
/* Request block */
|
|
|
|
typedef struct req {
|
|
struct blk req_header;
|
|
struct req *req_next; /* Next request in statement */
|
|
struct dbb *req_database; /* Database for request */
|
|
int *req_handle; /* Database request handle */
|
|
struct rlb *req_blr;
|
|
struct qli_msg *req_messages; /* Messages associated with request */
|
|
struct qli_msg *req_receive; /* Current receive message, if any */
|
|
struct qli_msg *req_send; /* Current send message, if any */
|
|
struct qli_msg *req_continue; /* Message to continue FOR loop after optional actions */
|
|
USHORT req_flags; /* Flags for state of request compilation, etc. */
|
|
USHORT req_context; /* Next available context */
|
|
USHORT req_msg_number; /* Next available message number */
|
|
USHORT req_label; /* Next available label */
|
|
} *QLI_REQ;
|
|
|
|
#define REQ_rse_compiled 1
|
|
#define REQ_project 2 /* Set during generation of project clause */
|
|
#define REQ_group_by 4 /* Set during generation of group by clause */
|
|
|
|
/* Context node */
|
|
|
|
typedef enum {
|
|
CTX_RELATION,
|
|
CTX_VARIABLE,
|
|
CTX_AGGREGATE,
|
|
CTX_FORM,
|
|
CTX_UNION,
|
|
CTX_STREAM
|
|
} CTX_T;
|
|
|
|
typedef struct ctx {
|
|
struct blk ctx_header;
|
|
CTX_T ctx_type; /* Type of context */
|
|
struct ctx *ctx_source; /* Source context for MODIFY */
|
|
struct ctx *ctx_primary; /* Primary context */
|
|
struct sym *ctx_symbol; /* Context symbol, if any */
|
|
struct rel *ctx_relation; /* Relation of context */
|
|
struct nod *ctx_stream; /* Stream of context */
|
|
struct frm *ctx_form; /* Form block, if any */
|
|
struct fld *ctx_variable; /* Variable reference */
|
|
struct req *ctx_request; /* Request block */
|
|
struct qli_msg *ctx_message; /* Message for data */
|
|
struct nod *ctx_rse; /* RSE node for root context */
|
|
struct nod *ctx_sub_rse; /* RSE node aggregate */
|
|
struct ctx *ctx_parent; /* Parent context for map */
|
|
struct map *ctx_map; /* Map items, if any */
|
|
USHORT ctx_context; /* Context in request */
|
|
} *QLI_CTX;
|
|
|
|
/* Aggregate/union map block */
|
|
|
|
typedef struct map {
|
|
struct blk map_header;
|
|
struct map *map_next; /* Next map in item */
|
|
struct nod *map_node; /* Value for map item */
|
|
USHORT map_position; /* Position in map */
|
|
} *MAP;
|
|
|
|
/* Message block */
|
|
|
|
typedef struct qli_msg {
|
|
struct blk msg_header;
|
|
struct req *msg_request; /* Parent request */
|
|
struct ctx *msg_context; /* Contexts in message */
|
|
struct qli_msg *msg_next; /* Next message in request */
|
|
struct par *msg_parameters; /* Field instances */
|
|
USHORT msg_number; /* Message number */
|
|
USHORT msg_length; /* Message length */
|
|
USHORT msg_parameter; /* Next parameter number */
|
|
UCHAR *msg_buffer; /* Message buffer */
|
|
} *QLI_MSG;
|
|
|
|
/* Field Instance */
|
|
|
|
typedef struct par {
|
|
struct blk par_header;
|
|
DSC par_desc; /* Value descriptor */
|
|
struct par *par_next; /* Next par block in context */
|
|
struct qli_msg *par_message; /* Parent message */
|
|
struct nod *par_value; /* Value */
|
|
USHORT par_parameter; /* Parameter number */
|
|
USHORT par_offset; /* Offset of parameter in message */
|
|
struct par *par_missing; /* Parameter block for missing value */
|
|
} *PAR;
|
|
|
|
/* Print item block */
|
|
|
|
typedef ENUM itm_t
|
|
{
|
|
item_value,
|
|
item_skip,
|
|
item_column,
|
|
item_tab,
|
|
item_space,
|
|
item_new_page,
|
|
item_column_header,
|
|
item_report_header
|
|
} ITM_T;
|
|
|
|
typedef struct itm {
|
|
struct blk itm_header;
|
|
struct nod *itm_value;
|
|
TEXT *itm_edit_string;
|
|
struct pic *itm_picture; /* picture string block */
|
|
TEXT *itm_query_header;
|
|
ITM_T itm_type;
|
|
USHORT itm_flags; /* Misc flags and crud */
|
|
UCHAR itm_dtype;
|
|
UCHAR itm_sub_type;
|
|
USHORT itm_print_offset;
|
|
USHORT itm_print_length;
|
|
USHORT itm_header_offset;
|
|
USHORT itm_header_length;
|
|
USHORT itm_header_segments;
|
|
USHORT itm_count; /* Number of lines to skip */
|
|
USHORT itm_column; /* Logical column number */
|
|
int *itm_stream;
|
|
USHORT itm_kanji_fragment; /* JPN: last kanji on line border */
|
|
STATUS itm_blob_status; /* JPN: status of the last blob fetch */
|
|
} *ITM;
|
|
|
|
#define ITM_overlapped 1 /* Overlapped by another item */
|
|
|
|
/* Print Control Block */
|
|
|
|
typedef struct prt {
|
|
struct blk prt_header;
|
|
struct file *prt_file; /* IB_FILE pointer */
|
|
struct rpt *prt_report; /* Report block (if report) */
|
|
int (*prt_new_page)(); /* New page routine, if any */
|
|
USHORT prt_lines_per_page;
|
|
SSHORT prt_lines_remaining;
|
|
USHORT prt_page_number;
|
|
} *PRT;
|
|
|
|
/* General node blocks */
|
|
|
|
typedef struct nod {
|
|
struct blk nod_header;
|
|
NOD_T nod_type; /* Type of node */
|
|
DSC nod_desc; /* Descriptor */
|
|
PAR nod_import; /* To pass random value */
|
|
PAR nod_export; /* To pass random value */
|
|
SSHORT nod_count; /* Number of arguments */
|
|
UCHAR nod_flags;
|
|
struct nod *nod_arg[1];
|
|
} *QLI_NOD;
|
|
|
|
#define NOD_local 1 /* locally computed expression */
|
|
#define NOD_remote 2
|
|
#define NOD_parameter2 4 /* generate a parameter2 if field */
|
|
#define nod_partial 8
|
|
#define nod_comparison 16
|
|
#define nod_date 32 /* node is a date operation, regardless */
|
|
|
|
/* Execution node positions */
|
|
|
|
#define e_fld_field 0 /* field block */
|
|
#define e_fld_context 1 /* context for field */
|
|
#define e_fld_reference 2 /* points to parameter */
|
|
#define e_fld_subs 3 /* subscripts */
|
|
#define e_fld_count 4
|
|
|
|
#define e_for_request 0 /* Request to be started */
|
|
#define e_for_send 1 /* Message to be sent */
|
|
#define e_for_receive 2 /* Message to be received */
|
|
#define e_for_eof 3 /* End of file parameter */
|
|
#define e_for_rse 4
|
|
#define e_for_statement 5
|
|
#define e_for_count 6
|
|
|
|
#define e_itm_value 0 /* Value of print item */
|
|
#define e_itm_edit_string 1 /* Edit string, if any */
|
|
#define e_itm_header 2 /* Query header, if any */
|
|
#define e_itm_count 3
|
|
|
|
#define e_rse_first 0 /* FIRST clause, if any */
|
|
#define e_rse_boolean 1 /* Boolean clause, if any */
|
|
#define e_rse_sort 2 /* Sort clause, if any */
|
|
#define e_rse_reduced 3 /* Reduced clause, if any */
|
|
#define e_rse_context 4 /* Context block */
|
|
#define e_rse_group_by 5
|
|
#define e_rse_having 6
|
|
#define e_rse_join_type 7
|
|
#ifdef PC_ENGINE
|
|
#define e_rse_index 8
|
|
#endif
|
|
#define e_rse_count 9
|
|
|
|
#define e_prt_list 0 /* List of print items */
|
|
#define e_prt_file_name 1 /* Output file name */
|
|
#define e_prt_output 2 /* Output file */
|
|
#define e_prt_header 3 /* Header to be printed, if any */
|
|
#define e_prt_count 4
|
|
|
|
#define e_prm_prompt 0 /* Prompt string, if any */
|
|
#define e_prm_string 1 /* String node for data */
|
|
#define e_prm_next 2 /* Next prompt in statement */
|
|
#define e_prm_field 3 /* Prototype field, if known */
|
|
#define e_prm_count 4
|
|
|
|
#define e_sto_context 0
|
|
#define e_sto_statement 1
|
|
#define e_sto_request 2
|
|
#define e_sto_send 3
|
|
#define e_sto_count 4
|
|
|
|
#define e_asn_to 0
|
|
#define e_asn_from 1
|
|
#define e_asn_initial 2
|
|
#define e_asn_valid 3 /* Always second-to-last */
|
|
#define e_asn_count 4
|
|
|
|
#define e_mod_send 0
|
|
#define e_mod_statement 1 /* Sub-statement */
|
|
#define e_mod_request 2 /* Parent request for statement */
|
|
#define e_mod_count 3
|
|
|
|
#define e_era_context 0
|
|
#define e_era_request 1 /* Parent request for erase */
|
|
#define e_era_message 2 /* Message to be sent, if any */
|
|
#define e_era_count 3
|
|
|
|
#define e_any_request 0 /* Request to be started */
|
|
#define e_any_send 1 /* Message to be sent */
|
|
#define e_any_receive 2 /* Message to be received */
|
|
#define e_any_rse 3
|
|
#define e_any_count 4
|
|
|
|
#define e_rpt_value 0
|
|
#define e_rpt_statement 1
|
|
#define e_rpt_count 2
|
|
|
|
#define e_if_boolean 0
|
|
#define e_if_true 1
|
|
#define e_if_false 2
|
|
#define e_if_count 3
|
|
|
|
#define e_edt_input 0
|
|
#define e_edt_dbb 1
|
|
#define e_edt_id1 2
|
|
#define e_edt_id2 3
|
|
#define e_edt_name 4
|
|
#define e_edt_count 5
|
|
|
|
#define e_out_statement 0
|
|
#define e_out_file 1
|
|
#define e_out_pipe 2
|
|
#define e_out_print 3
|
|
#define e_out_count 4
|
|
|
|
#define e_fmt_value 0
|
|
#define e_fmt_edit 1
|
|
#define e_fmt_picture 2
|
|
#define e_fmt_count 3
|
|
|
|
/* Statistical expression */
|
|
|
|
#define e_stt_rse 0
|
|
#define e_stt_value 1
|
|
#define e_stt_default 2
|
|
#define e_stt_request 3 /* Request to be started */
|
|
#define e_stt_send 4 /* Message to be sent */
|
|
#define e_stt_receive 5 /* Message to be received */
|
|
#define e_stt_count 6
|
|
|
|
#define e_map_context 0
|
|
#define e_map_map 1
|
|
#define e_map_count 2
|
|
|
|
#define e_ffr_form 0
|
|
#define e_ffr_statement 1
|
|
#define e_ffr_count 2
|
|
|
|
#define e_fup_form 0
|
|
#define e_fup_fields 1
|
|
#define e_fup_tag 2
|
|
#define e_fup_count 3
|
|
|
|
#define e_ffl_form 0
|
|
#define e_ffl_field 1
|
|
#define e_ffl_string 2
|
|
#define e_ffl_count 3
|
|
|
|
#define e_men_statements 0
|
|
#define e_men_labels 1
|
|
#define e_men_string 2
|
|
#define e_men_menu 4
|
|
#define e_men_count 5
|
|
|
|
#define e_fun_args 0
|
|
#define e_fun_function 1
|
|
#define e_fun_request 2 /* Request to be started */
|
|
#define e_fun_send 3 /* Message to be sent */
|
|
#define e_fun_receive 4 /* Message to be received */
|
|
#define e_fun_count 5
|
|
|
|
#define e_syn_statement 0
|
|
#define e_syn_send 1
|
|
#define e_syn_count 2
|
|
|
|
/* A Program global or two */
|
|
|
|
#ifdef REQUESTS_MAIN
|
|
#define EXTERN
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
EXTERN QLI_REQ QLI_requests; /* Requests in statement */
|
|
|
|
#undef EXTERN
|
|
|
|
#endif /* _QLI_EXE_H_ */
|