📄 rc_ctl_mysql.c
字号:
/*
* 文 件 名: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 + -