mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-26 08:03:03 +01:00
517 lines
17 KiB
C
517 lines
17 KiB
C
/*
|
|
* PROGRAM: JRD Access Method
|
|
* MODULE: ods.h
|
|
* DESCRIPTION: On disk structure 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): ______________________________________.
|
|
*
|
|
* 2000.11.29 Patrick J. P. Griffin: fixed bug SF #116733
|
|
* Add typedef struct gpg to properly document the layout of the generator page
|
|
* 2002.08.26 Dmitry Yemanov: minor ODS change (new indices on system tables)
|
|
*
|
|
* 2002.10.29 Sean Leyne - Removed obsolete "Netware" port
|
|
*
|
|
* 2002.10.30 Sean Leyne - Removed support for obsolete "PC_PLATFORM" define
|
|
*
|
|
*/
|
|
|
|
#ifndef _JRD_ODS_H_
|
|
#define _JRD_ODS_H_
|
|
|
|
/**********************************************************************
|
|
**
|
|
** NOTE:
|
|
**
|
|
** ODS 5 was shipped with version 3.3 but no longer supported
|
|
** ODS 6 and ODS 7 never went out the door
|
|
** ODS 8 was shipped with version 4.0
|
|
** ODS 9 is going to be shipped with version 4.5
|
|
**
|
|
***********************************************************************/
|
|
|
|
/* ODS major version -- major versions are not compatible */
|
|
|
|
#define ODS_VERSION6 6 /* on-disk structure as of v3.0 */
|
|
#define ODS_VERSION7 7 /* new on disk structure for fixing index bug */
|
|
#define ODS_VERSION8 8 /* new btree structure to support pc semantics */
|
|
#define ODS_VERSION9 9 /* btree leaf pages are always propogated up */
|
|
#define ODS_VERSION10 10 /* V6.0 features. SQL delimited idetifier,
|
|
SQLDATE, and 64-bit exact numeric
|
|
type */
|
|
|
|
/* ODS minor version -- minor versions ARE compatible, but may be
|
|
increasingly functional. Add new minor versions, but leave previous
|
|
names intact */
|
|
|
|
/* Minor versions for ODS 6 */
|
|
|
|
#define ODS_GRANT6 1 /* adds fields for field level grant */
|
|
#define ODS_INTEGRITY6 2 /* adds fields for referential integrity */
|
|
#define ODS_FUNCTIONS6 3 /* modifies type of RDB$MODULE_NAME field */
|
|
#define ODS_SQLNAMES6 4 /* permits SQL security on > 27 SCHAR names */
|
|
#define ODS_CURRENT6 4
|
|
|
|
/* Minor versions for ODS 7 */
|
|
|
|
#define ODS_FUNCTIONS7 1 /* modifies type of RDB$MODULE_NAME field */
|
|
#define ODS_SQLNAMES7 2 /* permits SQL security on > 27 SCHAR names */
|
|
#define ODS_CURRENT7 2
|
|
|
|
/* Minor versions for ODS 8 */
|
|
|
|
#define ODS_CASCADE_RI8 1 /* permits cascading referential integrity */
|
|
/* ODS 8.2 is the same as ODS 8.1 */
|
|
#define ODS_CURRENT8 2
|
|
|
|
/* Minor versions for ODS 9 */
|
|
|
|
#define ODS_CURRENT_9_0 0 /* SQL roles & Index garbage collection */
|
|
#define ODS_SYSINDEX9 1 /* Index on RDB$CHECK_CONSTRAINTS (RDB$TRIGGER_NAME) */
|
|
#define ODS_CURRENT9 1
|
|
|
|
/* Minor versions for ODS 10 */
|
|
|
|
#define ODS_CURRENT10_0 0 /* V6.0 features. SQL delimited identifier,
|
|
SQLDATE, and 64-bit exact numeric type */
|
|
#define ODS_SYSINDEX10 1 /* New system indices */
|
|
#define ODS_CURRENT10 1
|
|
|
|
/* useful ODS macros. These are currently used to flag the version of the
|
|
system triggers and system indices in ini.e */
|
|
|
|
#define ENCODE_ODS(major,minor) (((major) << 4) | (minor))
|
|
#define ODS_8_0 ENCODE_ODS (ODS_VERSION8, 0)
|
|
#define ODS_8_1 ENCODE_ODS (ODS_VERSION8, 1)
|
|
#define ODS_9_0 ENCODE_ODS (ODS_VERSION9, 0)
|
|
#define ODS_9_1 ENCODE_ODS (ODS_VERSION9, 1)
|
|
#define ODS_10_0 ENCODE_ODS (ODS_VERSION10, 0)
|
|
#define ODS_10_1 ENCODE_ODS (ODS_VERSION10, 1)
|
|
|
|
/* Decode ODS version to Major and Minor parts. The 4 LSB's are minor and
|
|
the next 4 bits are major version number */
|
|
#define DECODE_ODS_MAJOR(ods_version) ((ods_version & 0xFFF0) >> 4)
|
|
#define DECODE_ODS_MINOR(ods_version) (ods_version & 0x000F)
|
|
|
|
/* Set current ODS major and minor version */
|
|
|
|
#define ODS_VERSION ODS_VERSION10 /* current ods major version -- always
|
|
the highest */
|
|
#define ODS_CURRENT ODS_CURRENT10 /* the highest defined minor version
|
|
number for this ODS_VERSION!! */
|
|
#define ODS_CURRENT_VERSION ODS_10_1 /* Current ODS version in use which includes
|
|
both Major and Minor ODS versions! */
|
|
|
|
|
|
#define USER_REL_INIT_ID_ODS8 31 /* ODS <= 8 */
|
|
#define USER_DEF_REL_INIT_ID 128 /* ODS >= 9 */
|
|
|
|
|
|
/* Page types */
|
|
|
|
#define pag_undefined 0
|
|
#define pag_header 1 /* Database header page */
|
|
#define pag_pages 2 /* Page inventory page */
|
|
#define pag_transactions 3 /* Transaction inventory page */
|
|
#define pag_pointer 4 /* Pointer page */
|
|
#define pag_data 5 /* Data page */
|
|
#define pag_root 6 /* Index root page */
|
|
#define pag_index 7 /* Index (B-tree) page */
|
|
#define pag_blob 8 /* Blob data page */
|
|
#define pag_ids 9 /* Gen-ids */
|
|
#define pag_log 10 /* Write ahead log information */
|
|
#define pag_max 10 /* Max page type */
|
|
|
|
#define HEADER_PAGE 0
|
|
#define LOG_PAGE 2
|
|
|
|
#define MIN_PAGE_SIZE 1024
|
|
|
|
#define MAX_PAGE_SIZE 16384
|
|
#define DEFAULT_PAGE_SIZE 4096
|
|
|
|
/* Basic page header */
|
|
|
|
typedef struct pag {
|
|
SCHAR pag_type;
|
|
SCHAR pag_flags;
|
|
USHORT pag_checksum;
|
|
ULONG pag_generation;
|
|
ULONG pag_seqno; /* WAL seqno of last update */
|
|
ULONG pag_offset; /* WAL offset of last update */
|
|
} *PAG;
|
|
|
|
|
|
/* Blob page */
|
|
|
|
typedef struct blp {
|
|
struct pag blp_header;
|
|
SLONG blp_lead_page; /* First page of blob (for redundancy only) */
|
|
SLONG blp_sequence; /* Sequence within blob */
|
|
USHORT blp_length; /* Bytes on page */
|
|
USHORT blp_pad; /* Unused */
|
|
SLONG blp_page[1]; /* Page number if level 1 */
|
|
} *BLP;
|
|
|
|
#define blp_data blp_page /* Formerly defined field */
|
|
#define BLP_SIZE OFFSETA (BLP, blp_page)
|
|
|
|
#define blp_pointers 1 /* Blob pointer page, not data page */
|
|
|
|
|
|
/* B-tree node */
|
|
|
|
typedef struct btn
|
|
{
|
|
UCHAR btn_prefix; /* size of compressed prefix */
|
|
UCHAR btn_length; /* length of data in node */
|
|
UCHAR btn_number[4]; /* page or record number */
|
|
UCHAR btn_data[1];
|
|
} *BTN;
|
|
|
|
#define BTN_SIZE 6
|
|
|
|
/* B-tree page ("bucket") */
|
|
|
|
typedef struct btr {
|
|
struct pag btr_header;
|
|
SLONG btr_sibling; /* right sibling page */
|
|
SLONG btr_left_sibling; /* left sibling page */
|
|
SLONG btr_prefix_total; /* sum of all prefixes on page */
|
|
USHORT btr_relation; /* relation id for consistency */
|
|
USHORT btr_length; /* length of data in bucket */
|
|
UCHAR btr_id; /* index id for consistency */
|
|
UCHAR btr_level; /* index level (0 = leaf) */
|
|
struct btn btr_nodes[1];
|
|
} *BTR;
|
|
|
|
#define btr_dont_gc 1 /* Don't garbage-collect this page */
|
|
#define btr_not_propogated 2 /* page is not propogated upward */
|
|
#define btr_descending 8 /* Page/bucket is part of a descending index */
|
|
|
|
#define MAX_NODES ((dbb->dbb_page_size - OFFSETA (BTR, btr_nodes)) / sizeof (struct btn))
|
|
|
|
|
|
/* Data Page */
|
|
|
|
typedef struct dpg {
|
|
struct pag dpg_header;
|
|
SLONG dpg_sequence; /* Sequence number in relation */
|
|
USHORT dpg_relation; /* Relation id */
|
|
USHORT dpg_count; /* Number of record segments on page */
|
|
struct dpg_repeat {
|
|
USHORT dpg_offset; /* Offset of record fragment */
|
|
USHORT dpg_length; /* Length of record fragment */
|
|
} dpg_rpt[1];
|
|
} *DPG;
|
|
|
|
#ifdef __cplusplus
|
|
#define DPG_SIZE (sizeof (dpg) - sizeof (dpg::dpg_repeat))
|
|
#else
|
|
#define DPG_SIZE (sizeof (struct dpg) - sizeof(struct dpg_repeat))
|
|
#endif
|
|
|
|
#define dpg_orphan 1 /* Data page is NOT in pointer page */
|
|
#define dpg_full 2 /* Pointer page is marked FULL */
|
|
#define dpg_large 4 /* Large object is on page */
|
|
|
|
|
|
/* Index root page */
|
|
|
|
typedef struct irt {
|
|
struct pag irt_header;
|
|
USHORT irt_relation; /* relation id (for consistency) */
|
|
USHORT irt_count; /* Number of indices */
|
|
struct irt_repeat {
|
|
SLONG irt_root; /* page number of index root */
|
|
union {
|
|
float irt_selectivity; /* selectivity of index */
|
|
SLONG irt_transaction; /* transaction in progress */
|
|
} irt_stuff;
|
|
USHORT irt_desc; /* offset to key descriptions */
|
|
UCHAR irt_keys; /* number of keys in index */
|
|
UCHAR irt_flags;
|
|
} irt_rpt[1];
|
|
} *IRT;
|
|
|
|
/* key descriptor */
|
|
|
|
typedef struct irtd {
|
|
USHORT irtd_field;
|
|
USHORT irtd_itype;
|
|
} IRTD;
|
|
|
|
#define irt_unique 1
|
|
#define irt_descending 2
|
|
#define irt_in_progress 4
|
|
#define irt_foreign 8
|
|
#define irt_primary 16
|
|
#define irt_expression 32
|
|
|
|
#define STUFF_COUNT 4
|
|
#define END_LEVEL -1
|
|
#define END_BUCKET -2
|
|
|
|
#ifdef IGNORE_NULL_IDX_KEY
|
|
#define END_NON_NULL -3
|
|
#define SPECIAL_BTN_NUMBER_COUNT 3 /* This is later used in fast_load() for
|
|
calculating fill_limit. */
|
|
#endif /* IGNORE_NULL_IDX_KEY */
|
|
|
|
|
|
|
|
/* Header page */
|
|
|
|
typedef struct hdr {
|
|
struct pag hdr_header;
|
|
USHORT hdr_page_size; /* Page size of database */
|
|
USHORT hdr_ods_version; /* Version of on-disk structure */
|
|
SLONG hdr_PAGES; /* Page number of PAGES relation */
|
|
ULONG hdr_next_page; /* Page number of next hdr page */
|
|
SLONG hdr_oldest_transaction; /* Oldest interesting transaction */
|
|
SLONG hdr_oldest_active; /* Oldest transaction thought active */
|
|
SLONG hdr_next_transaction; /* Next transaction id */
|
|
USHORT hdr_sequence; /* sequence number of file */
|
|
USHORT hdr_flags; /* Flag settings, see below */
|
|
SLONG hdr_creation_date[2]; /* Date/time of creation */
|
|
SLONG hdr_attachment_id; /* Next attachment id */
|
|
SLONG hdr_shadow_count; /* Event count for shadow synchronization */
|
|
SSHORT hdr_implementation; /* Implementation number */
|
|
USHORT hdr_ods_minor; /* Update version of ODS */
|
|
USHORT hdr_ods_minor_original; /* Update version of ODS at creation */
|
|
USHORT hdr_end; /* offset of HDR_end in page */
|
|
ULONG hdr_page_buffers; /* Page buffers for database cache */
|
|
SLONG hdr_bumped_transaction; /* Bumped transaction id for log optimization */
|
|
SLONG hdr_oldest_snapshot; /* Oldest snapshot of active transactions */
|
|
SLONG hdr_misc[4]; /* Stuff to be named later */
|
|
UCHAR hdr_data[1]; /* Misc data */
|
|
} *HDR;
|
|
|
|
#define HDR_SIZE OFFSETA (HDR, hdr_data)
|
|
#define hdr_cache_file hdr_data
|
|
|
|
/* Header page clumplets */
|
|
|
|
/* Data items have the format
|
|
|
|
<type_byte> <length_byte> <data...>
|
|
*/
|
|
|
|
#define HDR_end 0
|
|
#define HDR_root_file_name 1 /* Original name of root file */
|
|
#define HDR_journal_server 2 /* Name of journal server */
|
|
#define HDR_file 3 /* Secondary file */
|
|
#define HDR_last_page 4 /* Last logical page number of file */
|
|
#define HDR_unlicensed 5 /* Count of unlicensed activity */
|
|
#define HDR_sweep_interval 6 /* Transactions between sweeps */
|
|
#define HDR_log_name 7 /* replay log name */
|
|
#define HDR_journal_file 8 /* Intermediate journal file */
|
|
#define HDR_password_file_key 9 /* Key to compare to password db */
|
|
#define HDR_backup_info 10 /* WAL backup information */
|
|
#define HDR_cache_file 11 /* Shared cache file */
|
|
#define HDR_max 11 /* Maximum HDR_clump value */
|
|
|
|
/* Header page flags */
|
|
|
|
#define hdr_active_shadow 0x1 /* 1 file is an active shadow file */
|
|
#define hdr_force_write 0x2 /* 2 database is forced write */
|
|
#define hdr_short_journal 0x4 /* 4 short-term journalling */
|
|
#define hdr_long_journal 0x8 /* 8 long-term journalling */
|
|
#define hdr_no_checksums 0x10 /* 16 don't calculate checksums */
|
|
#define hdr_no_reserve 0x20 /* 32 don't reserve space for versions */
|
|
#define hdr_disable_cache 0x40 /* 64 disable using shared cache file */
|
|
#define hdr_shutdown 0x80 /* 128 database is shutdown */
|
|
#define hdr_SQL_dialect_3 0x100 /* 256 database SQL dialect 3 */
|
|
#define hdr_read_only 0x200 /* 512 Database in ReadOnly. If not set, DB is RW */
|
|
|
|
|
|
typedef struct sfd {
|
|
SLONG sfd_min_page; /* Minimum page number */
|
|
SLONG sfd_max_page; /* Maximum page number */
|
|
UCHAR sfd_index; /* Sequence of secondary file */
|
|
UCHAR sfd_file[1]; /* Given file name */
|
|
} SFD;
|
|
|
|
/* Page Inventory Page */
|
|
|
|
typedef struct pip {
|
|
struct pag pip_header;
|
|
SLONG pip_min; /* Lowest (possible) free page */
|
|
UCHAR pip_bits[1];
|
|
} *PIP;
|
|
|
|
|
|
/* Pointer Page */
|
|
|
|
typedef struct ppg {
|
|
struct pag ppg_header;
|
|
SLONG ppg_sequence; /* Sequence number in relation */
|
|
SLONG ppg_next; /* Next pointer page in relation */
|
|
USHORT ppg_count; /* Number of slots active */
|
|
USHORT ppg_relation; /* Relation id */
|
|
USHORT ppg_min_space; /* Lowest slot with space available */
|
|
USHORT ppg_max_space; /* Highest slot with space available */
|
|
SLONG ppg_page[1]; /* Data page vector */
|
|
} *PPG;
|
|
|
|
#define ppg_bits ppg_page
|
|
|
|
#define ppg_eof 1 /* Last pointer page in relation */
|
|
|
|
/* Transaction Inventory Page */
|
|
|
|
typedef struct tip {
|
|
struct pag tip_header;
|
|
SLONG tip_next; /* Next transaction inventory page */
|
|
UCHAR tip_transactions[1];
|
|
} *TIP;
|
|
|
|
|
|
/* Generator Page */
|
|
|
|
typedef struct gpg {
|
|
struct pag gpg_header;
|
|
SLONG gpg_sequence; /* Sequence number */
|
|
SLONG gpg_waste1; /* overhead carried for backward compatibility */
|
|
USHORT gpg_waste2; /* overhead carried for backward compatibility */
|
|
USHORT gpg_waste3; /* overhead carried for backward compatibility */
|
|
USHORT gpg_waste4; /* overhead carried for backward compatibility */
|
|
USHORT gpg_waste5; /* overhead carried for backward compatibility */
|
|
SINT64 gpg_values[1]; /* Generator vector */
|
|
} *GPG;
|
|
|
|
|
|
/* Record header */
|
|
|
|
typedef struct rhd {
|
|
SLONG rhd_transaction; /* transaction id */
|
|
SLONG rhd_b_page; /* back pointer */
|
|
USHORT rhd_b_line; /* back line */
|
|
USHORT rhd_flags; /* flags, etc */
|
|
UCHAR rhd_format; /* format version */
|
|
UCHAR rhd_data[1];
|
|
} *RHD;
|
|
|
|
#define RHD_SIZE OFFSETA (RHD, rhd_data)
|
|
|
|
/* Record header for fragmented record */
|
|
|
|
typedef struct rhdf {
|
|
SLONG rhdf_transaction; /* transaction id */
|
|
SLONG rhdf_b_page; /* back pointer */
|
|
USHORT rhdf_b_line; /* back line */
|
|
USHORT rhdf_flags; /* flags, etc */
|
|
UCHAR rhdf_format; /* format version */
|
|
SLONG rhdf_f_page; /* next fragment page */
|
|
USHORT rhdf_f_line; /* next fragment line */
|
|
UCHAR rhdf_data[1]; /* Blob data */
|
|
} *RHDF;
|
|
|
|
#define RHDF_SIZE OFFSETA (RHDF, rhdf_data)
|
|
|
|
/* Record header for blob header */
|
|
|
|
typedef struct blh {
|
|
SLONG blh_lead_page; /* First data page number */
|
|
SLONG blh_max_sequence; /* Number of data pages */
|
|
USHORT blh_max_segment; /* Longest segment */
|
|
USHORT blh_flags;
|
|
UCHAR blh_level; /* Number of address levels */
|
|
SLONG blh_count; /* Total number of segments */
|
|
SLONG blh_length; /* Total length of data */
|
|
USHORT blh_sub_type; /* Blob sub-type */
|
|
USHORT blh_unused;
|
|
SLONG blh_page[1]; /* Page vector for blob pages */
|
|
} *BLH;
|
|
|
|
#define blh_data blh_page
|
|
#define BLH_SIZE OFFSETA (BLH, blh_page)
|
|
|
|
#define rhd_deleted 1 /* record is logically deleted */
|
|
#define rhd_chain 2 /* record is an old version */
|
|
#define rhd_fragment 4 /* record is a fragment */
|
|
#define rhd_incomplete 8 /* record is incomplete */
|
|
#define rhd_blob 16 /* isn't a record but a blob */
|
|
#define rhd_stream_blob 32 /* blob is a stream mode blob */
|
|
#define rhd_delta 32 /* prior version is differences only */
|
|
#define rhd_large 64 /* object is large */
|
|
#define rhd_damaged 128 /* object is known to be damaged */
|
|
#define rhd_gc_active 256 /* garbage collecting dead record version */
|
|
|
|
/* additions for write ahead log */
|
|
|
|
#define CTRL_FILE_LEN 255 /* Pre allocated size of file name */
|
|
#define CLUMP_ADD 0
|
|
#define CLUMP_REPLACE 1
|
|
#define CLUMP_REPLACE_ONLY 2
|
|
|
|
/* Log page */
|
|
|
|
typedef struct ctrl_pt {
|
|
SLONG cp_seqno;
|
|
SLONG cp_offset;
|
|
SLONG cp_p_offset;
|
|
SSHORT cp_fn_length;
|
|
} CP;
|
|
|
|
typedef struct log_info_page {
|
|
struct pag log_header;
|
|
SLONG log_flags; /* flags */
|
|
CP log_cp_1; /* control point 1 */
|
|
CP log_cp_2; /* control point 2 */
|
|
CP log_file; /* current file */
|
|
SLONG log_next_page; /* Next log page */
|
|
SLONG log_mod_tip; /* tip of modify transaction */
|
|
SLONG log_mod_tid; /* transaction id of modify process */
|
|
SLONG log_creation_date[2]; /* Date/time of log creation */
|
|
SLONG log_free[4]; /* some extra space for later use */
|
|
USHORT log_end; /* similar to hdr_end */
|
|
UCHAR log_data[1];
|
|
} *LIP;
|
|
|
|
#define LIP_SIZE OFFSETA (LIP, log_data);
|
|
|
|
/* log flags */
|
|
|
|
#define log_recover 1 /* recovery required */
|
|
#define log_no_ail 2 /* dummy! will be used till df work */
|
|
#define log_delete 4 /* log files have been deleted */
|
|
#define log_add 8 /* log files have been added */
|
|
#define log_rec_in_progress 16 /* recovery is in progress */
|
|
#define log_partial_rebuild 32 /* partial recovery in progress */
|
|
#define log_recovery_done 64 /* long term recovery just finished */
|
|
|
|
#define CTRL_FILE_LEN 255 /* Pre allocated size of file name */
|
|
#define CLUMP_ADD 0
|
|
#define CLUMP_REPLACE 1
|
|
#define CLUMP_REPLACE_ONLY 2
|
|
|
|
/* Log Clumplet types */
|
|
|
|
#define LOG_end HDR_end
|
|
#define LOG_ctrl_file1 1 /* file name of 2nd last control pt */
|
|
#define LOG_ctrl_file2 2 /* file name of last ctrl pt */
|
|
#define LOG_logfile 3 /* Primary WAL file name */
|
|
#define LOG_backup_info 4 /* Journal backup directory */
|
|
#define LOG_chkpt_len 5 /* checkpoint length */
|
|
#define LOG_num_bufs 6 /* Number of log buffers */
|
|
#define LOG_bufsize 7 /* Buffer size */
|
|
#define LOG_grp_cmt_wait 8 /* Group commit wait time */
|
|
#define LOG_max 8 /* Maximum LOG_clump value */
|
|
|
|
#endif /* _JRD_ODS_H_ */
|