8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-24 15:23:03 +01:00
firebird-mirror/src/dudley/ddl.h
2009-01-05 08:22:58 +00:00

667 lines
17 KiB
C++

/*
* PROGRAM: JRD Data Definition Utility
* MODULE: ddl.h
* DESCRIPTION: Common header modules
*
* 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 DUDLEY_DDL_H
#define DUDLEY_DDL_H
#include "../jrd/common.h"
#include "../jrd/ibase.h"
const int BLOCK_SIZE = 1024;
const int MAXSYMLEN = 257; // max length of symbol + terminator
const int MAX_PAGE_LEN = 16384; // max allowable length for a database page
const int DDL_MSG_FAC = 2;
/* Action block. Do something. */
/* Actions */
enum act_t {
act_c_database, /* create database */
act_m_database, /* modify database */
act_d_database, /* drop a database */
act_a_relation, /* add relation */
act_m_relation, /* modify existing relation */
act_d_relation, /* drop existing relations */
act_a_gfield, /* add global field */
act_m_gfield, /* modify existing global fields */
act_d_gfield, /* drop global field */
act_a_field, /* add field to relation */
act_m_field, /* modify relation specific fields */
act_d_field, /* drop field from relation */
act_a_index, /* add index */
act_m_index, /* modify index */
act_d_index, /* delete index */
act_a_security, /* add security class */
act_d_security, /* delete security class */
act_m_security, /* modify security class */
act_a_trigger, /* add new trigger */
act_m_trigger, /* modify (replace) trigger */
act_d_trigger, /* delete trigger */
act_a_file, /* add file */
act_a_function, /* add function */
act_d_function, /* drop function */
act_a_function_arg, /* add function */
act_d_function_arg, /* drop function */
act_a_trigger_msg, /* add trigger message */
act_m_trigger_msg, /* modify trigger message */
act_d_trigger_msg, /* drop trigger message */
act_a_type, /* add type for field */
act_m_type, /* modify type for field */
act_d_type, /* drop type for field */
act_a_filter, /* add filter */
act_d_filter, /* drop filter */
act_grant, /* grant user privilege */
act_revoke, /* revoke user privilege */
act_a_shadow, /* add shadow */
act_d_shadow, /* drop shadow */
act_a_generator, /* add generator */
act_s_generator /* reset generator value */
};
struct dbb;
typedef struct act {
enum act_t act_type; // what to do
act* act_next; // next action in system
dbb* act_object; // object in question (dudley_rel, dudley_fld, idx, etc.)
USHORT act_line; // line the action started on
USHORT act_flags;
} *ACT;
const int ACT_ignore = 1; // Ignore the action
/* Context block */
typedef struct dudley_ctx {
struct sym* ctx_name;
struct dudley_rel* ctx_relation;
struct dudley_fld* ctx_field;
bool ctx_view_rse;
USHORT ctx_context_id;
} *DUDLEY_CTX;
/* Database Definition Block */
typedef struct dbb {
struct sym* dbb_name;
struct dudley_rel* dbb_relations;
struct gfl* dbb_fields;
dbb* dbb_next;
struct sym* dbb_security_class;
isc_db_handle dbb_handle;
isc_tr_handle dbb_transaction;
struct txt* dbb_description;
USHORT dbb_flags;
struct sym* dbb_file_name;
struct fil* dbb_files;
USHORT dbb_page_size;
ULONG dbb_length; /* Length of database in pages, if known */
struct fil* dbb_logfiles;
struct fil* dbb_overflow;
SLONG dbb_chkptlen;
SSHORT dbb_numbufs;
SSHORT dbb_bufsize;
SLONG dbb_grp_cmt_wait;
struct fil* dbb_cache_file;
} *DBB;
enum dbb_flags_vals {
DBB_null_description = 1,
DBB_null_security_class = 2,
DBB_create_database = 4
// DBB_drop_log = 8,
// DBB_log_serial = 16,
// DBB_log_preallocated = 32,
// DBB_log_default = 64,
// DBB_cascade = 128,
// DBB_drop_cache = 256
};
enum ods_versions {
DB_VERSION_DDL4 = 4, // ods4 db
DB_VERSION_DDL6 = 6, // ods6 db
DB_VERSION_DDL8 = 8 // ods8 db
};
/* Field block. Fields are what farms and databases are all about */
typedef struct dudley_fld {
SSHORT fld_dtype; /* data type of field */
SSHORT fld_length; /* field length in bytes */
SSHORT fld_scale; /* scale factor */
SSHORT fld_position; /* field position */
SSHORT fld_segment_length;
SSHORT fld_sub_type;
bool fld_has_sub_type;
SSHORT fld_dimension; /* size of multi-dim. array */
SSHORT fld_system; /* 0 if field is user defined */
USHORT fld_flags; /* misc trash */
dudley_fld* fld_next; /* next field in relation */
struct dudley_rel* fld_relation; /* relation */
struct sym* fld_security_class;
dudley_ctx* fld_context; /* context for view */
dbb* fld_database; /* database for global fields */
struct sym* fld_name; /* field name */
struct sym* fld_source; /* name of global field */
dudley_fld* fld_source_field; /* global field for computed field */
struct sym* fld_base; /* base field for views */
struct sym* fld_query_name; /* query name */
struct dudley_nod* fld_query_header; /* query header */
struct sym* fld_edit_string; /* edit string */
struct dudley_nod* fld_computed; /* computed by expression */
struct dudley_nod* fld_missing; /* missing value */
struct dudley_nod* fld_default; /* default value */
struct dudley_nod* fld_validation; /* valid if value */
struct txt* fld_description; /* description of field */
struct txt* fld_compute_src; /* computed_by source */
struct txt* fld_valid_src; /* validation source */
SLONG* fld_ranges; /* ranges for multi-dim. array */
} *DUDLEY_FLD;
enum fld_flags_vals {
fld_explicit_position = 1,
fld_modify = 2,
fld_local = 4,
fld_null_description = 8,
fld_null_security_class = 16,
fld_null_validation = 32,
fld_explicit_system = 64,
fld_null_missing_value = 128,
fld_null_edit_string = 256,
fld_null_query_name = 512,
fld_null_query_header = 1024
};
/* File description block */
typedef struct fil {
SLONG fil_length; /* File length in pages */
SLONG fil_start; /* Starting page */
struct sym* fil_name; /* File name */
fil* fil_next; /* next file */
SSHORT fil_shadow_number; /* shadow number if part of shadow */
SSHORT fil_manual; /* flag to indicate manual shadow */
SSHORT fil_partitions; /* number of log file partitions */
SSHORT fil_raw; /* on raw device? */
SSHORT fil_conditional; /* flag to indicate conditional shadow */
} *FIL;
/* Filter block */
typedef struct filter {
struct sym* filter_name; /* symbol for filter name */
struct txt* filter_description; /* description of filter */
struct sym* filter_module_name; /* symbol for module name */
struct sym* filter_entry_point; /* symbol for entrypoint */
SSHORT filter_input_sub_type;
SSHORT filter_output_sub_type;
} *FILTER;
/* Function argument block. */
typedef struct funcarg {
struct sym* funcarg_funcname; /* symbol for function name */
SSHORT funcarg_position; /* argument position */
SSHORT funcarg_mechanism; /* argument passed by value, or by reference */
SSHORT funcarg_dtype; /* data type of argument */
SSHORT funcarg_scale; /* scale factor */
SSHORT funcarg_length; /* argument length in bytes */
SSHORT funcarg_return_arg; /* argument is the designated return arg */
SSHORT funcarg_sub_type; /* sub_type of text */
bool funcarg_has_sub_type; /* null field for sub_type field */
funcarg* funcarg_next; /* next field in function */
} *FUNCARG;
enum funcarg_mechanism_vals {
FUNCARG_mechanism_value = 0,
FUNCARG_mechanism_reference,
FUNCARG_mechanism_descriptor,
FUNCARG_mechanism_blob_struc,
FUNCARG_mechanism_sc_array_desc
};
/* Function description block */
typedef struct func {
struct sym* func_name; /* symbol for function name */
struct sym* func_query_name; /* symbol for query name */
struct sym* func_module_name; /* symbol for module name */
struct sym* func_entry_point; /* symbol for entrypoint */
SSHORT func_return_arg; /* return argument position */
func* func_next; /* next function in database */
dbb* func_database; /* database for function */
struct txt* func_description; /* description of function */
funcarg* func_args; /* Known function arguments */
funcarg* func_return; /* Return argument */
} *FUNC;
/* Index description block */
enum idx_direction
{
IDX_type_none = 0,
IDX_type_descend = 1
};
typedef struct dudley_idx {
USHORT idx_count; /* Number of fields */
bool idx_unique; /* true if unique index */
bool idx_inactive; /* false if index is active */
idx_direction idx_type; /* true descending */
USHORT idx_flags; /* Indicate which attributes have changed */
struct sym* idx_name; /* Index name */
struct sym* idx_relation; /* Relation in question */
struct txt* idx_description; /* Description pointer */
struct sym* idx_field[1]; /* Fields */
} *DUDLEY_IDX;
enum idx_flags_vals {
IDX_active_flag = 1,
IDX_unique_flag = 2,
IDX_null_description = 4,
IDX_type_flag = 8,
IDX_statistics_flag = 16
};
static inline size_t IDX_LEN(const size_t cnt)
{
return sizeof (struct dudley_idx) +
(cnt ? cnt - 1 : 0) * sizeof (((DUDLEY_IDX) NULL)->idx_field[0]);
}
/* Linked list stack stuff */
struct dudley_lls {
struct dudley_nod *lls_object; // object on stack
dudley_lls* lls_next; // next item on stack
};
/* General Syntax node, produced by parser */
enum nod_t {
nod_field = 1, nod_literal, nod_value,
nod_and, nod_or, nod_not,
nod_eql, nod_neq, nod_geq,
nod_leq, nod_gtr, nod_lss,
nod_containing, nod_matches, nod_any,
nod_unique, nod_add, nod_multiply,
nod_divide, nod_subtract, nod_negate,
nod_msg, nod_for, nod_send,
nod_receive, nod_block, nod_select,
nod_boolean, nod_projection, nod_sort,
nod_store, nod_modify, nod_erase,
nod_if, nod_assignment, nod_rse,
nod_first, nod_context, nod_end,
nod_label, nod_leave, nod_loop,
nod_max, nod_min, nod_count,
nod_total, nod_average, nod_list,
nod_deferred, nod_between, nod_missing,
nod_field_name, nod_name, nod_starts,
nod_from, nod_fid, nod_concatenate,
nod_abort, nod_null, nod_user_name,
nod_post, nod_function, nod_gen_id,
nod_uppercase, nod_sleuth, nod_over,
nod_set_generator, nod_index,
nod_lowercase
};
typedef struct dudley_nod {
enum nod_t nod_type; /* node type */
UCHAR* nod_blr; /* symbolic blr string */
SSHORT nod_count; /* number of sub-items */
dudley_nod* nod_arg[1]; /* argument */
} *DUDLEY_NOD;
static inline size_t NOD_LEN(const size_t cnt)
{
return sizeof(dudley_nod) +
(cnt ? cnt - 1 : 0) * sizeof (((DUDLEY_NOD) NULL)->nod_arg[0]);
}
/* Relation block, not to be confused with siblings or in-laws */
typedef struct dudley_rel {
dbb* rel_database; /* parent database */
struct sym* rel_filename; /* external filename */
dudley_fld* rel_fields; /* linked list of known fields */
struct sym* rel_name; /* symbol for relation */
struct sym* rel_security_class; /* name of security class */
dudley_rel* rel_next; /* next relation in database */
dudley_nod* rel_rse; /* view rse */
struct txt* rel_description; /* description of relation */
struct txt* rel_view_source; /* source dml for view definition */
USHORT rel_field_position; /* highest used field position */
SSHORT rel_system; /* 0 if relation is user defined */
USHORT rel_flags;
} *DUDLEY_REL;
enum rel_flags_values {
rel_null_description = 1,
rel_null_security_class = 2,
rel_explicit_system = 4,
rel_marked_for_delete = 8,
rel_null_ext_file = 16,
rel_marked_for_modify = 32,
rel_marked_for_creation = 64
};
/* Security class handling */
typedef struct scl {
struct sym* scl_name; /* name of security class */
struct txt* scl_description; /* description of security class */
struct sce* scl_entries; /* list of entries */
} *SCL;
const int SCL_write = 2;
/* Security entry */
typedef struct sce {
sce* sce_next; /* next security item in list */
SLONG sce_privileges; /* bitmask of privileges */
UCHAR* sce_idents[20]; /* misc identification stuff */
UCHAR sce_strings[1];
} *SCE;
/* String block for build DYN & BLR strings */
class str {
public:
UCHAR* str_start; /* start of string buffer */
UCHAR* str_current; /* current position in string being built */
USHORT str_length; /* length of buffer */
inline void add_byte(const int byte) {
*str_current++ = byte;
}
inline void add_word(const int word) {
add_byte(word);
add_byte(word >> 8);
}
};
typedef str* STR;
/* Symbol block, also used for hash table */
enum sym_t {
SYM_keyword, /* unspecified */
SYM_context, /* context variable */
SYM_database, /* seems like a good idea */
SYM_relation, /* if you don't know your relations, how do you know your friends? */
SYM_global, /* Global field */
SYM_field, /* Local field */
SYM_function, /* UDF */
SYM_trigger /* any named element deserves to be hashed */
};
typedef struct sym {
const char* sym_string; /* address of asciz string */
SSHORT sym_length; /* length of string (exc. term.) */
enum sym_t sym_type; /* symbol type */
SSHORT sym_keyword; /* keyword number, if keyword */
dudley_ctx* sym_object; /* general pointer to object */
sym* sym_collision; /* collision pointer */
sym* sym_homonym; /* homonym pointer */
TEXT sym_name[1]; /* space for name, if necessary */
} *SYM;
const size_t SYM_LEN = sizeof(sym);
/* Trigger block */
/* these are the externally visible trigger types */
typedef enum {
trg_type_none = 0, /* pre store */
trg_store = 1, /* pre store */
trg_post_store = 2,
trg_modify = 3, /* pre modify */
trg_post_modify = 4,
trg_pre_erase = 5,
trg_erase = 6 /* post erase */
} TRG_T;
/* these types are used in parsing */
enum parse_trig_types {
trig_pre = 0,
trig_post = 1,
trig_sto = 2,
trig_mod = 4,
trig_era = 8, // erase defaults to post
trig_inact = 16
};
typedef struct dudley_trg {
TRG_T trg_type;
DUDLEY_REL trg_relation;
DUDLEY_NOD trg_statement; /* blr */
sym* trg_name; /* symbol for trigger */
struct txt* trg_description; /* description of relation */
struct txt* trg_source; /* source of trigger */
SSHORT trg_sequence;
SSHORT trg_inactive; /* 0 = on, 1 = off */
USHORT trg_mflag; /* modify attributes */
} *DUDLEY_TRG;
/* trg_modify_flag */
enum trg_modify_flag_vals {
trg_mflag_onoff = 1,
trg_mflag_type = 2,
trg_mflag_seqnum = 4,
trg_mflag_order = 8
};
/* Trigger message block */
typedef struct trgmsg {
sym* trgmsg_trg_name; /* symbol for trigger */
SSHORT trgmsg_number; /* abort code */
sym* trgmsg_text;
} *TRGMSG;
typedef enum {
trgmsg_none = 0,
trgmsg_add = 1,
trgmsg_modify = 2,
trgmsg_drop = 3
} TRGMSG_T;
/* Text block */
typedef struct txt {
TEXT* txt_file;
ULONG txt_position;
USHORT txt_length;
USHORT txt_start_line;
} *TXT;
/* Type block */
typedef struct typ {
sym* typ_field_name; /* field name */
sym* typ_name; /* type name */
SSHORT typ_type; /* type value */
txt* typ_description; /* description of relation */
} *TYP;
/* User privilege block */
typedef struct userpriv {
sym* userpriv_relation;
struct usre* userpriv_userlist;
struct upfe* userpriv_upflist;
USHORT userpriv_flags;
} *USERPRIV;
/* user privilege flags */
enum userpriv_flags_vals {
USERPRIV_select = 1,
USERPRIV_delete = 2,
USERPRIV_insert = 4,
USERPRIV_update = 8,
USERPRIV_grant = 16
};
/* rdb$user_privilege.rdb$privilege */
static const char* const UPRIV_SELECT = "SELECT";
static const char* const UPRIV_DELETE = "DELETE";
static const char* const UPRIV_INSERT = "INSERT";
static const char* const UPRIV_UPDATE = "UPDATE";
/* user name entry */
typedef struct usre {
usre* usre_next;
sym* usre_name;
} *USRE;
/* update field entry */
typedef struct upfe {
upfe* upfe_next;
sym* upfe_fldname;
} *UPFE;
/* Data types */
#include "../jrd/dsc.h"
/* Constant block */
typedef struct con {
dsc con_desc;
UCHAR con_data[1];
} *CON;
/* Program globals */
typedef enum lan_t {
lan_undef,
lan_pascal,
lan_fortran,
lan_cobol,
lan_ansi_cobol,
lan_c,
lan_ada,
lan_cxx
} LAN_T;
#include "parse.h"
struct DudleyGlobals {
enum lan_t language;
bool DDL_eof;
USHORT DDL_errors;
USHORT DDL_line;
bool DDL_interactive;
bool DDL_quit;
bool DDL_dynamic;
bool DDL_drop_database;
bool DDL_service;
bool DDL_replace;
bool DDL_description;
bool DDL_extract;
bool DDL_trace;
bool DDL_version;
#ifdef TRUSTED_AUTH
bool DDL_trusted;
#endif
const TEXT* DDL_prompt;
const TEXT* DDL_file_name;
TEXT DYN_file_name[256];
const TEXT* DB_file_name;
TEXT DDL_file_string[256];
TEXT DB_file_string[256];
const TEXT* DDL_default_user;
const TEXT* DDL_default_password;
ACT DDL_actions;
DBB database;
// from parse.h
tok DDL_token;
};
extern DudleyGlobals dudleyGlob;
#include "../dudley/ddl_proto.h"
enum nod_val_pos {
s_rse_first = 0, // FIRST clause, if any
s_rse_boolean, // Boolean clause, if any
s_rse_sort, // Sort clause, if any
s_rse_reduced, // Reduced clause, if any
s_rse_contexts, // Relation block
s_rse_count,
s_stt_rse = 0,
s_stt_value,
s_stt_default,
s_stt_count,
s_fld_field = 0, // Field block
s_fld_context, // Context block
s_fld_name,
s_fld_subs,
s_fld_count,
s_if_boolean = 0,
s_if_true,
s_if_false,
s_for_rse = 0,
s_for_action,
s_store_rel = 0,
s_store_action,
s_mod_old_ctx = 0,
s_mod_new_ctx,
s_mod_action
};
#endif // DUDLEY_DDL_H