00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <config.h>
00017 #include <drizzled/plugin/function.h>
00018 #include <drizzled/item/func.h>
00019 #include <drizzled/function/str/strfunc.h>
00020 #include <drizzled/error.h>
00021 #include <drizzled/sql_error.h>
00022 #include <drizzled/current_session.h>
00023 #include <zlib.h>
00024 #include <plugin/compression/compress.h>
00025
00026 #include <string>
00027
00028 using namespace std;
00029 using namespace drizzled;
00030
00031 String *Item_func_compress::val_str(String *str)
00032 {
00033 int err= Z_OK;
00034 drizzled::error_t code;
00035 ulong new_size;
00036 String *res;
00037 Byte *body;
00038 char *tmp, *last_char;
00039 assert(fixed == 1);
00040
00041 if (!(res= args[0]->val_str(str)))
00042 {
00043 null_value= 1;
00044 return 0;
00045 }
00046 null_value= 0;
00047 if (res->is_empty()) return res;
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 new_size= res->length() + res->length() / 5 + 12;
00059
00060
00061 if (((uint32_t) (new_size+5) <= res->length()) ||
00062 buffer.realloc((uint32_t) new_size + 4 + 1))
00063 {
00064 null_value= 1;
00065 return 0;
00066 }
00067
00068 body= ((Byte*)buffer.ptr()) + 4;
00069
00070
00071 if ((err= compress(body, &new_size,
00072 (const Bytef*)res->ptr(), res->length())) != Z_OK)
00073 {
00074 code= err==Z_MEM_ERROR ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_BUF_ERROR;
00075 push_warning(current_session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
00076 code, ER(code));
00077 null_value= 1;
00078 return 0;
00079 }
00080
00081 tmp= (char*)buffer.ptr();
00082 int4store(tmp, res->length() & 0x3FFFFFFF);
00083
00084
00085 last_char= ((char*)body)+new_size-1;
00086 if (*last_char == ' ')
00087 {
00088 *++last_char= '.';
00089 new_size++;
00090 }
00091
00092 buffer.length((uint32_t)new_size + 4);
00093 return &buffer;
00094 }
00095
00096