213 lines
6.6 KiB
C
213 lines
6.6 KiB
C
|
/* Copyright (C) 2000 MySQL 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 */
|
||
|
|
||
|
/* This file should be included when using nisam_funktions */
|
||
|
/* Author: Michael Widenius */
|
||
|
|
||
|
#ifndef _nisam_h
|
||
|
#define _nisam_h
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#ifndef _my_base_h
|
||
|
#include <my_base.h>
|
||
|
#endif
|
||
|
/* defines used by nisam-funktions */
|
||
|
|
||
|
#define N_MAXKEY 16 /* Max allowed keys */
|
||
|
#define N_MAXKEY_SEG 16 /* Max segments for key */
|
||
|
#define N_MAX_KEY_LENGTH 256 /* May be increased up to 500 */
|
||
|
#define N_MAX_KEY_BUFF (N_MAX_KEY_LENGTH+N_MAXKEY_SEG+sizeof(double)-1)
|
||
|
#define N_MAX_POSSIBLE_KEY_BUFF 500+9
|
||
|
|
||
|
#define N_NAME_IEXT ".ISM"
|
||
|
#define N_NAME_DEXT ".ISD"
|
||
|
#define NI_POS_ERROR (~ (ulong) 0)
|
||
|
|
||
|
|
||
|
/* Param to/from nisam_info */
|
||
|
|
||
|
typedef struct st_n_isaminfo /* Struct from h_info */
|
||
|
{
|
||
|
ulong records; /* Records in database */
|
||
|
ulong deleted; /* Deleted records in database */
|
||
|
ulong recpos; /* Pos for last used record */
|
||
|
ulong newrecpos; /* Pos if we write new record */
|
||
|
ulong dupp_key_pos; /* Position to record with dupp key */
|
||
|
ulong data_file_length, /* Length of data file */
|
||
|
max_data_file_length,
|
||
|
index_file_length,
|
||
|
max_index_file_length,
|
||
|
delete_length;
|
||
|
uint reclength; /* Recordlength */
|
||
|
uint mean_reclength; /* Mean recordlength (if packed) */
|
||
|
uint keys; /* How many keys used */
|
||
|
uint options; /* HA_OPTION_... used */
|
||
|
int errkey, /* With key was dupplicated on err */
|
||
|
sortkey; /* clustered by this key */
|
||
|
File filenr; /* (uniq) filenr for datafile */
|
||
|
time_t create_time; /* When table was created */
|
||
|
time_t isamchk_time;
|
||
|
time_t update_time;
|
||
|
ulong *rec_per_key; /* for sql optimizing */
|
||
|
} N_ISAMINFO;
|
||
|
|
||
|
|
||
|
/* Info saved on file for each info-part */
|
||
|
|
||
|
#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
|
||
|
|
||
|
typedef struct st_n_save_keyseg /* Key-portion */
|
||
|
{
|
||
|
uint8 type; /* Typ av nyckel (f|r sort) */
|
||
|
uint8 flag; /* HA_DIFF_LENGTH */
|
||
|
uint16 start; /* Start of key in record */
|
||
|
uint16 length; /* Keylength */
|
||
|
} N_SAVE_KEYSEG;
|
||
|
|
||
|
typedef struct st_n_save_keydef /* Key definition with create & info */
|
||
|
{
|
||
|
uint8 flag; /* NOSAME, PACK_USED */
|
||
|
uint8 keysegs; /* Number of key-segment */
|
||
|
uint16 block_length; /* Length of keyblock (auto) */
|
||
|
uint16 keylength; /* Tot length of keyparts (auto) */
|
||
|
uint16 minlength; /* min length of (packed) key (auto) */
|
||
|
uint16 maxlength; /* max length of (packed) key (auto) */
|
||
|
} N_SAVE_KEYDEF;
|
||
|
|
||
|
typedef struct st_n_save_recinfo /* Info of record */
|
||
|
{
|
||
|
int16 type; /* en_fieldtype */
|
||
|
uint16 length; /* length of field */
|
||
|
} N_SAVE_RECINFO;
|
||
|
|
||
|
|
||
|
#ifdef __ZTC__
|
||
|
#pragma ZTC align
|
||
|
#undef uint
|
||
|
#endif
|
||
|
|
||
|
#ifdef __WATCOMC__
|
||
|
#pragma pack()
|
||
|
#undef uint
|
||
|
#endif
|
||
|
|
||
|
|
||
|
struct st_isam_info; /* For referense */
|
||
|
|
||
|
#ifndef ISAM_LIBRARY
|
||
|
typedef struct st_isam_info N_INFO;
|
||
|
#endif
|
||
|
|
||
|
typedef struct st_n_keyseg /* Key-portion */
|
||
|
{
|
||
|
N_SAVE_KEYSEG base;
|
||
|
} N_KEYSEG;
|
||
|
|
||
|
|
||
|
typedef struct st_n_keydef /* Key definition with open & info */
|
||
|
{
|
||
|
N_SAVE_KEYDEF base;
|
||
|
N_KEYSEG seg[N_MAXKEY_SEG+1];
|
||
|
int (*bin_search)(struct st_isam_info *info,struct st_n_keydef *keyinfo,
|
||
|
uchar *page,uchar *key,
|
||
|
uint key_len,uint comp_flag,uchar * *ret_pos,
|
||
|
uchar *buff);
|
||
|
uint (*get_key)(struct st_n_keydef *keyinfo,uint nod_flag,uchar * *page,
|
||
|
uchar *key);
|
||
|
} N_KEYDEF;
|
||
|
|
||
|
|
||
|
typedef struct st_decode_tree /* Decode huff-table */
|
||
|
{
|
||
|
uint16 *table;
|
||
|
uint quick_table_bits;
|
||
|
byte *intervalls;
|
||
|
} DECODE_TREE;
|
||
|
|
||
|
|
||
|
struct st_bit_buff;
|
||
|
|
||
|
typedef struct st_n_recinfo /* Info of record */
|
||
|
{
|
||
|
N_SAVE_RECINFO base;
|
||
|
#ifndef NOT_PACKED_DATABASES
|
||
|
void (*unpack)(struct st_n_recinfo *rec,struct st_bit_buff *buff,
|
||
|
uchar *start,uchar *end);
|
||
|
enum en_fieldtype base_type;
|
||
|
uint space_length_bits,pack_type;
|
||
|
DECODE_TREE *huff_tree;
|
||
|
#endif
|
||
|
} N_RECINFO;
|
||
|
|
||
|
|
||
|
extern my_string nisam_log_filename; /* Name of logfile */
|
||
|
extern uint nisam_block_size;
|
||
|
extern my_bool nisam_flush;
|
||
|
|
||
|
/* Prototypes for nisam-functions */
|
||
|
|
||
|
extern int nisam_close(struct st_isam_info *file);
|
||
|
extern int nisam_delete(struct st_isam_info *file,const byte *buff);
|
||
|
extern struct st_isam_info *nisam_open(const char *name,int mode,
|
||
|
uint wait_if_locked);
|
||
|
extern int nisam_panic(enum ha_panic_function function);
|
||
|
extern int nisam_rfirst(struct st_isam_info *file,byte *buf,int inx);
|
||
|
extern int nisam_rkey(struct st_isam_info *file,byte *buf,int inx,
|
||
|
const byte *key,
|
||
|
uint key_len, enum ha_rkey_function search_flag);
|
||
|
extern int nisam_rlast(struct st_isam_info *file,byte *buf,int inx);
|
||
|
extern int nisam_rnext(struct st_isam_info *file,byte *buf,int inx);
|
||
|
extern int nisam_rprev(struct st_isam_info *file,byte *buf,int inx);
|
||
|
extern int nisam_rrnd(struct st_isam_info *file,byte *buf,ulong pos);
|
||
|
extern int nisam_rsame(struct st_isam_info *file,byte *record,int inx);
|
||
|
extern int nisam_rsame_with_pos(struct st_isam_info *file,byte *record,
|
||
|
int inx,ulong pos);
|
||
|
extern int nisam_update(struct st_isam_info *file,const byte *old,
|
||
|
const byte *new_record);
|
||
|
extern int nisam_write(struct st_isam_info *file,const byte *buff);
|
||
|
extern int nisam_info(struct st_isam_info *file,N_ISAMINFO *x,int flag);
|
||
|
extern ulong nisam_position(struct st_isam_info *info);
|
||
|
extern int nisam_lock_database(struct st_isam_info *file,int lock_type);
|
||
|
extern int nisam_create(const char *name,uint keys,N_KEYDEF *keyinfo,
|
||
|
N_RECINFO *recinfo,ulong records,
|
||
|
ulong reloc,uint flags,uint options,
|
||
|
ulong data_file_length);
|
||
|
extern int nisam_extra(struct st_isam_info *file,
|
||
|
enum ha_extra_function function);
|
||
|
extern ulong nisam_records_in_range(struct st_isam_info *info,int inx,
|
||
|
const byte *start_key,uint start_key_len,
|
||
|
enum ha_rkey_function start_search_flag,
|
||
|
const byte *end_key,uint end_key_len,
|
||
|
enum ha_rkey_function end_search_flag);
|
||
|
extern int nisam_log(int activate_log);
|
||
|
extern int nisam_is_changed(struct st_isam_info *info);
|
||
|
extern uint _calc_blob_length(uint length , const byte *pos);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
#endif
|