emb_qcache.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

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. class Querycache_stream
  17. {
  18.   byte *cur_data;
  19.   byte *data_end;
  20.   Query_cache_block *block;
  21.   uint headers_len;
  22. public:
  23. #ifndef DBUG_OFF
  24.   Query_cache_block *first_block;
  25.   uint stored_size;
  26. #endif
  27.   Querycache_stream(Query_cache_block *ini_block, uint ini_headers_len) :
  28.     block(ini_block), headers_len(ini_headers_len)    
  29.   {
  30.     cur_data= ((byte*)block)+headers_len;
  31.     data_end= cur_data + (block->used-headers_len);
  32. #ifndef DBUG_OFF
  33.     first_block= ini_block;
  34.     stored_size= 0;
  35. #endif
  36.   }
  37.   void use_next_block(bool writing)
  38.   {
  39.     /*
  40.       This shouldn't be called if there is only one block, or to loop
  41.       around to the first block again. That means we're trying to write
  42.       more data than we allocated space for.
  43.     */
  44.     DBUG_ASSERT(block->next != block);
  45.     DBUG_ASSERT(block->next != first_block);
  46.     block= block->next;
  47.     /*
  48.       While writing, update the type of each block as we write to it.
  49.       While reading, make sure that the block is of the expected type.
  50.     */
  51.     if (writing)
  52.       block->type= Query_cache_block::RES_CONT;
  53.     else
  54.       DBUG_ASSERT(block->type == Query_cache_block::RES_CONT);
  55.     cur_data= ((byte*)block)+headers_len;
  56.     data_end= cur_data + (block->used-headers_len);
  57.   }
  58.   void store_char(char c);
  59.   void store_short(ushort s);
  60.   void store_int(uint i);
  61.   void store_ll(ulonglong ll);
  62.   void store_str_only(const char *str, uint str_len);
  63.   void store_str(const char *str, uint str_len);
  64.   void store_safe_str(const char *str, uint str_len);
  65.   char load_char();
  66.   ushort load_short();
  67.   uint load_int();
  68.   ulonglong load_ll();
  69.   void load_str_only(char *buffer, uint str_len);
  70.   char *load_str(MEM_ROOT *alloc, uint *str_len);
  71.   int load_safe_str(MEM_ROOT *alloc, char **str, uint *str_len);
  72.   int load_column(MEM_ROOT *alloc, char **column);
  73. };
  74. uint emb_count_querycache_size(THD *thd);
  75. int emb_load_querycache_result(THD *thd, Querycache_stream *src);
  76. void emb_store_querycache_result(Querycache_stream *dst, THD* thd);