【问题标题】:zlib and MySQL UDFszlib 和 MySQL UDF
【发布时间】:2014-01-22 14:03:16
【问题描述】:

我正在尝试为 MySQL 创建 2 个 UDF,用于压缩和解压缩数据,以便进一步将其存储在数据库中。在本网站上的一些人的帮助下,我创建了一个成功压缩然后解压缩数据的函数:

#include "string.h"
#include "stdio.h"
#include "mysql/mysql.h"
#include "zlib.h"
#include "stdlib.h"

int main ()
{


const char *istream = "test sentence";
ulong srcLen = strlen(istream)+1;
ulong destLen = compressBound(srcLen);
char* ostream = malloc(destLen);
int res = compress(ostream, &destLen, istream, srcLen);
if (res == Z_OK) printf("%s\n", ostream);
else printf("%i", res);


const char *data = ostream;
ulong size = strlen(data) + 1;
char *ret = malloc(size);
unsigned long new_size;

int rez;
//int i = 0;
int sz = 8*size;
new_size = sz = sz + 8 - (sz % 8);
for(;;)
{
    //fprintf(stderr,"%d[u]: %d\n",++i,(int)sz);
       ret = realloc(ret,sz);
       rez = uncompress(ret, &new_size, data, new_size);
       if(Z_BUF_ERROR == rez){
        sz*=2;
        new_size = sz;
        continue;
    }
    break;
}
if(Z_OK==rez){
ret = realloc(ret,new_size + 8 - (new_size % 8));
printf("%s\n", ret);
}
else printf("%i", rez);



return 0;
}

它就像一个魅力,所以我尝试以 2 个 UDF 的形式为 MySQL 重新创建它。 压缩功能:

#include "string.h"
#include "stdio.h"
#include "mysql/mysql.h"
#include "zlib.h"
#include "stdlib.h"
my_bool CompFunc_init( UDF_INIT *initid, UDF_ARGS *args, char *msg)
{
if (args->arg_count != 1)
{
    memcpy(msg, "Missing message argument.", 26);
    return 1;
}
if (args->arg_type[0] != STRING_RESULT)
{
    args->arg_type = STRING_RESULT;
}
initid->ptr = malloc(compressBound(strlen(args->args[0])) + 1);
return 0;
}
char *CompFunc( UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, my_bool *is_null, my_bool *error)
{
const char *istream = args->args[0];
ulong srcLen = strlen(istream)+1;
ulong destLen = compressBound(srcLen);
int res = compress(initid->ptr, &destLen, istream, srcLen);
if (res == Z_OK) {
    *length = destLen;
    sprintf(result,"%s", initid->ptr);
    return result;
}
else { sprintf(result, "%i", res); return result;}
}
void CompFunc_deinit(UDF_INIT *initid)
{
free(initid->ptr);
}

解压功能:

#include "string.h"
#include "stdio.h"
#include "mysql/mysql.h"
#include "zlib.h"
#include "stdlib.h"

my_bool UCompFunc_init( UDF_INIT *initid, UDF_ARGS *args, char *msg)
{
if (args->arg_count != 1)
{
    memcpy(msg, "Missing message argument.", 26);
    return 1;
}
if (args->arg_type[0] != STRING_RESULT)
{
    args->arg_type = STRING_RESULT;
}
initid->ptr = malloc(strlen(args->args[0]) + 1);
return 0;
}
char *UCompFunc( UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, my_bool *is_null, my_bool *error)
{
const char *data = args->args[0];
ulong size = strlen(data) + 1;
unsigned long new_size;

int rez;
//int i = 0;
int sz = 8*size;
new_size = sz = sz + 8 - (sz % 8);
for(;;)
{
    //fprintf(stderr,"%d[u]: %d\n",++i,(int)sz);
        initid->ptr = realloc(initid->ptr,sz);
        rez = uncompress(initid->ptr, &new_size, data, new_size);
        if(Z_BUF_ERROR == rez){
        sz*=2;
        new_size = sz;
        continue;
    }
    break;
}
if(Z_OK==rez) initid->ptr = realloc(initid->ptr,new_size + 8 - (new_size % 8));
else { sprintf(result, "%i", rez); return result;}
*length = new_size;
sprintf(result,"%s", initid->ptr);
return result;
}
void UCompFunc_deinit(UDF_INIT *initid)
{
free(initid->ptr);
}

压缩UDF貌似可以正常工作,但是解压UDF不会返回解压后的文本,而是Z_BUF_ERROR的错误,说明输入缓冲区有问题!谁能帮我指出错误?

【问题讨论】:

    标签: mysql c compression zlib


    【解决方案1】:
    • 您不能使用strlen() 来获取压缩数据的长度。它不以零结尾,并且很可能在其中包含零。即使压缩数据很长,strlen() 的结果也可能是一个非常小的数字。压缩数据的长度在compress() 的第二个参数中返回。你应该使用它。
    • sz = 8*whatever 之后,您可以放心sz % 8 为零。
    • 每次重新分配输出缓冲区并重试整个解压缩过程都非常浪费时间。您应该改用 inflateInit()inflate()inflateEnd() 函数,尽可能多地解压缩到可用缓冲区中,然后重新分配。
    • 最好还是将未压缩的长度与压缩数据一起发送,这样您只需进行一次分配。
    • uncompress() 的第四个参数必须是压缩数据的长度。不是重复输出缓冲区的长度。
    • 如果uncompress() 返回了Z_BUF_ERROR,你将如何返回它?

    底线:根据文档使用uncompress()

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2012-09-09
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2015-03-18
      • 2010-11-16
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多