📄 schedule.c
字号:
/*==========================================================
* Name: schedule.c
* Copyright:
* Author: qsrong
* Date: 16/04/09
* Description: schedule.c schedule.h
日程表
*/
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <db.h>
#include "schedule.h"
#include <pthread.h>
void print_error(int ret)
{
if(ret!=0)
printf("ERROR:%s\n",db_strerror(ret));
}
void init_DBT(DBT *key,DBT *data)
{
memset(key,0,sizeof(DBT));
memset(data,0,sizeof(DBT));
}
/*==========================================================
* function: add_matter()
* Description: 向日程表中添加数据,以数据库方式存储
时间为key,
*/
void add_matter( )
{
DB *dbp;
DBT key,data;
DBC * schedule_db_cur;
u_int32_t flags;
int ret;
SCHEDULE schedule;
struct tm warn_time;
time_t t_day;
int sec;
ret=db_create(&dbp,NULL,0);
print_error(ret);
flags=DB_CREATE;
/*创建名为single.db的数据库*/
ret=dbp->open(dbp,NULL,"schedule.db",NULL,DB_BTREE,flags,0664);
print_error(ret);
dbp->cursor(dbp,NULL,&schedule_db_cur,0);
init_DBT(&key,&data);
memset(&schedule,0,sizeof(SCHEDULE));
key.size=sizeof(int);
key.data=&schedule.warn_sec;
data.data=&schedule;
data.ulen=sizeof(SCHEDULE);
data.flags=DB_DBT_USERMEM;
//添加记录
printf("please enter the time you want alarm you as yyyy-mm-dd-hh-mm(as key):\n");
memset(&warn_time, 0, sizeof(warn_time));
//printf("Enter the time now\n");
//printf("\nPlease enter the year as yyyy:");
//scanf("%d",&warn_time.tm_year);
//warn_time.tm_year=warn_time.tm_year-1900;
warn_time.tm_year=110;
printf("\nPlease enter the mon ad mm:");
scanf("%d",&warn_time.tm_mon);
printf("\nPlease enter the day as dd:");
scanf("%d",&warn_time.tm_mday);
printf("\nPlease enter the hour as hh:");
scanf("%d",&warn_time.tm_hour);
printf("\nPlease enter the min as mm:");
scanf("%d",&warn_time.tm_min);
warn_time.tm_sec = 0;
warn_time.tm_isdst=0;
printf("warmtime %d\n",warn_time.tm_yday);
t_day=mktime(&warn_time); //将输入的标准格式时间转化为距离1900的秒 作为key
printf("%d",t_day);
schedule.warn_sec=t_day;
printf("\nPlease enter the matter you want the record: ");
scanf("%s",&schedule.warn_matter);
/*分别对关键字和数据赋值和规定长度*/
key.data=&(schedule.warn_sec);
key.size=sizeof(int);
data.data=&schedule;
data.size=sizeof(SCHEDULE);
ret=dbp->put(dbp,NULL,&key,&data,DB_NOOVERWRITE);
print_error(ret);
if(dbp!=NULL)
dbp->close(dbp,0);
}
/*==========================================================
* function: del_matter(long real_time)
* Description: 删除过期的任务
删除数据库中为real_time的数据,
*/
void del_matter(long real_time)
{
DB *dbp;
DBT key,data;
DBC * schedule_db_cur;
u_int32_t flags;
int ret;
SCHEDULE schedule;
ret=db_create(&dbp,NULL,0);
print_error(ret);
///*创建数据库*/
flags=DB_CREATE;
ret=dbp->open(dbp,NULL,"schedule.db",NULL,DB_BTREE,flags,0664);
print_error(ret);
dbp->cursor(dbp,NULL,&schedule_db_cur,0);
init_DBT(&key,&data);
memset(&schedule,0,sizeof(SCHEDULE));
dbp->cursor(dbp,NULL,&schedule_db_cur,0);
schedule.warn_sec=real_time;
key.size=sizeof(int);
key.data=&schedule.warn_sec;
//删除记录
while((ret=schedule_db_cur->get(schedule_db_cur,&key,&data,DB_SET))==0)
{
schedule_db_cur->del(schedule_db_cur,0);
}
if(schedule_db_cur !=NULL)
schedule_db_cur->close(schedule_db_cur);
if(dbp!=NULL)
dbp->close(dbp,0);
}
/*==========================================================
* function: get_ring_matter(char *matter)
* Description: get the nearly matter need to be ring
*/
long get_ring_matter(char *matter)
{
long min_sec=0;
long get_warn_sec;
DB *dbp;
DBT key,data;
DBC * schedule_db_cur;
SCHEDULE schedule;
u_int32_t flags;
int ret;
ret=db_create(&dbp,NULL,0);
print_error(ret);
flags=DB_CREATE;
ret=dbp->open(dbp,NULL,"schedule.db",NULL,DB_BTREE,flags,0664);
print_error(ret);
dbp->cursor(dbp,NULL,&schedule_db_cur,0);
init_DBT(&key,&data);
memset(&schedule,0,sizeof(SCHEDULE));
key.size=sizeof(int);
key.data=&schedule.warn_sec;
data.data=&schedule;
data.ulen=sizeof(SCHEDULE);
data.flags=DB_DBT_USERMEM;
printf("ALL records has been listed here.\n");
ret = schedule_db_cur->get(schedule_db_cur,&key,&data,DB_NEXT);
min_sec=schedule.warn_sec;
strcpy(matter,schedule.warn_matter);
while((ret = schedule_db_cur->get(schedule_db_cur,&key,&data,DB_NEXT)) == 0)
{
printf("Record:");
printf("%d ",(int*)(schedule.warn_sec));
get_warn_sec=schedule.warn_sec;
if(min_sec>=get_warn_sec)
{
min_sec=get_warn_sec;
strcpy(matter,schedule.warn_matter);
}
}
if(ret != DB_NOTFOUND)
{
printf("Not found!\n");
}
if(schedule_db_cur !=NULL)
schedule_db_cur->close(schedule_db_cur);
if(dbp!=NULL)
dbp->close(dbp,0);
return min_sec;
}
void schedule_main()
{
char matter[1024];
long ring_sec;
time_t timep;
while(1)
{
time(&timep);
printf("**%d",timep);
ring_sec=get_ring_matter(matter);
if(ring_sec==timep)
{
printf("%s",matter);
del_matter(ring_sec);
}
}
}
int main()
{
//add_matter( );
char s[1024];
//get_ring_matter(s);
//printf("end matter %s\n",s);
schedule_main();
return 0;
}
/*
void_sec printMsg(int);
int main()
{
// Get system call result to determine successful or failed
int res = 0;
// Register printMsg to SIGALRM
signal(SIGALRM, printMsg);
res = alarm(2);
if (res)
{
printf("Set timer failed!!\n");
}
// Always sleep to catch SIGALRM signal
while (1)
{
pause();
}
return 0;
}
vowarn_sec printMsg(int num)
{
printf("%s", "Hello World!!\n");
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -