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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program 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
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. #ifdef __GNUC__
  17. #pragma implementation // gcc: Class implementation
  18. #endif
  19. #include "mysql_priv.h"
  20. #include <myisampack.h>
  21. #include "ha_heap.h"
  22. /*****************************************************************************
  23. ** HEAP tables
  24. *****************************************************************************/
  25. const char **ha_heap::bas_ext() const
  26. { static const char *ext[1]= { NullS }; return ext; }
  27. int ha_heap::open(const char *name, int mode, uint test_if_locked)
  28. {
  29.   uint key,part,parts,mem_per_row=0;
  30.   ulong max_rows;
  31.   HP_KEYDEF *keydef;
  32.   HP_KEYSEG *seg;
  33.   for (key=parts=0 ; key < table->keys ; key++)
  34.     parts+=table->key_info[key].key_parts;
  35.   if (!(keydef=(HP_KEYDEF*) my_malloc(table->keys*sizeof(HP_KEYDEF)+
  36.       parts*sizeof(HP_KEYSEG),MYF(MY_WME))))
  37.     return my_errno;
  38.   seg=my_reinterpret_cast(HP_KEYSEG*) (keydef+table->keys);
  39.   for (key=0 ; key < table->keys ; key++)
  40.   {
  41.     KEY *pos=table->key_info+key;
  42.     mem_per_row += (pos->key_length + (sizeof(char*) * 2));
  43.     
  44.     keydef[key].keysegs=(uint) pos->key_parts;
  45.     keydef[key].flag = (pos->flags & HA_NOSAME);
  46.     keydef[key].seg=seg;
  47.     
  48.     for (part=0 ; part < pos->key_parts ; part++)
  49.     {
  50.       uint flag=pos->key_part[part].key_type;
  51.       if (!f_is_packed(flag) &&
  52.   f_packtype(flag) == (int) FIELD_TYPE_DECIMAL &&
  53.   !(flag & FIELDFLAG_BINARY))
  54. seg->type= (int) HA_KEYTYPE_TEXT;
  55.       else
  56. seg->type= (int) HA_KEYTYPE_BINARY;
  57.       seg->start=(uint) pos->key_part[part].offset;
  58.       seg->length=(uint) pos->key_part[part].length;
  59.       seg++;
  60.     }
  61.   }
  62.   mem_per_row += MY_ALIGN(table->reclength+1, sizeof(char*));
  63.   max_rows = (ulong) (max_heap_table_size / mem_per_row);
  64.   file=heap_open(name,mode,
  65.  table->keys,keydef,
  66.  table->reclength,
  67.  ((table->max_rows < max_rows && table->max_rows) ? 
  68.   table->max_rows : max_rows),
  69.  table->min_rows);
  70.   my_free((gptr) keydef,MYF(0));
  71.   info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE);
  72.   ref_length=sizeof(HEAP_PTR);
  73.   return (!file ? errno : 0);
  74. }
  75. int ha_heap::close(void)
  76. {
  77.   return heap_close(file);
  78. }
  79. int ha_heap::write_row(byte * buf)
  80. {
  81.   statistic_increment(ha_write_count,&LOCK_status);
  82.   if (table->time_stamp)
  83.     update_timestamp(buf+table->time_stamp-1);
  84.   return heap_write(file,buf);
  85. }
  86. int ha_heap::update_row(const byte * old_data, byte * new_data)
  87. {
  88.   statistic_increment(ha_update_count,&LOCK_status);
  89.   if (table->time_stamp)
  90.     update_timestamp(new_data+table->time_stamp-1);
  91.   return heap_update(file,old_data,new_data);
  92. }
  93. int ha_heap::delete_row(const byte * buf)
  94. {
  95.   statistic_increment(ha_delete_count,&LOCK_status);
  96.   return heap_delete(file,buf);
  97. }
  98. int ha_heap::index_read(byte * buf, const byte * key,
  99. uint key_len __attribute__((unused)),
  100. enum ha_rkey_function find_flag
  101. __attribute__((unused)))
  102. {
  103.   statistic_increment(ha_read_key_count,&LOCK_status);
  104.   int error=heap_rkey(file,buf,active_index, key);
  105.   table->status=error ? STATUS_NOT_FOUND: 0;
  106.   return error;
  107. }
  108. int ha_heap::index_read_idx(byte * buf, uint index, const byte * key,
  109.     uint key_len __attribute__((unused)),
  110.     enum ha_rkey_function find_flag
  111.     __attribute__((unused)))
  112. {
  113.   statistic_increment(ha_read_key_count,&LOCK_status);
  114.   int error=heap_rkey(file, buf, index, key);
  115.   table->status=error ? STATUS_NOT_FOUND: 0;
  116.   return error;
  117. }
  118. int ha_heap::index_next(byte * buf)
  119. {
  120.   statistic_increment(ha_read_next_count,&LOCK_status);
  121.   int error=heap_rnext(file,buf);
  122.   table->status=error ? STATUS_NOT_FOUND: 0;
  123.   return error;
  124. }
  125. int ha_heap::index_prev(byte * buf)
  126. {
  127.   statistic_increment(ha_read_prev_count,&LOCK_status);
  128.   int error=heap_rprev(file,buf);
  129.   table->status=error ? STATUS_NOT_FOUND: 0;
  130.   return error;
  131. }
  132.   
  133. int ha_heap::index_first(byte * buf)
  134. {
  135.   statistic_increment(ha_read_first_count,&LOCK_status);
  136.   int error=heap_rfirst(file, buf);
  137.   table->status=error ? STATUS_NOT_FOUND: 0;
  138.   return error;
  139. }
  140. int ha_heap::index_last(byte * buf)
  141. {
  142.   statistic_increment(ha_read_last_count,&LOCK_status);
  143.   int error=heap_rlast(file, buf);
  144.   table->status=error ? STATUS_NOT_FOUND: 0;
  145.   return error;
  146. }
  147. int ha_heap::rnd_init(bool scan)
  148. {
  149.   return scan ? heap_scan_init(file) : 0;
  150. }
  151. int ha_heap::rnd_next(byte *buf)
  152. {
  153.   statistic_increment(ha_read_rnd_next_count,&LOCK_status);
  154.   int error=heap_scan(file, buf);
  155.   table->status=error ? STATUS_NOT_FOUND: 0;
  156.   return error;
  157. }
  158. int ha_heap::rnd_pos(byte * buf, byte *pos)
  159. {
  160.   int error;
  161.   HEAP_PTR position;
  162.   statistic_increment(ha_read_rnd_count,&LOCK_status);
  163.   memcpy_fixed((char*) &position,pos,sizeof(HEAP_PTR));
  164.   error=heap_rrnd(file, buf, position);
  165.   table->status=error ? STATUS_NOT_FOUND: 0;
  166.   return error;
  167. }
  168. void ha_heap::position(const byte *record)
  169. {
  170.   *(HEAP_PTR*) ref= heap_position(file); // Ref is aligned
  171. }
  172. void ha_heap::info(uint flag)
  173. {
  174.   HEAPINFO info;
  175.   (void) heap_info(file,&info,flag);
  176.   records = info.records;
  177.   deleted = info.deleted;
  178.   errkey  = info.errkey;
  179.   mean_rec_length=info.reclength;
  180.   data_file_length=info.data_length;
  181.   index_file_length=info.index_length;
  182.   max_data_file_length= info.max_records* info.reclength;
  183.   delete_length= info.deleted * info.reclength;
  184. }
  185. int ha_heap::extra(enum ha_extra_function operation)
  186. {
  187.   return heap_extra(file,operation);
  188. }
  189. int ha_heap::reset(void)
  190. {
  191.   return heap_extra(file,HA_EXTRA_RESET);
  192. }
  193. int ha_heap::delete_all_rows()
  194. {
  195.   heap_clear(file);
  196.   return 0;
  197. }
  198. int ha_heap::external_lock(THD *thd, int lock_type)
  199. {
  200.   return 0; // No external locking
  201. }  
  202. THR_LOCK_DATA **ha_heap::store_lock(THD *thd,
  203.     THR_LOCK_DATA **to,
  204.     enum thr_lock_type lock_type)
  205. {
  206.   if (lock_type != TL_IGNORE && file->lock.type == TL_UNLOCK)
  207.     file->lock.type=lock_type;
  208.   *to++= &file->lock;
  209.   return to;
  210. }
  211. /*
  212.   We have to ignore ENOENT entries as the HEAP table is created on open and
  213.   not when doing a CREATE on the table.
  214. */
  215. int ha_heap::delete_table(const char *name)
  216. {
  217.   int error=heap_delete_all(name);
  218.   return error == ENOENT ? 0 : error;
  219. }
  220. int ha_heap::rename_table(const char * from, const char * to)
  221. {
  222.   return heap_rename(from,to);
  223. }
  224. ha_rows ha_heap::records_in_range(int inx,
  225.   const byte *start_key,uint start_key_len,
  226.   enum ha_rkey_function start_search_flag,
  227.   const byte *end_key,uint end_key_len,
  228.   enum ha_rkey_function end_search_flag)
  229. {
  230.   KEY *pos=table->key_info+inx;
  231.   if (start_key_len != end_key_len ||
  232.       start_key_len != pos->key_length ||
  233.       start_search_flag != HA_READ_KEY_EXACT ||
  234.       end_search_flag != HA_READ_AFTER_KEY)
  235.     return HA_POS_ERROR; // Can't only use exact keys
  236.   return 10; // Good guess
  237. }
  238. /* We can just delete the heap on creation */
  239. int ha_heap::create(const char *name, TABLE *form, HA_CREATE_INFO *create_info)
  240. {
  241.   char buff[FN_REFLEN];
  242.   return heap_create(fn_format(buff,name,"","",4+2));
  243. }