各位高手好!
小弟有一问题求帮助!
目前在做的项目用到了redis和mysql,同步的时候想到了使用udf建立socket和redis通信进而同步缓存。
经过一番搜索找到了七星高手写的C代码,于是尝试使用。
可是udf怎么调用都不成功。于是在本地IDE里试着模仿udf的调用,从main函数调用用于udf的函数。连接到redis
的socket一点问题都木有,每次都成功 于是乎编译成so扔到plugin文件夹。结果执行还是跳到socket没有连接成功的
那段代码上。
各位高手能不能指点一下。据说udf内不能在函数里新建指针什么的?有这回事么。?调试的时候想写个文件看看,但是只要写上fopen 就提示lost connection。英文文档看了一半实在看不下去了。
struct credis
{
int fd;
struct sockaddr_in addr;
};
struct credis *res = NULL;
my_bool redis_connect_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
if (args->arg_count != 2)
{
strcpy(message,"Wrong arguments to metaphon; Use the source");
return 1;
}
args->arg_type[0] = STRING_RESULT;
args->arg_type[1] = INT_RESULT;
initid->ptr = NULL;
return 0;
}
char *redis_connect(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
{
uint16_t port;
FILE *fp;
if(res != NULL)
{
credis_close(res);
}
port = *((ushort*) args->args[1]);
res = credis_connect(args->args[0], port);
if (res == NULL)
{
*length = 60;
fp = fopen("/home/result.log", "a");
fprintf(fp, "this is log");
fclose(fp);
return "Error connecting to Redis server. Please start server to run"; //在mysql中调用的时候一直运行这个return。
}
fp = fopen("/home/result.log", "a");
fprintf(fp, "this is log");
fclose(fp);
*length = 2;
return "OK";//写个main函数本地调试的时候每次都成功
}
struct credis *credis_connect(char *host, uint16_t port)
{
struct timeval timeout;
struct credis *redis;
redis = (struct credis *)malloc(sizeof(struct credis));
if(redis == NULL) return NULL;
redis->fd = socket(AF_INET, SOCK_STREAM, 0);
redis->addr.sin_family = AF_INET;
redis->addr.sin_port = htons(port);
redis->addr.sin_addr.s_addr = inet_addr(host);
timeout.tv_sec = 5;
timeout.tv_usec = 0;
setsockopt(redis->fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
setsockopt(redis->fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
if(connect(redis->fd, (struct sockaddr *)&redis->addr, sizeof(struct sockaddr)) == -1)
{
safe_free(redis);
return NULL;
}
return redis;
}