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 >
Wrap
C/C++ Source or Header
|
2000-10-05
|
3KB
|
99 lines
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "mysql_priv.h"
#include <m_ctype.h>
#include <my_dir.h>
#include <hash.h>
#define SQL_CACHE_LENGTH 30 // 300 crashes apple gcc.
HASH sql_cache;
static LEX lex_array_static[SQL_CACHE_LENGTH];
LEX * lex_array = lex_array_static;
int last_lex_array_item = SQL_CACHE_LENGTH - 1;
/* Function to return a text string from a LEX struct */
static byte *cache_key(const byte *record, uint *length, my_bool not_used)
{
#ifdef QQ
LEX *lex=(LEX*) record;
*length = lex->sql_query_length;
// *length = strlen(lex->ptr);
return (byte*) lex->sql_query_text;
// return (byte*) lex->ptr;
#endif
return 0;
}
/* At the moment we do not really want to do anything upon delete */
static void free_cache_entry(void *entry)
{
}
/* Initialization of the SQL cache hash -- should be called during
the bootstrap stage */
bool sql_cache_init(void)
{
if (query_buff_size)
{
VOID(hash_init(&sql_cache, 4096, 0, 0,
cache_key,
(void (*)(void*)) free_cache_entry,
0));
}
return 0;
}
/* Clearing the SQL cache hash -- during shutdown */
void sql_cache_free(void)
{
hash_free(&sql_cache);
}
/* Finds whether the SQL command is already in the cache, at any case
establishes correct LEX structure in the THD (either from
cache or a new one) */
int sql_cache_hit(THD *thd, char *sql, uint length)
{
#ifdef QQ
LEX *ptr;
ptr = (LEX *)hash_search(&sql_cache, sql, length);
if (ptr) {
fprintf(stderr, "Query `%s' -- hit in the cache (%p)\n", ptr->sql_query_text, ptr);
thd->lex_ptr = ptr;
ptr->thd = thd;
} else {
thd->lex_ptr = ptr = lex_array + last_lex_array_item--;
lex_start(thd, (uchar *)sql, length);
if (hash_insert(&sql_cache, (const byte *)ptr)) {
fprintf(stderr, "Out of memory during hash_insert?\n");
}
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);
if (!hash_search(&sql_cache, sql, length)) {
fprintf(stderr, "I just enterred a hash key but it's not where -- what's that?\n");
} else {
fprintf(stderr, "Inserted to cache\n");
}
return 0;
}
#endif
return 1;
}