home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / sql / sql_cache.cpp < prev    next >
C/C++ Source or Header  |  2000-10-05  |  3KB  |  99 lines

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