⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc_ctl_mysql.c

📁 epoll机制的收发程序 只能在2.6内核上使用
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
 * 文 件 名:rc_ctl_mysql.c
 * 功    能:数据库相关函数
 * 作    者:马云龙
 * E_mail : mayunlong21@163.com
 * 开始时间:2007-4-24 9:40
 * 结束时间:2007-4-27 13:15
 * 修改时间:
 */
#include	<stdio.h>
#include	<stdlib.h>
#include	<unistd.h>
#include	<string.h>
#include	<fcntl.h>
#include	<dirent.h>
#include	<errno.h>
#include	<sys/socket.h>
#include	<netinet/in.h>
#include	<arpa/inet.h>     
#include	<sys/time.h>
#include	<time.h>
#include	<signal.h>
#include	<sys/types.h>
#include	<pthread.h>

#include	"rc_pub_define.h"
#include	"rc_pub_type.h"
#include	"rc_pub_path.h"
#include	"rc_pub_fifo.h"
#include	"rc_pub_file.h"
#include	"rc_pub_packet.h"
#include	"rc_pub_net.h"
#include	"rc_pub_time.h"
#include	"rc_pub_log.h"

#include	"rc_ctl_define.h"
#include	"rc_ctl_data.h"
#include	"rc_ctl_net.h"
#include	"rc_ctl_mysql.h"

#include	"include/mysql.h"
#include	"rc_mysql_util.h"

pthread_mutex_t		mutex_mysql = PTHREAD_MUTEX_INITIALIZER;//数据库互斥锁
MYSQL				mysql;//数据库链接


/*
 * 功  能:根据摄像机序列号来判断数据库中是否存在这台摄像机的记录
 * 参  数:serial:摄像机序列号
 *         type:表的类型
 *         mysql:已经打开的数据库
 *         lab_mysql:标志数据库表是否存在
 * 返回值:存在返回1,不存在返回0,失败则返回-1
 */
int rc_judge_mysql(const unsigned char *serial, int type, struct_lab_mysql *lab_mysql)
{
	int						res;
	int						id;
	unsigned char			value[128];
	unsigned char			msqlstring[1024];
	MYSQL_RES				*mysql_res = NULL;
	MYSQL_ROW				mysql_row;
	
	
	/* 组装sql语句 */
	bzero(msqlstring, sizeof(msqlstring));
	switch(type)
	{
		case TYPE_P_W_SYSTEM://系统相关类型
		{
			if(lab_mysql->system == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_AR003_SYSTEM, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID_SYSTEM, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_SECURITY://安全相关类型
		{
			if(lab_mysql->security == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_AR003_SECURITY, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID_SECURITY, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_NET://网络相关类型
		{
			if(lab_mysql->network == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_AR003_NETWORK, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID_NETWORK, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_DDNS://DDNS相关类型
		{
			if(lab_mysql->ddns == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_AR003_DDNS, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID_DDNS, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_MAILFTP://传输方式相关类型
		{
			if(lab_mysql->mailftp == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_AR003_MAILFTP, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID_MAILFTP, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_VIDEO://视音频相关类型
		{
			if(lab_mysql->video == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_AR003_VIDEO, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID_VIDEO, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_INDEX://首页相关类型
		case TYPE_P_W_TRIGGER://应用相关类型
		{
			if(lab_mysql->trigger == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAM_TABLE_MYSQL_AR003_TRIGGER, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID_TRIGGER, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_STATE_CAM://摄像机状态类型
		case TYPE_P_W_UPDATE://软件更新相关类型
		{
			if(lab_mysql->serial == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s * %s %s %s %s=%u", \
					KEY_MYSQL_SELECT, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_AR003, \
					KEY_MYSQL_WHERE, \
					KEY_CAMERA_ID, lab_mysql->id_cam);
			break;
		}
		case TYPE_P_W_CAMERA://摄像机列表的类型
		{
			if(lab_mysql->camera == TABLE_MYSQL_ALIVE_YES)
				goto LAB_ALIVE_YES;
			sprintf(msqlstring, "%s %s,%s %s %s %s %s='%s'", \
					KEY_MYSQL_SELECT, \
					KEY_CAMID, KEY_USERID, \
					KEY_MYSQL_FROM, \
					NAME_TABLE_MYSQL_CAMERA, \
					KEY_MYSQL_WHERE, \
					KEY_PRODUCTNUM, serial);
			break;
		}
	case TYPE_P_W_TOOL://工具相关类型
		return -1;
		break;
	default:
		return -1;
		break;
	}
//	printf("%s %d msqlstring : %s\n", __FILE__, __LINE__, msqlstring);
	
	/* 判断记录是否存在 */
	pthread_mutex_lock(&mutex_mysql);
	mysql_res = NULL;
	mysql_res = rc_mysql_query(&mysql, msqlstring);
	pthread_mutex_unlock(&mutex_mysql);
	if(mysql_res == NULL)
	{
		printf("\t\t ^^^^^^ %s %d type : %d ^^^^^^\n", __FILE__, __LINE__, type);
#ifdef		DEBUG_MYL
		printf("%s %d db_query error!\n", __FILE__, __LINE__);
#endif
		return TABLE_MYSQL_ALIVE_NO;
	}
	
	mysql_row = mysql_fetch_row(mysql_res);
	if(mysql_row == NULL)
	{
		printf("\t\t ^^^^^^ %s %d type : %d ^^^^^^\n", __FILE__, __LINE__, type);
		goto LAB_ALIVE_NO;
	}
	
	/* 更改sql标志 */
	switch(type)
	{
		case TYPE_P_W_SYSTEM://系统相关类型
			lab_mysql->system = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_SECURITY://安全相关类型
			lab_mysql->security = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_NET://网络相关类型
			lab_mysql->network = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_DDNS://DDNS相关类型
			lab_mysql->ddns = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_MAILFTP://传输方式相关类型
			lab_mysql->mailftp = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_VIDEO://视音频相关类型
			lab_mysql->video = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_INDEX://首页相关类型
		case TYPE_P_W_TRIGGER://应用相关类型
			lab_mysql->trigger = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_STATE_CAM://摄像机状态类型
		case TYPE_P_W_UPDATE://软件更新相关类型
			lab_mysql->serial = TABLE_MYSQL_ALIVE_YES;
			break;
		case TYPE_P_W_CAMERA://摄像机列表的类型
		{
			bzero(value, sizeof(value));
			res = rc_mysql_getString(mysql_res, mysql_row, KEY_CAMID, value, sizeof(value));
			if(res == 1)
			{
				id = atoi(value);
				if(id < 1)
					goto LAB_ALIVE_NO;
				lab_mysql->id_cam = id;
			}
			else
			{
				mysql_free_result(mysql_res);
				return TABLE_MYSQL_ALIVE_NO;
			}
	
			res = rc_mysql_getString(mysql_res, mysql_row, KEY_USERID, value, sizeof(value));
			if(res == 1)
			{
				id = atoi(value);
				if(id < 1)
					goto LAB_ALIVE_NO;
				lab_mysql->id_user = id;
			}
			else
			{
				lab_mysql->id_cam = 0;
				mysql_free_result(mysql_res);
				return TABLE_MYSQL_ALIVE_NO;
			}
			lab_mysql->camera = TABLE_MYSQL_ALIVE_YES;
			break;
		}
		case TYPE_P_W_TOOL://工具相关类型
			goto LAB_ERROR;
			break;
		default:
			goto LAB_ERROR;
			break;
	}
LAB_ALIVE_YES:
	mysql_free_result(mysql_res);
	return TABLE_MYSQL_ALIVE_YES;
LAB_ALIVE_NO:
	mysql_free_result(mysql_res);
	return TABLE_MYSQL_ALIVE_NO;
LAB_ERROR:
	mysql_free_result(mysql_res);
	return -1;
}



/*
 * 功  能:在数据库中查找摄像机是否已经添加
 * 参  数:serial:摄像机序列号
 *         mysql:已经打开的数据库
 *         lab_mysql:标志数据库表是否存在
 * 返回值:已经存在返回值大于0,否则返回值小于0
 */
int rc_select_cam_mysql(const unsigned char *serial, struct_lab_mysql *lab_mysql)
{
	int						res;
	
	if(lab_mysql->id_cam > 0)
		return TABLE_MYSQL_ALIVE_YES;
	res = rc_judge_mysql(serial, TYPE_P_W_CAMERA, lab_mysql);
//	printf("%s %d res : %d\n", __FILE__, __LINE__, res);
	return res;
}

/*
 * 功  能:在数据库中查找摄像机序列号是否已经添加
 * 参  数:serial:摄像机序列号
 *         mysql:已经打开的数据库
 *         lab_mysql:标志数据库表是否存在
 * 返回值:已经存在返回值大于0,否则返回值小于0
 */
int rc_select_serial_mysql(const unsigned char *serial, struct_lab_mysql *lab_mysql)
{
	int						res;
	
	if(lab_mysql->serial > 0)
		return TABLE_MYSQL_ALIVE_YES;
	res = rc_judge_mysql(serial, TYPE_P_W_UPDATE, lab_mysql);
	
	return res;
}

/*
 * 功  能:创建插入网页部分数据库的字符串
 * 参  数:type:标志是摄像机发给服务器的还是cgi传来的
 *         serial:摄像机序列号
 *         lab:标志是哪个网页
 *         buf:数据缓冲区
 *         mysql:已经打开的数据库
 *         output:输出缓冲区
 *         lab_mysql:标志数据库表是否存在
 *         logintime:摄像机的登陆时间
 * 返回值:成功返回0,否则返回-1
 */
int rc_string_mysql_insert_web(int type, const unsigned char *serial, int lab, const unsigned char *buf, unsigned char *output, struct_lab_mysql *lab_mysql, unsigned long int logintime)
{
	int							i;
	unsigned char				lingmd_md1;
	unsigned char				lingmd_md2;
	unsigned char				string_web[64];
	unsigned char				string_set[512];
	unsigned char				temp[512];
	unsigned char				temp1[128];
	unsigned char				mac[16];
	struct in_addr				ip;
	struct in_addr				gateway;
	struct in_addr				submask;
	struct in_addr				dns;
	unsigned short int			port;
	unsigned short int			port_web = 0;
	unsigned short int			port_video = 0;
	unsigned short int			port_audio = 0;
	
	struct_lingmd				*msg_lingmd;
	struct_web_index			*msg_index;
	struct_web_sys				*msg_sys;
	struct_web_security_get		*msg_security_get;
	struct_web_security			*msg_security_set;
	struct_web_net				*msg_net;
	struct_web_ddns				*msg_ddns;
	struct_web_mailftp			*msg_mailftp;
	struct_web_video			*msg_video;
	struct_web_application		*msg_application;
	struct_web_tool				*msg_tool;
	struct_web_update			*msg_update;
	
	
	bzero(string_web, sizeof(string_web));
	bzero(string_set, sizeof(string_set));
	switch(lab)
	{
		case TYPE_P_W_INDEX://首页相关类型
		{
			sprintf(string_web, "%s %s %s", KEY_MYSQL_INSERT, KEY_MYSQL_INTO, NAM_TABLE_MYSQL_AR003_TRIGGER);
			lingmd_md1 = DEFAULT_TRIGGER_LINGMD_MD1;
			lingmd_md2 = DEFAULT_TRIGGER_LINGMD_MD2;
			switch(type)
			{
				case TYPE_ACTION_CAMERA://摄像机的动作
				{
					msg_lingmd = (struct_lingmd *)buf;
					lingmd_md1 = msg_lingmd->md1;
					lingmd_md2 = msg_lingmd->md2;
					break;
				}
				case TYPE_ACTION_CGI://cgi的动作
				{
					msg_index = (struct_web_index *)buf;
					switch(msg_index->action)
					{
					case ACT_W_INDEX_LINGMD://设置灵敏度
						lingmd_md1 = msg_index->msg.lingmd.md1;
						lingmd_md2 = msg_index->msg.lingmd.md2;
						break;
					default:
						return -1;
						break;
					}
					break;
				}
				default :
					return -1;
					break;
			}
			sprintf(string_set, "(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) %s (%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,'%s',%u,%u,%u,%u,%u)", \
					KEY_CAMERA_ID_TRIGGER, /* id号 */\
					KEY_MD_1, /* md1 */\
					KEY_SENSITIVITY_1, /* 灵敏度1 */\
					KEY_MD_2, /* md2 */\
					KEY_SENSITIVITY_2, /* 灵敏度2 */\
					KEY_USE_INFRARED_ALARM, /* 红外警报 */\
					KEY_SAVE_IMG_PC, /* 保存在pc */\
					KEY_SAVE_IMG_SDCARD, /* 保存在存储卡 */\
					KEY_SAVE_IMG_MODE, /* 保存格式 */\
					KEY_SEND_IMG_BY_EMAIL, /* 使用email */\
					KEY_SEND_IMG_BY_FTP, /* 使用ftp */\
					KEY_TIMER_GET_PIC, /* 定时间隔 */\
					KEY_DELAY_CHECK_EVENT, /* 延迟 */\
					KEY_USE_ALARM_TXT, /* 报文警报 */\
					KEY_ALARM_TXT, /* 警报报文 */\
					KEY_USE_ALARM_SOUND, /* 声响警报 */\
					KEY_USE_GPIO1, /* gpio1 */\
					KEY_GPIO1_TIMER, /* gpio1 定时间隔 */\
					KEY_USE_GPIO2, /* gpio2 */\
					KEY_GPIO2_TIMER, /* gpio2 定时间隔 */\
					KEY_MYSQL_VALUES, \
					lab_mysql->id_cam, /* id号 */\
					DEFAULT_TRIGGER_USED_MD1, /* md1 */\
					lingmd_md1, /* 灵敏度1 */\
					DEFAULT_TRIGGER_USED_MD2, /* md2 */\
					lingmd_md2, /* md2 */\
					DEFAULT_TRIGGER_USED_INFRARED, /* 红外警报 */\
					DEFAULT_TRIGGER_SAVE_PC, /* 保存在pc */\
					DEFAULT_TRIGGER_SAVE_CARD, /* 保存在存储卡 */\
					DEFAULT_TRIGGER_VIDEO_SAVE, /* 保存格式 */\
					DEFAULT_TRIGGER_SND_MAIL, /* 使用email */\
					DEFAULT_TRIGGER_SND_FTP, /* 使用ftp */\
					DEFAULT_TRIGGER_SPACE, /* 定时间隔 */\
					DEFAULT_TRIGGER_DELAY, /* 延迟 */\
					DEFAULT_TRIGGER_WARING_TEXT, /* 报文警报 */\
					DEFAULT_TRIGGER_TEXT_WARING, /* 警报报文 */\
					DEFAULT_TRIGGER_WARING_AUDIO, /* 声响警报 */\
					DEFAULT_TRIGGER_GPIO1, /* gpio1 */\
					DEFAULT_TRIGGER_TIMER_GPIO1, /* gpio1 定时间隔 */\
					DEFAULT_TRIGGER_GPIO2, /* gpio2 */\
					DEFAULT_TRIGGER_TIMER_GPIO2/* gpio2 定时间隔 */);
			break;
		}
		case TYPE_P_W_SYSTEM://系统相关类型
		{
			msg_sys = (struct_web_sys *)buf;
			sprintf(string_web, "%s %s %s", KEY_MYSQL_INSERT, KEY_MYSQL_INTO, NAME_TABLE_MYSQL_AR003_SYSTEM);
			bzero(temp, sizeof(temp));
			if(msg_sys->way_time == WAY_TIME_SET_NTP)
			{
				sprintf(temp, ",'%s',%d,%u",
						msg_sys->time.ntp.ntpser, /* ntp server */\

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -