在mysql udf函数内建立socket连接

MySql 码拜 8年前 (2016-02-16) 1219次浏览
各位高手好!
小弟有一问题求帮助!
目前在做的项目用到了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;
}
解决方案

60

lost connection没有这个提示的代码?
换了个环境就好了,是什么环境换了?
使用udf建立socket和redis通信进而同步缓存,是将缓存的同步到数据库,还是反过来?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在mysql udf函数内建立socket连接
喜欢 (0)
[1034331897@qq.com]
分享 (0)