heap.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  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. /* This file should be included when using heap_database_funktions */
  18. /* Author: Michael Widenius */
  19. #ifndef _heap_h
  20. #define _heap_h
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. #ifndef _my_base_h
  25. #include <my_base.h>
  26. #endif
  27. #ifdef THREAD
  28. #include <my_pthread.h>
  29. #include <thr_lock.h>
  30. #endif
  31. /* defines used by heap-funktions */
  32. #define HP_MAX_LEVELS 4 /* 128^5 records is enough */
  33. #define HP_PTRS_IN_NOD 128
  34. /* struct used with heap_funktions */
  35. typedef struct st_heapinfo /* Struct from heap_info */
  36. {
  37.   ulong records; /* Records in database */
  38.   ulong deleted; /* Deleted records in database */
  39.   ulong max_records;
  40.   ulong data_length;
  41.   ulong index_length;
  42.   uint reclength; /* Length of one record */
  43.   int errkey;
  44. } HEAPINFO;
  45. /* Structs used by heap-database-handler */
  46. typedef struct st_heap_ptrs
  47. {
  48.   byte *blocks[HP_PTRS_IN_NOD]; /* pointers to HP_PTRS or records */
  49. } HP_PTRS;
  50. struct st_level_info
  51. {
  52.   uint free_ptrs_in_block,records_under_level;
  53.   HP_PTRS *last_blocks; /* pointers to HP_PTRS or records */
  54. };
  55. typedef struct st_heap_block /* The data is saved in blocks */
  56. {
  57.   HP_PTRS *root;
  58.   struct st_level_info level_info[HP_MAX_LEVELS+1];
  59.   uint levels;
  60.   uint records_in_block; /* Records in a heap-block */
  61.   uint recbuffer; /* Length of one saved record */
  62.   ulong last_allocated; /* Blocks allocated, used by keys */
  63. } HP_BLOCK;
  64. typedef struct st_hp_keyseg /* Key-portion */
  65. {
  66.   uint start; /* Start of key in record (from 0) */
  67.   uint length; /* Keylength */
  68.   uint type;
  69. } HP_KEYSEG;
  70. typedef struct st_hp_keydef /* Key definition with open */
  71. {
  72.   uint flag; /* NOSAME */
  73.   uint keysegs; /* Number of key-segment */
  74.   uint length; /* Length of key (automatic) */
  75.   HP_KEYSEG *seg;
  76.   HP_BLOCK block; /* Where keys are saved */
  77. } HP_KEYDEF;
  78. typedef struct st_heap_share
  79. {
  80.   HP_BLOCK block;
  81.   HP_KEYDEF  *keydef;
  82.   ulong min_records,max_records; /* Params to open */
  83.   ulong data_length,index_length;
  84.   uint records; /* records */
  85.   uint blength;
  86.   uint deleted; /* Deleted records in database */
  87.   uint reclength; /* Length of one record */
  88.   uint changed;
  89.   uint keys,max_key_length;
  90.   uint open_count;
  91.   byte *del_link; /* Link to next block with del. rec */
  92.   my_string name; /* Name of "memory-file" */
  93. #ifdef THREAD
  94.   THR_LOCK lock;
  95.   pthread_mutex_t intern_lock; /* Locking for use with _locking */
  96. #endif
  97.   LIST open_list;
  98. } HP_SHARE;
  99. struct st_hash_info;
  100. typedef struct st_heap_info
  101. {
  102.   HP_SHARE *s;
  103.   byte *current_ptr;
  104.   struct st_hash_info *current_hash_ptr;
  105.   ulong current_record,next_block;
  106.   int lastinx,errkey;
  107.   int  mode; /* Mode of file (READONLY..) */
  108.   uint opt_flag,update;
  109.   byte *lastkey; /* Last used key with rkey */
  110. #ifdef THREAD
  111.   THR_LOCK_DATA lock;
  112. #endif
  113.   LIST open_list;
  114. } HP_INFO;
  115. /* Prototypes for heap-functions */
  116. extern HP_INFO* heap_open(const char *name,int mode,uint keys,
  117.   HP_KEYDEF *keydef,uint reclength,
  118.   ulong max_records,ulong min_reloc);
  119. extern int heap_close(HP_INFO *info);
  120. extern int heap_write(HP_INFO *info,const byte *buff);
  121. extern int heap_update(HP_INFO *info,const byte *old,const byte *newdata);
  122. extern int heap_rrnd(HP_INFO *info,byte *buf,byte *pos);
  123. extern int heap_scan_init(HP_INFO *info);
  124. extern int heap_scan(register HP_INFO *info, byte *record);
  125. extern int heap_delete(HP_INFO *info,const byte *buff);
  126. extern int heap_info(HP_INFO *info,HEAPINFO *x,int flag);
  127. extern int heap_create(const char *name);
  128. extern int heap_delete_all(const char *name);
  129. extern int heap_extra(HP_INFO *info,enum ha_extra_function function);
  130. extern int heap_rename(const char *old_name,const char *new_name);
  131. extern int heap_panic(enum ha_panic_function flag);
  132. extern int heap_rsame(HP_INFO *info,byte *record,int inx);
  133. extern int heap_rnext(HP_INFO *info,byte *record);
  134. extern int heap_rprev(HP_INFO *info,byte *record);
  135. extern int heap_rfirst(HP_INFO *info,byte *record);
  136. extern int heap_rlast(HP_INFO *info,byte *record);
  137. extern void heap_clear(HP_INFO *info);
  138. extern int heap_rkey(HP_INFO *info,byte *record,int inx,const byte *key);
  139. extern gptr heap_find(HP_INFO *info,int inx,const byte *key);
  140. extern int heap_check_heap(HP_INFO *info, my_bool print_status);
  141. extern byte *heap_position(HP_INFO *info);
  142. /* The following is for programs that uses the old HEAP interface where
  143.    pointer to rows where a long instead of a (byte*).
  144. */
  145. #if defined(WANT_OLD_HEAP_VERSION) || defined(OLD_HEAP_VERSION)
  146. extern int heap_rrnd_old(HP_INFO *info,byte *buf,ulong pos);
  147. extern ulong heap_position_old(HP_INFO *info);
  148. #endif
  149. #ifdef OLD_HEAP_VERSION
  150. typedef ulong HEAP_PTR;
  151. #define heap_position(A) heap_position_old(A)
  152. #define heap_rrnd(A,B,C) heap_rrnd_old(A,B,C)
  153. #else
  154. typedef byte *HEAP_PTR;
  155. #endif
  156. #ifdef __cplusplus
  157. }
  158. #endif
  159. #endif