home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / include / myisam.h < prev    next >
C/C++ Source or Header  |  2000-11-22  |  14KB  |  393 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /* This file should be included when using myisam_funktions */
  19.  
  20. #ifndef _myisam_h
  21. #define _myisam_h
  22. #ifdef    __cplusplus
  23. extern "C" {
  24. #endif
  25.  
  26. #ifndef _my_base_h
  27. #include <my_base.h>
  28. #endif
  29. #ifndef _m_ctype_h
  30. #include <m_ctype.h>
  31. #endif
  32.  
  33.     /* defines used by myisam-funktions */
  34.  
  35. /* The following defines can be increased if necessary */
  36. #define MI_MAX_KEY    32        /* Max allowed keys */
  37. #define MI_MAX_KEY_SEG    16        /* Max segments for key */
  38. #define MI_MAX_KEY_LENGTH 500
  39.  
  40. #define MI_MAX_KEY_BUFF  (MI_MAX_KEY_LENGTH+MI_MAX_KEY_SEG*6+8+8)
  41. #define MI_MAX_POSSIBLE_KEY_BUFF (1024+6+6)    /* For myisam_chk */
  42. #define MI_MAX_POSSIBLE_KEY    64        /* For myisam_chk */
  43. #define MI_MAX_MSG_BUF      1024 /* used in CHECK TABLE, REPAIR TABLE */
  44. #define MI_NAME_IEXT    ".MYI"
  45. #define MI_NAME_DEXT    ".MYD"
  46. /* Max extra space to use when sorting keys */
  47. #define MI_MAX_TEMP_LENGTH    256*1024L*1024L
  48.  
  49. #define mi_portable_sizeof_char_ptr 8
  50.  
  51. typedef uint32 ha_checksum;
  52.  
  53.     /* Param to/from mi_info */
  54.  
  55. typedef struct st_mi_isaminfo        /* Struct from h_info */
  56. {
  57.   ha_rows records;            /* Records in database */
  58.   ha_rows deleted;            /* Deleted records in database */
  59.   my_off_t recpos;            /* Pos for last used record */
  60.   my_off_t newrecpos;            /* Pos if we write new record */
  61.   my_off_t dupp_key_pos;        /* Position to record with dupp key */
  62.   my_off_t data_file_length,        /* Length of data file */
  63.            max_data_file_length,
  64.            index_file_length,
  65.            max_index_file_length,
  66.            delete_length;
  67.   ulong reclength;            /* Recordlength */
  68.   ulong mean_reclength;            /* Mean recordlength (if packed) */
  69.   ulonglong auto_increment;
  70.   ulonglong key_map;            /* Which keys are used */
  71.   uint  keys;                /* Number of keys in use */
  72.   uint    options;            /* HA_OPTIONS_... used */
  73.   int    errkey,                /* With key was dupplicated on err */
  74.     sortkey;            /* clustered by this key */
  75.   File    filenr;                /* (uniq) filenr for datafile */
  76.   time_t create_time;            /* When table was created */
  77.   time_t check_time;
  78.   time_t update_time;
  79.   uint  reflength;
  80.   ulong record_offset;
  81.   ulong *rec_per_key;            /* for sql optimizing */
  82.   uint raid_type,raid_chunks;
  83.   ulong raid_chunksize;
  84. } MI_ISAMINFO;
  85.  
  86.  
  87. typedef struct st_mi_create_info
  88. {
  89.   ha_rows max_rows;
  90.   ha_rows reloc_rows;
  91.   ulonglong auto_increment;
  92.   ulonglong data_file_length;
  93.   uint raid_type,raid_chunks;
  94.   ulong raid_chunksize;
  95.   uint old_options;
  96.   uint8 language;
  97. } MI_CREATE_INFO;
  98.  
  99. struct st_myisam_info;            /* For referense */
  100. typedef struct st_myisam_info MI_INFO;
  101.  
  102. typedef struct st_mi_keyseg        /* Key-portion */
  103. {
  104.   uint8  type;                /* Type of key (for sort) */
  105.   uint8  language;
  106.   uint8  null_bit;            /* bitmask to test for NULL */
  107.   uint8  bit_start,bit_end;        /* if bit field */
  108.   uint16 flag;
  109.   uint16 length;            /* Keylength */
  110.   uint32 start;                /* Start of key in record */
  111.   uint32 null_pos;            /* position to NULL indicator */
  112.   CHARSET_INFO *charset;
  113. } MI_KEYSEG;
  114.  
  115.  
  116. struct st_mi_s_param;
  117.  
  118. typedef struct st_mi_keydef        /* Key definition with open & info */
  119. {
  120.   uint16 keysegs;            /* Number of key-segment */
  121.   uint16 flag;                /* NOSAME, PACK_USED */
  122.  
  123.   uint16 block_length;            /* Length of keyblock (auto) */
  124.   uint16 underflow_block_length;    /* When to execute underflow */
  125.   uint16 keylength;            /* Tot length of keyparts (auto) */
  126.   uint16 minlength;            /* min length of (packed) key (auto) */
  127.   uint16 maxlength;            /* max length of (packed) key (auto) */
  128.   uint16 block_size;            /* block_size (auto) */
  129.   uint32 version;            /* For concurrent read/write */
  130.  
  131.   MI_KEYSEG *seg,*end;
  132.   int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo,
  133.             uchar *page,uchar *key,
  134.             uint key_len,uint comp_flag,uchar * *ret_pos,
  135.             uchar *buff, my_bool *was_last_key);
  136.   uint (*get_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar * *page,
  137.           uchar *key);
  138.   int (*pack_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar *next_key,
  139.           uchar *org_key, uchar *prev_key, uchar *key,
  140.           struct st_mi_s_param *s_temp);
  141.   void (*store_key)(struct st_mi_keydef *keyinfo, uchar *key_pos,
  142.             struct st_mi_s_param *s_temp);
  143. } MI_KEYDEF;
  144.  
  145.  
  146. #define MI_UNIQUE_HASH_LENGTH    4
  147.  
  148. typedef struct st_unique_def        /* Segment definition of unique */
  149. {
  150.   uint16 keysegs;            /* Number of key-segment */
  151.   uchar key;                /* Mapped to which key */
  152.   uint8 null_are_equal;
  153.   MI_KEYSEG *seg,*end;
  154. } MI_UNIQUEDEF;
  155.  
  156. typedef struct st_mi_decode_tree    /* Decode huff-table */
  157. {
  158.   uint16 *table;
  159.   uint     quick_table_bits;
  160.   byte     *intervalls;
  161. } MI_DECODE_TREE;
  162.  
  163.  
  164. struct st_mi_bit_buff;
  165.  
  166. /* Note that null markers should always be first in a row !
  167.    When creating a column, one should only specify:
  168.    type, length, null_bit and null_pos */
  169.  
  170. typedef struct st_columndef        /* column information */
  171. {
  172.   int16  type;                /* en_fieldtype */
  173.   uint16 length;            /* length of field */
  174.   uint32 offset;            /* Offset to position in row */
  175.   uint8  null_bit;            /* If column may be 0 */
  176.   uint16 null_pos;            /* position for null marker */
  177.  
  178. #ifndef NOT_PACKED_DATABASES
  179.   void (*unpack)(struct st_columndef *rec,struct st_mi_bit_buff *buff,
  180.          uchar *start,uchar *end);
  181.   enum en_fieldtype base_type;
  182.   uint space_length_bits,pack_type;
  183.   MI_DECODE_TREE *huff_tree;
  184. #endif
  185. } MI_COLUMNDEF;
  186.  
  187.  
  188. extern my_string myisam_log_filename;        /* Name of logfile */
  189. extern uint myisam_block_size;
  190. extern my_bool myisam_flush,myisam_delay_key_write;
  191. extern my_bool myisam_concurrent_insert;
  192. extern my_off_t myisam_max_temp_length,myisam_max_extra_temp_length;
  193.  
  194.     /* Prototypes for myisam-functions */
  195.  
  196. extern int mi_close(struct st_myisam_info *file);
  197. extern int mi_delete(struct st_myisam_info *file,const byte *buff);
  198. extern struct st_myisam_info *mi_open(const char *name,int mode,
  199.                       uint wait_if_locked);
  200. extern int mi_panic(enum ha_panic_function function);
  201. extern int mi_rfirst(struct st_myisam_info *file,byte *buf,int inx);
  202. extern int mi_rkey(struct st_myisam_info *file,byte *buf,int inx,
  203.            const byte *key,
  204.            uint key_len, enum ha_rkey_function search_flag);
  205. extern int mi_rlast(struct st_myisam_info *file,byte *buf,int inx);
  206. extern int mi_rnext(struct st_myisam_info *file,byte *buf,int inx);
  207. extern int mi_rnext_same(struct st_myisam_info *info, byte *buf);
  208. extern int mi_rprev(struct st_myisam_info *file,byte *buf,int inx);
  209. extern int mi_rrnd(struct st_myisam_info *file,byte *buf, my_off_t pos);
  210. extern int mi_scan_init(struct st_myisam_info *file);
  211. extern int mi_scan(struct st_myisam_info *file,byte *buf);
  212. extern int mi_rsame(struct st_myisam_info *file,byte *record,int inx);
  213. extern int mi_rsame_with_pos(struct st_myisam_info *file,byte *record,
  214.                  int inx, my_off_t pos);
  215. extern int mi_update(struct st_myisam_info *file,const byte *old,
  216.              byte *new_record);
  217. extern int mi_write(struct st_myisam_info *file,byte *buff);
  218. extern my_off_t mi_position(struct st_myisam_info *file);
  219. extern int mi_status(struct st_myisam_info *info, MI_ISAMINFO *x, uint flag);
  220. extern int mi_lock_database(struct st_myisam_info *file,int lock_type);
  221. extern int mi_create(const char *name,uint keys,MI_KEYDEF *keydef,
  222.              uint columns, MI_COLUMNDEF *columndef, 
  223.              uint uniques, MI_UNIQUEDEF *uniquedef,
  224.              MI_CREATE_INFO *create_info, uint flags);
  225. extern int mi_delete_table(const char *name);
  226. extern int mi_rename(const char *from, const char *to);
  227. extern int mi_extra(struct st_myisam_info *file,
  228.             enum ha_extra_function function);
  229. extern ha_rows mi_records_in_range(struct st_myisam_info *info,int inx,
  230.                    const byte *start_key,uint start_key_len,
  231.                    enum ha_rkey_function start_search_flag,
  232.                    const byte *end_key,uint end_key_len,
  233.                    enum ha_rkey_function end_search_flag);
  234. extern int mi_log(int activate_log);
  235. extern int mi_is_changed(struct st_myisam_info *info);
  236. extern int mi_delete_all_rows(struct st_myisam_info *info);
  237. extern ulong _mi_calc_blob_length(uint length , const byte *pos);
  238. extern uint mi_get_pointer_length(ulonglong file_length, uint def);
  239.  
  240. /* this is used to pass to mysql_myisamchk_table -- by Sasha Pachev */
  241.  
  242. #define   MYISAMCHK_REPAIR 1  /* equivalent to myisamchk -r*/
  243. #define   MYISAMCHK_VERIFY 2  /* run equivalent of myisamchk -c,
  244.                    * if corruption is detected, do myisamchk -r*/
  245.  
  246. /* definitions needed for myisamchk.c -- by Sasha Pachev */
  247.  
  248. #define T_VERBOSE    1
  249. #define T_SILENT    2
  250. #define T_DESCRIPT    4
  251. #define T_EXTEND    8
  252. #define T_INFO        16
  253. #define T_REP        32
  254. #define T_OPT        64        /* Not currently used */
  255. #define T_FORCE_CREATE    128
  256. #define T_WRITE_LOOP    256
  257. #define T_UNPACK    512
  258. #define T_STATISTICS    1024
  259. #define T_VERY_SILENT    2048
  260. #define T_SORT_RECORDS    4096
  261. #define T_SORT_INDEX    8192
  262. #define T_WAIT_FOREVER    16384
  263. #define T_REP_BY_SORT    32768L
  264. #define T_FAST        65536L
  265. #define T_READONLY    131072L
  266. #define T_MEDIUM    T_READONLY*2
  267. #define T_AUTO_INC    T_MEDIUM*2
  268. #define T_CHECK        T_AUTO_INC*2
  269. #define T_UPDATE_STATE        T_CHECK*2
  270. #define T_CHECK_ONLY_CHANGED    T_UPDATE_STATE*2
  271. #define T_DONT_CHECK_CHECKSUM    T_CHECK_ONLY_CHANGED*2
  272. #define T_TRUST_HEADER        T_DONT_CHECK_CHECKSUM*2
  273. #define T_CREATE_MISSING_KEYS    T_TRUST_HEADER*2
  274. #define T_SAFE_REPAIR        T_CREATE_MISSING_KEYS*2
  275. #define T_AUTO_REPAIR       T_SAFE_REPAIR*2
  276. #define T_BACKUP_DATA        T_AUTO_REPAIR*2
  277.  
  278. #define O_NEW_INDEX    1        /* Bits set in out_flag */
  279. #define O_NEW_DATA    2
  280. #define O_DATA_LOST    4
  281.  
  282. /* these struct is used by my_check to tell it what to do */
  283.  
  284. typedef struct st_sort_key_blocks {        /* Used when sorting */
  285.   uchar *buff,*end_pos;
  286.   uchar lastkey[MI_MAX_POSSIBLE_KEY_BUFF];
  287.   uint last_length;
  288.   int inited;
  289. } SORT_KEY_BLOCKS;
  290.  
  291. struct st_mi_check_param;
  292.  
  293. typedef struct st_sort_info {
  294.   MI_INFO *info;
  295.   struct st_mi_check_param *param;
  296.   enum data_file_type new_data_file_type;
  297.   SORT_KEY_BLOCKS *key_block,*key_block_end;
  298.   uint key,find_length;
  299.   my_off_t pos,max_pos,filepos,start_recpos,filelength,dupp,buff_length;
  300.   ha_rows max_records;
  301.   ulonglong unique[MI_MAX_KEY_SEG+1];
  302.   my_bool fix_datafile;
  303.   char *record,*buff;
  304.   MI_KEYDEF *keyinfo;
  305.   MI_KEYSEG *keyseg;
  306. } SORT_INFO;
  307.  
  308.  
  309. typedef struct st_mi_check_param
  310. {
  311.   ulonglong auto_increment_value;
  312.   ulonglong max_data_file_length;
  313.   ulonglong keys_in_use;
  314.   my_off_t search_after_block;
  315.   my_off_t new_file_pos,key_file_blocks;
  316.   my_off_t keydata,totaldata,key_blocks,start_check_pos;
  317.   ha_rows total_records,total_deleted;
  318.   ha_checksum record_checksum,glob_crc;
  319.   ulong    use_buffers,read_buffer_length,write_buffer_length,
  320.     sort_buffer_length,sort_key_blocks;
  321.   uint out_flag,warning_printed,error_printed,
  322.        opt_rep_quick,verbose;
  323.   uint opt_sort_key,total_files,max_level;
  324.   uint testflag;
  325.   uint8 language;
  326.   my_bool using_global_keycache, opt_lock_memory, opt_follow_links;
  327.   my_bool retry_repair,retry_without_quick;
  328.   char temp_filename[FN_REFLEN],*isam_file_name,*tmpdir;
  329.   int tmpfile_createflag;
  330.   myf myf_rw;
  331.   IO_CACHE read_cache;
  332.   SORT_INFO sort_info;
  333.   ulonglong unique_count[MI_MAX_KEY_SEG+1];
  334.   ha_checksum key_crc[MI_MAX_POSSIBLE_KEY];
  335.   ulong rec_per_key_part[MI_MAX_KEY_SEG*MI_MAX_POSSIBLE_KEY];
  336.   void* thd;
  337.   char* table_name;
  338.   char* op_name;
  339. } MI_CHECK;
  340.  
  341.  
  342. typedef struct st_mi_sortinfo {
  343.   ha_rows max_records;
  344.   SORT_INFO *sort_info;
  345.   char *tmpdir;
  346.   int (*key_cmp)(SORT_INFO *info, const void *, const void *);
  347.   int (*key_read)(SORT_INFO *info,void *buff);
  348.   int (*key_write)(SORT_INFO *info, const void *buff);
  349.   void (*lock_in_memory)(MI_CHECK *info);
  350.   uint key_length;
  351.   myf myf_rw;
  352. } MI_SORT_PARAM;
  353.  
  354. /* functions in mi_check */
  355. void myisamchk_init(MI_CHECK *param);
  356. int chk_status(MI_CHECK *param, MI_INFO *info);
  357. int chk_del(MI_CHECK *param, register MI_INFO *info, uint test_flag);
  358. int chk_size(MI_CHECK *param, MI_INFO *info);
  359. int chk_key(MI_CHECK *param, MI_INFO *info);
  360. int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend);
  361. int mi_repair(MI_CHECK *param, register MI_INFO *info,
  362.           my_string name, int rep_quick);
  363. int mi_sort_index(MI_CHECK *param, register MI_INFO *info, my_string name);
  364. int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
  365.               const char * name, int rep_quick);
  366. int change_to_newfile(const char * filename, const char * old_ext,
  367.               const char * new_ext, uint raid_chunks,
  368.               myf myflags);
  369. int lock_file(MI_CHECK *param, File file, my_off_t start, int lock_type,
  370.           const char *filetype, const char *filename);
  371. void lock_memory(MI_CHECK *param);
  372. int flush_blocks(MI_CHECK *param, File file);
  373. void update_auto_increment_key(MI_CHECK *param, MI_INFO *info,
  374.                    my_bool repair);
  375. int update_state_info(MI_CHECK *param, MI_INFO *info,uint update);
  376. int filecopy(MI_CHECK *param, File to,File from,my_off_t start,
  377.          my_off_t length, const char *type);
  378. int movepoint(MI_INFO *info,byte *record,my_off_t oldpos,
  379.           my_off_t newpos, uint prot_key);
  380. int sort_write_record(SORT_INFO *sort_info);
  381.  int write_data_suffix(MI_CHECK *param, MI_INFO *info);
  382. int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
  383.               ulong);
  384. int test_if_almost_full(MI_INFO *info);
  385. int recreate_table(MI_CHECK *param, MI_INFO **org_info, char *filename);
  386. void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows);
  387. my_bool mi_test_if_sort_rep(MI_INFO *info, ha_rows rows, my_bool force);
  388.  
  389. #ifdef    __cplusplus
  390. }
  391. #endif
  392. #endif
  393.