~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/compression/compress.cc

Merged in latest plugin-slot-reorg.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
   along with this program; if not, write to the Free Software
14
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
15
15
 
16
 
#include <drizzled/common_includes.h>
17
 
#include <drizzled/item_func.h>
18
 
#include <drizzled/item_strfunc.h>
19
 
#include <drizzled/drizzled_error_messages.h>
 
16
#include <drizzled/server_includes.h>
 
17
#include <drizzled/plugin/function.h>
 
18
#include <drizzled/item/func.h>
 
19
#include <drizzled/function/str/strfunc.h>
 
20
#include <drizzled/error.h>
 
21
#include <drizzled/sql_error.h>
 
22
#include <drizzled/current_session.h>
20
23
#include <zlib.h>
21
 
 
22
 
class Item_func_compress: public Item_str_func
23
 
{
24
 
  String buffer;
25
 
public:
26
 
  Item_func_compress():Item_str_func(){}
27
 
  void fix_length_and_dec(){max_length= (args[0]->max_length*120)/100+12;}
28
 
  const char *func_name() const{return "compress";}
29
 
  String *val_str(String *) ;
30
 
};
 
24
#include "plugin/compression/compress.h"
 
25
 
 
26
#include <string>
 
27
 
 
28
using namespace std;
31
29
 
32
30
String *Item_func_compress::val_str(String *str)
33
31
{
58
56
  new_size= res->length() + res->length() / 5 + 12;
59
57
 
60
58
  // Check new_size overflow: new_size <= res->length()
61
 
  if (((uint32_t) (new_size+5) <= res->length()) || 
 
59
  if (((uint32_t) (new_size+5) <= res->length()) ||
62
60
      buffer.realloc((uint32_t) new_size + 4 + 1))
63
61
  {
64
62
    null_value= 1;
69
67
 
70
68
  // As far as we have checked res->is_empty() we can use ptr()
71
69
  if ((err= compress(body, &new_size,
72
 
                     (const Bytef*)res->ptr(), res->length())) != Z_OK)
 
70
                     (const Bytef*)res->ptr(), res->length())) != Z_OK)
73
71
  {
74
72
    code= err==Z_MEM_ERROR ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_BUF_ERROR;
75
 
    push_warning(current_thd, DRIZZLE_ERROR::WARN_LEVEL_ERROR, code, ER(code));
 
73
    push_warning(current_session, DRIZZLE_ERROR::WARN_LEVEL_ERROR,
 
74
                 code, ER(code));
76
75
    null_value= 1;
77
76
    return 0;
78
77
  }
93
92
}
94
93
 
95
94
 
96
 
Item_func* create_compressudf_item(MEM_ROOT* m)
97
 
{
98
 
  return  new (m) Item_func_compress();
99
 
}
100
 
 
101
 
static struct udf_func compressudf = {
102
 
  { C_STRING_WITH_LEN("compress") },
103
 
  create_compressudf_item
104
 
};
105
 
 
106
 
static int compressudf_plugin_init(void *p)
107
 
{
108
 
  udf_func **f = (udf_func**) p;
109
 
 
110
 
  *f= &compressudf;
111
 
 
112
 
  return 0;
113
 
}
114
 
 
115
 
static int compressudf_plugin_deinit(void *p)
116
 
{
117
 
  udf_func *udff = (udf_func *) p;
118
 
  (void)udff;
119
 
  return 0;
120
 
}
121
 
 
122
 
mysql_declare_plugin(compress)
123
 
{
124
 
  DRIZZLE_UDF_PLUGIN,
125
 
  "compress",
126
 
  "1.0",
127
 
  "Stewart Smith",
128
 
  "UDF for compress()",
129
 
  PLUGIN_LICENSE_GPL,
130
 
  compressudf_plugin_init, /* Plugin Init */
131
 
  compressudf_plugin_deinit, /* Plugin Deinit */
132
 
  NULL,   /* status variables */
133
 
  NULL,   /* system variables */
134
 
  NULL    /* config options */
135
 
}
136
 
mysql_declare_plugin_end;