diff options
Diffstat (limited to 'isam/isamdef.h')
-rw-r--r-- | isam/isamdef.h | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/isam/isamdef.h b/isam/isamdef.h new file mode 100644 index 00000000000..da08b5f6a14 --- /dev/null +++ b/isam/isamdef.h @@ -0,0 +1,416 @@ +/* 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 + +#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); + +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); |