diff options
Diffstat (limited to 'isam/isamdef.h')
-rw-r--r-- | isam/isamdef.h | 418 |
1 files changed, 0 insertions, 418 deletions
diff --git a/isam/isamdef.h b/isam/isamdef.h deleted file mode 100644 index 7d89730fe32..00000000000 --- a/isam/isamdef.h +++ /dev/null @@ -1,418 +0,0 @@ -/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* Denna fil includeras i alla isam-filer */ - -#define ISAM_LIBRARY -#include <nisam.h> /* Structs & some defines */ -#ifdef THREAD -#include <my_pthread.h> -#include <thr_lock.h> -#else -#include <my_no_pthread.h> -#endif -#include <keycache.h> - -#ifdef my_write -#undef my_write /* We want test if disk full */ -#endif -#undef HA_SORT_ALLOWS_SAME -#define HA_SORT_ALLOWS_SAME 128 /* Can't be > 128 in NISAM */ - -#ifdef __WATCOMC__ -#pragma pack(2) -#define uint uint16 /* Same format as in MSDOS */ -#endif -#ifdef __ZTC__ -#pragma ZTC align 2 -#define uint uint16 /* Same format as in MSDOS */ -#endif -#if defined(__WIN__) && defined(_MSC_VER) -#pragma pack(push,isamdef,2) -#define uint uint16 -#endif - -typedef struct st_state_info -{ - struct { /* Fileheader */ - uchar file_version[4]; - uchar options[2]; - uchar header_length[2]; - uchar state_info_length[2]; - uchar base_info_length[2]; - uchar base_pos[2]; - uchar not_used[2]; - } header; - - ulong records; /* Antal record i databasen */ - ulong del; /* Antalet borttagna poster */ - ulong dellink; /* L{nk till n{sta borttagna */ - ulong key_file_length; - ulong data_file_length; - ulong splitt; /* Antal splittrade delar */ - ulong empty; /* Outnyttjat utrymme */ - ulong process; /* Vem som senast uppdatera */ - ulong loop; /* not used anymore */ - ulong uniq; /* Unik nr i denna process */ - ulong key_root[N_MAXKEY]; /* Pekare till rootblocken */ - ulong key_del[N_MAXKEY]; /* Del-l{nkar f|r n-block */ - ulong sec_index_changed; /* Updated when new sec_index */ - ulong sec_index_used; /* 1 bit for each sec index in use */ - ulong version; /* timestamp of create */ - uint keys; /* Keys in use for database */ -} N_STATE_INFO; - - -typedef struct st_base_info -{ - ulong keystart; /* Var nycklarna b|rjar */ - ulong records,reloc; /* Parameter vid skapandet */ - ulong max_pack_length; /* Max possibly length of packed rec.*/ - ulong max_data_file_length; - ulong max_key_file_length; - uint reclength; /* length of unpacked record */ - uint options; /* Options used */ - uint pack_reclength; /* Length of full packed rec. */ - uint min_pack_length; - uint min_block_length; - uint rec_reflength; /* = 2 or 3 or 4 */ - uint key_reflength; /* = 2 or 3 or 4 */ - uint keys; /* Keys defined for database */ - uint blobs; /* Number of blobs */ - uint max_block; /* Max blockl{ngd anv{nd */ - uint max_key_length; /* L{ngsta nyckel-l{ngden */ - uint fields, /* Antal f{lt i databasen */ - pack_fields, /* Packade f{lt i databasen */ - pack_bits; /* Length of packed bits */ - time_t create_time; /* Time when created database */ - time_t isamchk_time; /* Time for last recover */ - ulong rec_per_key[N_MAXKEY]; /* for sql optimizing */ - uint sortkey; /* sorted by this key */ -} N_BASE_INFO; - - -#ifdef __ZTC__ -#pragma ZTC align -#undef uint -#endif -#ifdef __WATCOMC__ -#pragma pack() -#undef uint -#endif -#if defined(__WIN__) && defined(_MSC_VER) -#pragma pack(pop,isamdef) -#undef uint -#endif - - /* Structs used intern in database */ - -typedef struct st_n_blob /* Info of record */ -{ - uint offset; /* Offset to blob in record */ - uint pack_length; /* Type of packed length */ - uint length; /* Calc:ed for each record */ -} N_BLOB; - - -typedef struct st_isam_pack { - ulong header_length; - uint ref_length; -} N_PACK; - - -typedef struct st_isam_share { /* Shared between opens */ - N_STATE_INFO state; - N_BASE_INFO base; - N_KEYDEF *keyinfo; /* Nyckelinfo */ - N_RECINFO *rec; /* Pointer till recdata */ - N_PACK pack; /* Data about packed records */ - N_BLOB *blobs; /* Pointer to blobs */ - char *filename; /* Name of indexfile */ - byte *file_map; /* mem-map of file if possible */ - ulong this_process; /* processid */ - ulong last_process; /* For table-change-check */ - ulong last_version; /* Version on start */ - uint rec_reflength; /* rec_reflength in use now */ - int kfile; /* Shared keyfile */ - int mode; /* mode of file on open */ - int reopen; /* How many times reopened */ - uint state_length; - uint w_locks,r_locks; /* Number of read/write locks */ - uint min_pack_length; /* Theese is used by packed data */ - uint max_pack_length; - uint blocksize; /* blocksize of keyfile */ - my_bool changed,not_flushed; /* If changed since lock */ - int rnd; /* rnd-counter */ - DECODE_TREE *decode_trees; - uint16 *decode_tables; - enum data_file_type data_file_type; - int (*read_record)(struct st_isam_info*, ulong, byte*); - int (*write_record)(struct st_isam_info*, const byte*); - int (*update_record)(struct st_isam_info*, ulong, const byte*); - int (*delete_record)(struct st_isam_info*); - int (*read_rnd)(struct st_isam_info*, byte*, ulong, int); - int (*compare_record)(struct st_isam_info*, const byte *); -#ifdef THREAD - THR_LOCK lock; - pthread_mutex_t intern_lock; /* Locking for use with _locking */ -#endif -} ISAM_SHARE; - - -typedef uint bit_type; - -typedef struct st_bit_buff { /* Used for packing of record */ - bit_type current_byte; - uint bits; - uchar *pos,*end; - uint error; -} BIT_BUFF; - - -typedef struct st_isam_info { - ISAM_SHARE *s; /* Shared between open:s */ - N_BLOB *blobs; /* Pointer to blobs */ - int dfile; /* The datafile */ - BIT_BUFF bit_buff; - uint options; - uint opt_flag; /* Optim. for space/speed */ - uint update; /* If file changed since open */ - char *filename; /* parameter to open filename */ - ulong this_uniq; /* uniq filenumber or thread */ - ulong last_uniq; /* last uniq number */ - ulong this_loop; /* counter for this open */ - ulong last_loop; /* last used counter */ - ulong lastpos, /* Last record position */ - nextpos; /* Position to next record */ - ulong int_pos; /* Intern variabel */ - ulong dupp_key_pos; /* Position to record with dupp key */ - ulong last_search_keypage; - ulong save_lastpos; - uint packed_length; /* Length of found, packed record */ - uint alloced_rec_buff_length; /* Max recordlength malloced */ - uchar *buff, /* Temp area for key */ - *lastkey; /* Last used search key */ - byte *rec_buff, /* Tempbuff for recordpack */ - *rec_alloc; /* Malloced area for record */ - uchar *int_keypos, /* Intern variabel */ - *int_maxpos; /* Intern variabel */ - int lastinx; /* Last used index */ - int errkey; /* Got last error on this key */ - uint data_changed; /* Somebody has changed data */ - int lock_type; /* How database was locked */ - int tmp_lock_type; /* When locked by readinfo */ - int was_locked; /* Was locked in panic */ - myf lock_wait; /* is 0 or MY_DONT_WAIT */ - my_bool page_changed; - my_bool buff_used; - uint save_update; /* When using KEY_READ */ - int save_lastinx; - int (*read_record)(struct st_isam_info*, ulong, byte*); - LIST open_list; - IO_CACHE rec_cache; /* When cacheing records */ -#ifdef THREAD - THR_LOCK_DATA lock; -#endif -} N_INFO; - - - /* Some defines used by isam-funktions */ - -#define USE_HOLE_KEY 0 /* Use hole key in _nisam_search() */ -#define F_EXTRA_LCK -1 - - /* bits in opt_flag */ -#define MEMMAP_USED 32 -#define REMEMBER_OLD_POS 64 - -#define getint(x) ((uint) (uint16) *((int16*) (x)) & 32767) -#define putint(x,y,nod) (*((uint16*) (x))= ((nod ? (uint16) 32768 : 0)+(uint16) (y))) -#ifdef WORDS_BIGENDIAN -#define test_if_nod(x) (x[0] & 128 ? info->s->base.key_reflength : 0) -#else -#define test_if_nod(x) (x[1] & 128 ? info->s->base.key_reflength : 0) -#endif - -#define N_MIN_BLOCK_LENGTH 8 /* Because of delete-link */ -#define N_EXTEND_BLOCK_LENGTH 20 /* Don't use to small record-blocks */ -#define N_SPLITT_LENGTH ((N_EXTEND_BLOCK_LENGTH+3)*2) -#define MAX_DYN_BLOCK_HEADER 11 /* Max prefix of record-block */ -#define DYN_DELETE_BLOCK_HEADER 8 /* length of delete-block-header */ -#define MEMMAP_EXTRA_MARGIN 7 /* Write this as a suffix for file */ -#define INDEX_BLOCK_MARGIN 16 /* Safety margin for .ISM tables */ - -#define PACK_TYPE_SELECTED 1 /* Bits in field->pack_type */ -#define PACK_TYPE_SPACE_FIELDS 2 -#define PACK_TYPE_ZERO_FILL 4 - -#ifdef THREAD -extern pthread_mutex_t THR_LOCK_isam; -#endif - - /* Some extern variables */ - -extern LIST *nisam_open_list; -extern uchar NEAR nisam_file_magic[],NEAR nisam_pack_file_magic[]; -extern uint NEAR nisam_read_vec[],nisam_quick_table_bits; -extern File nisam_log_file; - - /* This is used by _nisam_get_pack_key_length och _nisam_store_key */ - -typedef struct st_s_param -{ - uint ref_length,key_length, - n_ref_length, - n_length, - totlength, - part_of_prev_key,prev_length; - uchar *key, *prev_key; -} S_PARAM; - - /* Prototypes for intern functions */ - -extern int _nisam_read_dynamic_record(N_INFO *info,ulong filepos,byte *buf); -extern int _nisam_write_dynamic_record(N_INFO*, const byte*); -extern int _nisam_update_dynamic_record(N_INFO*, ulong, const byte*); -extern int _nisam_delete_dynamic_record(N_INFO *info); -extern int _nisam_cmp_dynamic_record(N_INFO *info,const byte *record); -extern int _nisam_read_rnd_dynamic_record(N_INFO *, byte *,ulong, int); -extern int _nisam_write_blob_record(N_INFO*, const byte*); -extern int _nisam_update_blob_record(N_INFO*, ulong, const byte*); -extern int _nisam_read_static_record(N_INFO *info,ulong filepos,byte *buf); -extern int _nisam_write_static_record(N_INFO*, const byte*); -extern int _nisam_update_static_record(N_INFO*, ulong, const byte*); -extern int _nisam_delete_static_record(N_INFO *info); -extern int _nisam_cmp_static_record(N_INFO *info,const byte *record); -extern int _nisam_read_rnd_static_record(N_INFO*, byte *,ulong, int); -extern int _nisam_ck_write(N_INFO *info,uint keynr,uchar *key); -extern int _nisam_enlarge_root(N_INFO *info,uint keynr,uchar *key); -extern int _nisam_insert(N_INFO *info,N_KEYDEF *keyinfo,uchar *key, - uchar *anc_buff,uchar *key_pos,uchar *key_buff, - uchar *father_buff, uchar *father_keypos, - ulong father_page); -extern int _nisam_splitt_page(N_INFO *info,N_KEYDEF *keyinfo,uchar *key, - uchar *buff,uchar *key_buff); -extern uchar *_nisam_find_half_pos(N_INFO *info,N_KEYDEF *keyinfo,uchar *page, - uchar *key); -extern uint _nisam_get_pack_key_length(N_KEYDEF *keyinfo,uint nod_flag, - uchar *key_pos,uchar *key_buff, - uchar *key, S_PARAM *s_temp); -extern void _nisam_store_key(N_KEYDEF *keyinfo,uchar *key_pos, - S_PARAM *s_temp); -extern int _nisam_ck_delete(N_INFO *info,uint keynr,uchar *key); -extern int _nisam_readinfo(N_INFO *info,int lock_flag,int check_keybuffer); -extern int _nisam_writeinfo(N_INFO *info, uint flag); -extern int _nisam_test_if_changed(N_INFO *info); -extern int _nisam_check_index(N_INFO *info,int inx); -extern int _nisam_search(N_INFO *info,N_KEYDEF *keyinfo,uchar *key,uint key_len,uint nextflag,ulong pos); -extern int _nisam_bin_search(struct st_isam_info *info,N_KEYDEF *keyinfo,uchar *page,uchar *key,uint key_len,uint comp_flag,uchar * *ret_pos,uchar *buff); -extern int _nisam_seq_search(N_INFO *info,N_KEYDEF *keyinfo,uchar *page,uchar *key,uint key_len,uint comp_flag,uchar * *ret_pos,uchar *buff); -extern ulong _nisam_kpos(uint nod_flag,uchar *after_key); -extern void _nisam_kpointer(N_INFO *info,uchar *buff,ulong pos); -extern ulong _nisam_dpos(N_INFO *info, uint nod_flag,uchar *after_key); -extern void _nisam_dpointer(N_INFO *info, uchar *buff,ulong pos); -extern int _nisam_key_cmp(N_KEYSEG *keyseg,uchar *a,uchar *b, - uint key_length,uint nextflag); -extern uint _nisam_get_key(N_KEYDEF *keyinfo,uint nod_flag,uchar * *page,uchar *key); -extern uint _nisam_get_static_key(N_KEYDEF *keyinfo,uint nod_flag,uchar * *page,uchar *key); -extern uchar *_nisam_get_last_key(N_INFO *info,N_KEYDEF *keyinfo,uchar *keypos,uchar *lastkey,uchar *endpos); -extern uint _nisam_keylength(N_KEYDEF *keyinfo,uchar *key); -extern uchar *_nisam_move_key(N_KEYDEF *keyinfo,uchar *to,uchar *from); -extern int _nisam_search_next(N_INFO *info,N_KEYDEF *keyinfo,uchar *key,uint nextflag,ulong pos); -extern int _nisam_search_first(N_INFO *info,N_KEYDEF *keyinfo,ulong pos); -extern int _nisam_search_last(N_INFO *info,N_KEYDEF *keyinfo,ulong pos); -extern uchar *_nisam_fetch_keypage(N_INFO *info,N_KEYDEF *keyinfo,my_off_t page, - uchar *buff,int return_buffer); -extern int _nisam_write_keypage(N_INFO *info,N_KEYDEF *keyinfo,my_off_t page, - uchar *buff); -extern int _nisam_dispose(N_INFO *info,N_KEYDEF *keyinfo,my_off_t pos); -extern ulong _nisam_new(N_INFO *info,N_KEYDEF *keyinfo); -extern uint _nisam_make_key(N_INFO *info,uint keynr,uchar *key, - const char *record,ulong filepos); -extern uint _nisam_pack_key(N_INFO *info,uint keynr,uchar *key,uchar *old,uint key_length); -extern int _nisam_read_key_record(N_INFO *info,ulong filepos,byte *buf); -extern int _nisam_read_cache(IO_CACHE *info,byte *buff,ulong pos, - uint length,int re_read_if_possibly); -extern byte *fix_rec_buff_for_blob(N_INFO *info,uint blob_length); -extern uint _nisam_rec_unpack(N_INFO *info,byte *to,byte *from, - uint reclength); -my_bool _nisam_rec_check(N_INFO *info,const char *from); -extern int _nisam_write_part_record(N_INFO *info,ulong filepos,uint length, - ulong next_filepos,byte **record, - uint *reclength,int *flag); -extern void _nisam_print_key(FILE *stream,N_KEYSEG *keyseg,const uchar *key); -extern my_bool _nisam_read_pack_info(N_INFO *info,pbool fix_keys); -extern int _nisam_read_pack_record(N_INFO *info,ulong filepos,byte *buf); -extern int _nisam_read_rnd_pack_record(N_INFO*, byte *,ulong, int); -extern int _nisam_pack_rec_unpack(N_INFO *info,byte *to,byte *from, - uint reclength); -extern ulong _nisam_checksum(const byte *mem, uint count); - -typedef struct st_sortinfo { - uint key_length; - ulong max_records; - int (*key_cmp)(const void *, const void *, const void *); - int (*key_read)(void *buff); - int (*key_write)(const void *buff); - void (*lock_in_memory)(void); -} SORT_PARAM; - -int _create_index_by_sort(SORT_PARAM *info,pbool no_messages, - uint sortbuff_size); - -#define BLOCK_INFO_HEADER_LENGTH 11 - -typedef struct st_block_info { /* Parameter to _nisam_get_block_info */ - uchar header[BLOCK_INFO_HEADER_LENGTH]; - uint rec_len; - uint data_len; - uint block_len; - ulong filepos; /* Must be ulong on Alpha! */ - ulong next_filepos; - uint second_read; -} BLOCK_INFO; - - /* bits in return from _nisam_get_block_info */ - -#define BLOCK_FIRST 1 -#define BLOCK_LAST 2 -#define BLOCK_DELETED 4 -#define BLOCK_ERROR 8 /* Wrong data */ -#define BLOCK_SYNC_ERROR 16 /* Right data at wrong place */ -#define BLOCK_FATAL_ERROR 32 /* hardware-error */ - -enum nisam_log_commands { - LOG_OPEN,LOG_WRITE,LOG_UPDATE,LOG_DELETE,LOG_CLOSE,LOG_EXTRA,LOG_LOCK -}; - -#define nisam_log_simple(a,b,c,d) if (nisam_log_file >= 0) _nisam_log(a,b,c,d) -#define nisam_log_command(a,b,c,d,e) if (nisam_log_file >= 0) _nisam_log_command(a,b,c,d,e) -#define nisam_log_record(a,b,c,d,e) if (nisam_log_file >= 0) _nisam_log_record(a,b,c,d,e) - -extern uint _nisam_get_block_info(BLOCK_INFO *,File, ulong); -extern uint _nisam_rec_pack(N_INFO *info,byte *to,const byte *from); -extern uint _nisam_pack_get_block_info(BLOCK_INFO *, uint, File, ulong); -extern uint _calc_total_blob_length(N_INFO *info,const byte *record); -extern void _nisam_log(enum nisam_log_commands command,N_INFO *info, - const byte *buffert,uint length); -extern void _nisam_log_command(enum nisam_log_commands command, - N_INFO *info, const byte *buffert, - uint length, int result); -extern void _nisam_log_record(enum nisam_log_commands command,N_INFO *info, - const byte *record,ulong filepos, - int result); -extern my_bool _nisam_memmap_file(N_INFO *info); -extern void _nisam_unmap_file(N_INFO *info); |