mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-27 20:03:03 +01:00
405 lines
12 KiB
C++
405 lines
12 KiB
C++
/*
|
|
* PROGRAM: JRD Access Method
|
|
* MODULE: jrn.h
|
|
* DESCRIPTION: Journal interface 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 _JRD_JRN_H_
|
|
#define _JRD_JRN_H_
|
|
|
|
#include "../jrd/jrd_blks.h"
|
|
#include "../include/fb_blk.h"
|
|
|
|
#define MAX_RECORD 9000
|
|
#define JOURNAL_VERSION3 3
|
|
#define JOURNAL_VERSION4 4
|
|
|
|
#define JOURNAL_VERSION JOURNAL_VERSION4
|
|
|
|
#define CONSOLE_ADDR "console.addr" /* socket address for console */
|
|
#define JOURNAL_ADDR "journal.addr" /* socket address for journal */
|
|
|
|
#ifndef JOURNAL_FILE
|
|
#define JOURNAL_FILE "journal.isc"
|
|
#define CONSOLE_FILE "console.isc"
|
|
#endif
|
|
|
|
/* Journal block */
|
|
|
|
class jrn : public pool_alloc_rpt<SCHAR, type_jrn>
|
|
{
|
|
public:
|
|
STATUS *jrn_status_vector; /* Status vector for errors */
|
|
int *jrn_channel; /* Communication channel */
|
|
int jrn_iri; /* RMS internal RAB id */
|
|
SLONG jrn_lock_id; /* Controlling lock id */
|
|
SLONG jrn_handle; /* Server handle */
|
|
SLONG jrn_series; /* Journal file series */
|
|
SLONG jrn_dump; /* page to be dumped (-1 -> dump database) */
|
|
USHORT jrn_fid[3]; /* VMS file id */
|
|
USHORT jrn_did[3]; /* VMS directory id */
|
|
TEXT jrn_server[1]; /* Server name */
|
|
};
|
|
typedef jrn *JRN;
|
|
|
|
/* Journal record types */
|
|
|
|
#define JRN_ENABLE 1 /* Enable journalling */
|
|
#define JRN_DISABLE 2 /* Disable journalling */
|
|
#define JRN_SIGN_ON 3 /* Database attachment coming on line */
|
|
#define JRN_SIGN_OFF 4 /* Database being detached */
|
|
#define JRN_CNTRL_PT 5 /* Control point */
|
|
#define JRN_WAL_NAME 6 /* WAL FILE name */
|
|
#define JRN_NEW_FILE 7 /* New secondary FILE name */
|
|
#define JRN_ACK 8 /* Anybody home? */
|
|
#define JRN_RESPONSE 9 /* Response to control message */
|
|
#define JRN_SET_TRANSACTION 10 /* Set transaction state */
|
|
#define JRN_DUMMY 11 /* Dummy record -- space not used */
|
|
#define JRN_RESET 12 /* Journal file has been reset */
|
|
#define JRN_COMMIT 13 /* Commit control message */
|
|
#define JRN_CONSOLE 14 /* Console message */
|
|
#define JRN_SYNC 15 /* Synchronize journal */
|
|
#define JRN_START_ONLINE_DMP 16
|
|
#define JRN_END_ONLINE_DMP 17
|
|
#define JRN_ONLINE_DMP_FILE 18
|
|
#define JRN_ARCHIVE_BEGIN 19
|
|
#define JRN_ARCHIVE_END 20
|
|
#define JRN_ARCHIVE_ERROR 21
|
|
#define JRN_max 21
|
|
|
|
#define JRN_PAGE 100 /* A full page WAL record */
|
|
|
|
/* Journal data clumplets. Note: types above 100 are clumps of data */
|
|
|
|
#define JRNP_DATA_SEGMENT 101 /* Add segment to data page */
|
|
#define JRNP_POINTER_SLOT 102 /* Add pointer page to relation */
|
|
#define JRNP_TRANSACTION 103 /* Journal transaction state */
|
|
#define JRNP_NULL 104 /* Odd byte */
|
|
#define JRNP_PIP 105 /* Page allocation/deallocation */
|
|
|
|
#define JRNP_BTREE_NODE 106 /* Add/delete a node to BTREE */
|
|
#define JRNP_BTREE_SEGMENT 107 /* B Tree split - valid part */
|
|
#define JRNP_BTREE_DELETE 108 /* B Tree node delete - logical */
|
|
#define JRNP_INDEX_ROOT 109 /* Add/drop an index */
|
|
#define JRNP_DB_HEADER 110 /* Modify db header page */
|
|
#define JRNP_GENERATOR 111 /* generator */
|
|
#define JRNP_ROOT_PAGE 112 /* Index root page */
|
|
#define JRNP_DB_ATTACHMENT 113 /* next attachment */
|
|
#define JRNP_DB_HDR_PAGES 114 /* Header pages */
|
|
#define JRNP_DB_HDR_FLAGS 115 /* Header flags */
|
|
#define JRNP_DB_HDR_SDW_COUNT 116 /* Header shadow count */
|
|
#define JRNP_LOG_PAGE 117 /* log page information */
|
|
#define JRNP_NEXT_TIP 118 /* Next tip page is logged */
|
|
#define JRNP_MAX 118
|
|
|
|
|
|
/* Journal header block */
|
|
|
|
typedef struct jrnh {
|
|
UCHAR jrnh_type;
|
|
UCHAR jrnh_version;
|
|
USHORT jrnh_length; /* Total length of journal record */
|
|
SLONG jrnh_handle; /* Journal supplied handle for db */
|
|
SLONG jrnh_series; /* Journal series */
|
|
SLONG jrnh_prev_seqno; /* previous seqno of record */
|
|
SLONG jrnh_prev_offset; /* previous offset of record */
|
|
} JRNH;
|
|
|
|
/* Long Term Journal control message format */
|
|
|
|
typedef struct ltjc {
|
|
JRNH ltjc_header;
|
|
USHORT ltjc_page_size; /* Database page size */
|
|
SLONG ltjc_seqno; /* Seqno of WAL */
|
|
ULONG ltjc_offset; /* offset in WAL */
|
|
USHORT ltjc_length; /* Length of data */
|
|
TEXT ltjc_data[1]; /* Expanded filename */
|
|
} LTJC;
|
|
|
|
#define LTJC_SIZE OFFSETA (LTJC*, ltjc_data)
|
|
|
|
/* Long Term Journal archive message format */
|
|
|
|
typedef struct ltja {
|
|
JRNH ltja_header;
|
|
SLONG ltja_db_id; /* Database ID */
|
|
SLONG ltja_file_id; /* WAL file ID */
|
|
SLONG ltja_error_code; /* Error number */
|
|
USHORT ltja_length; /* Length of data */
|
|
TEXT ltja_data[1]; /* Expanded filename */
|
|
} LTJA;
|
|
|
|
#define LTJA_SIZE OFFSETA (LTJA*, ltja_data)
|
|
|
|
ENUM jrnr_t {
|
|
jrnr_accepted = 1, /* Connection accepted */
|
|
jrnr_rejected, /* Connection rejected */
|
|
jrnr_dump_database, /* Dump the database before proceding */
|
|
jrnr_dump_page, /* Dump a specific page */
|
|
jrnr_enabled, /* Database enabled */
|
|
jrnr_start_dump, /* Start online dump */
|
|
jrnr_end_dump, /* End Online dump */
|
|
jrnr_shutdown, /* Journal server is shutting down */
|
|
jrnr_msg, /* Message line from server */
|
|
jrnr_end_msg, /* End of message lines */
|
|
jrnr_exit, /* Console should exit */
|
|
jrnr_error, /* Console request not granted */
|
|
jrnr_archive_error, /* invalid archive directory */
|
|
jrnr_ack /* Acknowlege journal message */
|
|
};
|
|
|
|
/* Journal server response message */
|
|
|
|
typedef struct jrnr {
|
|
JRNH jrnr_header;
|
|
ENUM jrnr_t jrnr_response;
|
|
SLONG jrnr_page;
|
|
} JRNR;
|
|
|
|
/* Journal data message format */
|
|
|
|
typedef struct jrnd {
|
|
JRNH jrnd_header;
|
|
USHORT jrnd_length; /* Length of data portion */
|
|
SLONG jrnd_page; /* Page number */
|
|
UCHAR jrnd_data[1];
|
|
} JRND;
|
|
|
|
#define JRND_SIZE OFFSETA (JRND*, jrnd_data)
|
|
|
|
/* Journal page clumplet formats */
|
|
|
|
typedef struct jrnp {
|
|
UCHAR jrnp_type; /* Clumplet type */
|
|
USHORT jrnp_index; /* Segment or slot index */
|
|
USHORT jrnp_length; /* Length of data */
|
|
UCHAR jrnp_data[1]; /* Variable data */
|
|
} JRNP;
|
|
|
|
#define JRNP_SIZE OFFSETA (JRNP*, jrnp_data)
|
|
|
|
/* B-tree node addition clumplet formats */
|
|
|
|
typedef struct jrnb {
|
|
UCHAR jrnb_type; /* Clumplet type */
|
|
ULONG jrnb_prefix_total; /* new prefix total */
|
|
USHORT jrnb_offset; /* offset into page */
|
|
USHORT jrnb_delta; /* increase in btr_length */
|
|
USHORT jrnb_length; /* Length of data */
|
|
UCHAR jrnb_data[1]; /* Variable data */
|
|
} JRNB;
|
|
|
|
#define JRNB_SIZE OFFSETA (JRNB*, jrnb_data)
|
|
|
|
/* Clumplet for index changes */
|
|
/* used for JRNP_TRANSACTION and JRNP_NEXT_TIP */
|
|
|
|
typedef struct jrni {
|
|
UCHAR jrni_type; /* Clumplet type */
|
|
UCHAR jrni_states; /* New state */
|
|
USHORT jrni_position; /* Position on transaction page */
|
|
SLONG jrni_transaction; /* Transaction number */
|
|
} JRNI;
|
|
|
|
# define JRNI_SIZE sizeof (struct jrni)
|
|
|
|
/* Clumplet for page allocation/deallocation */
|
|
|
|
typedef struct jrna {
|
|
UCHAR jrna_type; /* Clumplet type */
|
|
UCHAR jrna_allocate; /* 1 = allocate, 2 = free */
|
|
ULONG jrna_slot; /* Slot on page */
|
|
} JRNA;
|
|
|
|
/* Journal buffer file definition */
|
|
|
|
#define BLOCK_SIZE 512 /* Size of disk block in bytes */
|
|
#define SEGMENT_SIZE 128 /* Size of file segment in blocks */
|
|
#define SEGMENT_SLOTS 500 /* Number of segment slots */
|
|
#define ID_SPACE 4096 /* Bytes reserved for database filename/id space */
|
|
#define ID_OFFSET ((sizeof (struct jfh) + BLOCK_SIZE - 1) / BLOCK_SIZE)
|
|
#define SEGMENT_OFFSET ID_OFFSET + ((ID_SPACE + BLOCK_SIZE - 1) / BLOCK_SIZE)
|
|
#define HANDLE_WORDS 8
|
|
|
|
/* Journal File header data */
|
|
|
|
typedef struct jfh {
|
|
USHORT jfh_version; /* File format version number */
|
|
USHORT jfh_allocation; /* Number of segments allocated */
|
|
USHORT jfh_data; /* Slot number of first data segment */
|
|
USHORT jfh_free; /* Slot number of first free segment */
|
|
USHORT jfh_flags; /* Misc flags */
|
|
USHORT jfh_copy_block; /* Current (last recorded) block copied */
|
|
USHORT jfh_write_block; /* Current (last recorded) block written */
|
|
USHORT jfh_id_space; /* Database id space used */
|
|
ULONG jfh_next_id; /* Next available database id */
|
|
ULONG jfh_series; /* Current journal update series */
|
|
ULONG jfh_sequence; /* Next sequence number for journal server */
|
|
USHORT jfh_segments[SEGMENT_SLOTS];
|
|
} *JFH;
|
|
|
|
#define JFH_VERSION 1 /* current file format version number */
|
|
|
|
#define JFH_suspended 1 /* Journalling has been suspended */
|
|
|
|
/* Database identification record */
|
|
|
|
typedef struct dir {
|
|
ULONG dir_id; /* Database journaling id */
|
|
ULONG dir_last_page; /* Last page journal (if questionable) */
|
|
UCHAR dir_length; /* Length of name */
|
|
TEXT dir_name[1]; /* Database file name */
|
|
} *DIR;
|
|
|
|
/*
|
|
* For start transaction log -
|
|
*/
|
|
|
|
/* database header - logical log record */
|
|
|
|
typedef struct jrndh {
|
|
UCHAR jrndh_type; /* = JRNP_DB_HEADER */
|
|
SLONG jrndh_nti; /* next transaction id */
|
|
SLONG jrndh_oit; /* oldest interesting transaction */
|
|
SLONG jrndh_oat; /* oldest active transaction */
|
|
} JRNDH;
|
|
|
|
#define JRNDH_SIZE sizeof (struct jrndh)
|
|
|
|
/* log header - logical log record */
|
|
|
|
typedef struct jrnl {
|
|
UCHAR jrnl_type; /* = JRNP_LOG_PAGE */
|
|
SLONG jrnl_flags; /* log page flags */
|
|
SLONG jrnl_tip; /* updating transactions tip */
|
|
SLONG jrnl_tid; /* updating transaction id */
|
|
} JRNL;
|
|
|
|
#define JRNL_SIZE sizeof (struct jrnl)
|
|
|
|
/*
|
|
* Generator page logging will be done by logging the offset of the
|
|
* generator and the new value.
|
|
*/
|
|
|
|
typedef struct jrng {
|
|
UCHAR jrng_type; /* = JRNP_GENERATOR */
|
|
SLONG jrng_offset; /* offset into page */
|
|
SLONG jrng_genval; /* generator value */
|
|
} JRNG;
|
|
|
|
#define JRNG_SIZE sizeof (struct jrng)
|
|
|
|
/*
|
|
* Index root page logging will be done by logging the index id and
|
|
* the new b-tree root page number.
|
|
*/
|
|
|
|
typedef struct jrnrp {
|
|
UCHAR jrnrp_type; /* = JRNP_ROOT_PAGE */
|
|
SLONG jrnrp_id; /* index number */
|
|
SLONG jrnrp_page; /* new page number */
|
|
} JRNRP;
|
|
|
|
#define JRNRP_SIZE sizeof (struct jrnrp)
|
|
|
|
/*
|
|
* WAL file message format.
|
|
* This is a generic message that will be used by a
|
|
* variety of users.
|
|
* - Creation of WAL file.
|
|
* - Control point record.
|
|
* - Online dump record.
|
|
* In some of these usages, the record is first written to WAL to get
|
|
* a seqno & offset pair, and then a message is written to the
|
|
* journal server.
|
|
*/
|
|
|
|
typedef struct ltjw {
|
|
JRNH ltjw_header;
|
|
USHORT ltjw_mode; /* any mode of operation */
|
|
ULONG ltjw_seqno; /* log file seqno */
|
|
ULONG ltjw_offset; /* offset of record */
|
|
ULONG ltjw_p_offset; /* partition offset */
|
|
USHORT ltjw_count; /* Count used for online dump */
|
|
SLONG ltjw_date[2]; /* Date/time of event */
|
|
USHORT ltjw_length; /* Length of WAL filename */
|
|
TEXT ltjw_data[1]; /* Expanded filename */
|
|
} LTJW;
|
|
|
|
#define LTJW_SIZE OFFSETA (LTJW*, ltjw_data)
|
|
|
|
/* values of mode */
|
|
|
|
#define JRNW_OPEN 0
|
|
#define JRNW_CLOSE 1
|
|
|
|
/* WAL message types */
|
|
|
|
/* Encoded as <type> <length> <data> in ltjw_data */
|
|
|
|
#define JRNW_END 0
|
|
#define JRNW_DELETE_RULE 1
|
|
#define JRNW_DB_NAME 2
|
|
#define JRNW_BACKUP_DIR 3
|
|
#define JRNW_DEVICE_TYPE 4
|
|
|
|
/* device type */
|
|
|
|
#define JRNW_DISK 0
|
|
#define JRNW_TAPE 1
|
|
|
|
/* Secondary file name message */
|
|
|
|
typedef struct jrnf {
|
|
JRNH jrnf_header;
|
|
ULONG jrnf_start; /* start block number */
|
|
USHORT jrnf_length; /* Length of filename */
|
|
USHORT jrnf_sequence; /* File sequence # */
|
|
TEXT jrnf_filename[1]; /* Expanded filename */
|
|
} JRNF;
|
|
|
|
#define JRNF_SIZE OFFSETA (JRNF*, jrnf_filename)
|
|
|
|
typedef struct jrnda {
|
|
UCHAR jrnda_type;
|
|
ULONG jrnda_data;
|
|
} JRNDA;
|
|
|
|
#define JRNDA_SIZE sizeof (struct jrnda)
|
|
|
|
#define MAX_OLD_FILES 16
|
|
#define MAX_LOG_FILES 16
|
|
|
|
class logfiles : public pool_alloc_rpt<SCHAR, type_ail>
|
|
{
|
|
public:
|
|
SLONG lg_size;
|
|
SSHORT lg_sequence;
|
|
SSHORT lg_partitions;
|
|
SSHORT lg_flags;
|
|
TEXT lg_name[2];
|
|
};
|
|
typedef logfiles LGFILE;
|
|
|
|
#define LGFILE_SIZE OFFSETA (LGFILE*, lg_name)
|
|
|
|
#endif /* _JRD_JRN_H_ */
|