sql_cache.cc
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小: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. #include "mysql_priv.h"
  17. #include <m_ctype.h>
  18. #include <my_dir.h>
  19. #include <hash.h>
  20. #define SQL_CACHE_LENGTH 30 // 300 crashes apple gcc.
  21. HASH sql_cache;
  22. static LEX lex_array_static[SQL_CACHE_LENGTH];
  23. LEX * lex_array = lex_array_static;
  24. int last_lex_array_item = SQL_CACHE_LENGTH - 1;
  25. /* Function to return a text string from a LEX struct */
  26. static byte *cache_key(const byte *record, uint *length, my_bool not_used)
  27. {
  28. #ifdef QQ
  29. LEX *lex=(LEX*) record;
  30. *length = lex->sql_query_length;
  31. // *length = strlen(lex->ptr);
  32. return (byte*) lex->sql_query_text;
  33. // return (byte*) lex->ptr;
  34. #endif
  35.   return 0;
  36. }
  37. /* At the moment we do not really want to do anything upon delete */
  38. static void free_cache_entry(void *entry)
  39. {
  40. }
  41. /* Initialization of the SQL cache hash -- should be called during
  42.    the bootstrap stage */
  43. bool sql_cache_init(void)
  44. {
  45.   if (query_buff_size)
  46.   {
  47.     VOID(hash_init(&sql_cache, 4096, 0, 0,
  48.    cache_key,
  49.    (void (*)(void*)) free_cache_entry,
  50.    0));
  51.   }
  52.   return 0;
  53. }
  54. /* Clearing the SQL cache hash -- during shutdown */
  55. void sql_cache_free(void)
  56. {
  57.   hash_free(&sql_cache);
  58. }
  59. /* Finds whether the  SQL command is already in the cache, at any case
  60. establishes correct LEX structure in the THD (either from
  61. cache or a new one) */
  62. int sql_cache_hit(THD *thd, char *sql, uint length)
  63. {
  64. #ifdef QQ
  65.   LEX *ptr;
  66.   ptr = (LEX *)hash_search(&sql_cache, sql, length);
  67.   if (ptr) {
  68.     fprintf(stderr, "Query `%s' -- hit in the cache (%p)n", ptr->sql_query_text, ptr);
  69.     thd->lex_ptr = ptr;
  70.     ptr->thd = thd;
  71.   } else {
  72.     thd->lex_ptr = ptr = lex_array + last_lex_array_item--;
  73.     lex_start(thd, (uchar *)sql, length);
  74.     if (hash_insert(&sql_cache, (const byte *)ptr)) {
  75.       fprintf(stderr, "Out of memory during hash_insert?n");
  76.     }
  77.     fprintf(stderr, "Query `%s' not found in the cache -- insert %p from slot %dn", thd->lex_ptr->ptr, ptr, last_lex_array_item+1);
  78.     if (!hash_search(&sql_cache, sql, length)) {
  79.       fprintf(stderr, "I just enterred a hash key but it's not where -- what's that?n");
  80.     } else {
  81.       fprintf(stderr, "Inserted to cachen");
  82.     }
  83.     return 0;
  84.   }
  85. #endif
  86.   return 1;
  87. }