00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022
00023 #include <plugin/utility_dictionary/dictionary.h>
00024
00025 #include <drizzled/atomics.h>
00026 #include <drizzled/session.h>
00027 #include <drizzled/sql_lex.h>
00028
00029 using namespace drizzled;
00030 using namespace std;
00031
00032 #define LARGEST_RANDOM_STRING 512
00033
00034 static const char ALPHANUMERICS[]=
00035 "0123456789ABCDEFGHIJKLMNOPQRSTWXYZabcdefghijklmnopqrstuvwxyz";
00036
00037 #define ALPHANUMERICS_SIZE (sizeof(ALPHANUMERICS)-1)
00038
00039 static size_t get_alpha_num(void)
00040 {
00041 return (size_t)random() % ALPHANUMERICS_SIZE;
00042 }
00043
00044 utility_dictionary::RandomString::RandomString() :
00045 plugin::TableFunction("DATA_DICTIONARY", "RANDOM_STRING")
00046 {
00047 add_field("VALUE", plugin::TableFunction::STRING, LARGEST_RANDOM_STRING, false);
00048 }
00049
00050 bool utility_dictionary::RandomString::Generator::populate()
00051 {
00052 if (lex().isSumExprUsed() && count > 0)
00053 return false;
00054
00055 if (lex().current_select->group_list.elements && count > 0)
00056 return false;
00057
00058 if (lex().current_select->explicit_limit or count == 0)
00059 {
00060 uint32_t random_char_number= random() % LARGEST_RANDOM_STRING;
00061 char buffer[LARGEST_RANDOM_STRING];
00062
00063 for (uint32_t x= 0; x < random_char_number; x++)
00064 buffer[x]= ALPHANUMERICS[get_alpha_num()];
00065 buffer[random_char_number]= 0;
00066
00067 push(buffer, random_char_number);
00068 }
00069 else
00070 {
00071 return false;
00072 }
00073
00074 count++;
00075
00076 return true;
00077 }