#编译程序
gcc -o historydb historydb.c -ldb
#将2013年8月9日的用户记录写入数据库 (程序自动识别新用户入库,跳过老用户)
./historydb -f 20130809.userlist 20130809
#查询guest1985215666654在2013年8月8日有没有访问业务bch2000
./historydb -s "bch2000 guest1985215666654" 20130808
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <db.h>
#include <sys/types.h>
#include <getopt.h>
#define DATABASE "/work/stat/read/newstat/test/history.db"
struct ViewDate
{
int year;
int month;
int day;
};
struct ViewData {
struct ViewDate date;
};
void setDate(struct ViewDate *date,char *s)
{
assert(s != NULL);
char tmp[10]={0};
strncpy(tmp,s,4);
date->year = atoi(tmp);
memset(tmp,0,10);
strncpy(tmp,s+4,2);
date->month = atoi(tmp);
memset(tmp,0,10);
strncpy(tmp,s+6,2);
date->day = atoi(tmp);
//printf("%d - %d - %d \n",date->year, date->month, date->day);
}
int compareViewData(struct ViewData *data , struct ViewData *storedData)
{
int dataArray [] = {data->date.year, data->date.month, data->date.day};
int storedDataArray [] = {storedData->date.year, storedData->date.month, storedData->date.day};
int i = 0;
for(;i<sizeof(dataArray) / sizeof(int); i++)
{
if(storedDataArray[i] > dataArray[i])
{
return 0;
}
}
return 1;
}
void printViewData(struct ViewData *data)
{
printf("print view data : %d - %d - %d \n",data->date.year, data->date.month, data->date.day);
}
char *trim(char *s)
{
int i = strlen(s);
for(;i>0;i--)
{
if(s[i]==' ' || s[i]=='\n' || s[i]=='\0' || s[i]=='\t')
{
s[i] = '\0';
}
else
{
break;
}
}
return s;
}
DB *openDb()
{
int ret;
DB *dbp = NULL;
ret = db_create(&dbp, NULL, 0);
if(ret != 0)
{
fprintf(stderr,"create Db error!\n");
exit(1);
}
ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE,0664);
if(ret != 0)
{
fprintf(stderr,"open Db error!\n");
exit(1);
}
return dbp;
}
int saveViewInfo(DB *dbp, char *user, struct ViewData *data)
{
int ret;
DBT key,saveData;
memset(&key, 0, sizeof(key));
memset(&saveData, 0, sizeof(saveData));
key.data = user;
key.size = strlen(user) + 1;
saveData.data = data;
saveData.size = sizeof(*data);
if(findViewInfo(dbp, user, data)==1)
{
//printf("already has %s \n", user);
return 1;
}
ret = dbp->put(dbp, NULL, &key, &saveData, 0);
if(ret == 0)
{
//printViewData(saveData.data);
return 1;
}
else
{
//key storead failed
return 0;
}
}
int findViewInfo(DB *dbp, char *user, struct ViewData *data)
{
int ret;
DBT key, storedData;
memset(&key, 0, sizeof(key));
memset(&storedData, 0, sizeof(storedData));
key.data = user;
key.size = strlen(user) + 1;
ret = dbp->get(dbp, NULL, &key, &storedData, 0);
if(ret == 0 && compareViewData(data, (struct ViewData *)storedData.data)==1)
{
//found user
return 1;
}
//not found
return 0;
}
void saveViewFile(char *filename, struct ViewData *data)//20130815.save.ul
{
DB *dbp = openDb();
char buffer[1024 * 4];
FILE *fp = fopen(filename,"r");
assert(fp != NULL);
while(fgets((char*)buffer, 1024*4, fp)!=NULL)
{
char *user = (char*)buffer;
saveViewInfo(dbp, trim(user), data);
memset(&buffer, 0, 1024 * 4);
}
dbp->close(dbp, 0);
}
void hasViewInfo(char *user, struct ViewData *data)
{
DB *dbp = openDb();
assert(user != NULL);
user = trim(user);
if(findViewInfo(dbp, user, data)==1)
{
printf("found %s\n",user);
}
else
{
printf("not found %s\n",user);
}
dbp->close(dbp, 0);
}
int main (int argc, char *argv[])
{
int oc;
extern char *optarg;
extern int optind, opterr, optopt;
struct ViewData viewData;
memset(&viewData, 0, sizeof(viewData));
while((oc=getopt(argc,argv,"f:s:")) != -1)
{
setDate(&viewData.date,argv[optind]);
switch(oc)
{
case 'f':
saveViewFile(optarg, &viewData);
break;
case 's':
hasViewInfo(optarg, &viewData);
break;
}
}
return 0;
}