00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <config.h>
00031 #include <drizzled/session.h>
00032 #include "query_cache_service.h"
00033 #include <drizzled/table_list.h>
00034
00035 using namespace std;
00036
00037 namespace drizzled
00038 {
00039
00040 QueryCacheService::CacheEntries QueryCacheService::cache;
00041 QueryCacheService::CachedTablesEntries QueryCacheService::cachedTables;
00042
00043 message::Resultset *QueryCacheService::setCurrentResultsetMessage(Session *in_session)
00044 {
00045 message::Resultset *resultset= in_session->getResultsetMessage();
00046
00047 if (unlikely(resultset == NULL))
00048 {
00049
00050
00051
00052
00053 resultset= new (nothrow) message::Resultset();
00054 in_session->setResultsetMessage(resultset);
00055
00056
00057
00058 cache[in_session->query_cache_key]= message::Resultset();
00059 }
00060 return resultset;
00061 }
00062
00063 void QueryCacheService::setResultsetHeader(message::Resultset &resultset,
00064 Session *in_session,
00065 TableList *in_table)
00066 {
00067
00068 message::SelectHeader *header= resultset.mutable_select_header();
00069
00070 (void) in_session;
00071
00072
00073
00074
00075
00076 for (TableList* tmp_table= in_table; tmp_table; tmp_table= tmp_table->next_global)
00077 {
00078 message::TableMeta *table_meta= header->add_table_meta();
00079 table_meta->set_schema_name(tmp_table->db, strlen(tmp_table->db));
00080 table_meta->set_table_name(tmp_table->table_name, strlen(tmp_table->table_name));
00081
00082 QueryCacheService::cachedTables[strcat(tmp_table->db, tmp_table->table_name)].push_back(in_session->query_cache_key);
00083 }
00084
00085
00086
00087
00088 List<Item>::iterator it(in_session->lex().select_lex.item_list);
00089 Item *item;
00090 while ((item=it++))
00091 {
00092 SendField field;
00093 item->make_field(&field);
00094
00095 message::FieldMeta *field_meta= header->add_field_meta();
00096 field_meta->set_field_name(field.col_name, strlen(field.col_name));
00097 field_meta->set_schema_name(field.db_name, strlen(field.db_name));
00098 field_meta->set_table_name(field.table_name, strlen(field.table_name));
00099 field_meta->set_field_alias(field.org_col_name, strlen(field.org_col_name));
00100 field_meta->set_table_alias(field.org_table_name, strlen(field.org_table_name));
00101 }
00102 }
00103
00104 bool QueryCacheService::addRecord(Session *in_session, List<Item> &list)
00105 {
00106 message::Resultset *resultset= in_session->getResultsetMessage();
00107
00108 if (resultset != NULL)
00109 {
00110 message::SelectData *data= resultset->mutable_select_data();
00111 data->set_segment_id(1);
00112 data->set_end_segment(true);
00113 message::SelectRecord *record= data->add_record();
00114
00115 List<Item>::iterator li(list);
00116
00117 char buff[MAX_FIELD_WIDTH];
00118 String buffer(buff, sizeof(buff), &my_charset_bin);
00119
00120 Item *current_field;
00121 while ((current_field= li++))
00122 {
00123 if (current_field->is_null())
00124 {
00125 record->add_is_null(true);
00126 record->add_record_value("", 0);
00127 }
00128 else
00129 {
00130 String *string_value= current_field->val_str(&buffer);
00131 record->add_is_null(false);
00132 record->add_record_value(string_value->c_ptr(), string_value->length());
00133 string_value->free();
00134 }
00135 }
00136 return false;
00137 }
00138 return true;
00139 }
00140
00141 bool QueryCacheService::isCached(string query)
00142 {
00143 CacheEntries::iterator it= QueryCacheService::cache.find(query);
00144 if (it != QueryCacheService::cache.end())
00145 return true;
00146 return false;
00147 }
00148 }