00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #pragma once
00022
00023 #include <drizzled/plugin/client.h>
00024 #include <drizzled/plugin/query_cache.h>
00025 #include <drizzled/plugin/transactional_storage_engine.h>
00026 #include <drizzled/select_result.h>
00027 #include <drizzled/sql_lex.h>
00028 #include <drizzled/open_tables_state.h>
00029
00030 namespace drizzled {
00031
00032 class select_send : public select_result
00033 {
00034 public:
00035 bool send_eof()
00036 {
00037
00038
00039
00040
00041
00042 plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
00043
00044
00045 if (session->open_tables.lock)
00046 {
00047 session->unlockTables(session->open_tables.lock);
00048 session->open_tables.lock= 0;
00049 }
00050 session->my_eof();
00051 return false;
00052 }
00053
00054 void send_fields(List<Item>& list)
00055 {
00056 session->getClient()->sendFields(list);
00057 }
00058
00059
00060
00061 bool send_data(List<Item>& items)
00062 {
00063 if (unit->offset_limit_cnt)
00064 {
00065 unit->offset_limit_cnt--;
00066 return false;
00067 }
00068
00069
00070
00071
00072
00073
00074 plugin::TransactionalStorageEngine::releaseTemporaryLatches(session);
00075
00076 List<Item>::iterator li(items.begin());
00077 char buff[MAX_FIELD_WIDTH];
00078 String buffer(buff, sizeof(buff), &my_charset_bin);
00079
00080 while (Item* item= li++)
00081 {
00082 item->send(session->getClient(), &buffer);
00083 }
00084
00085
00086
00087
00088
00089
00090 session->sent_row_count++;
00091 if (session->is_error())
00092 return true;
00093 return session->getClient()->flush();
00094 }
00095 };
00096
00097 }
00098