C语言解析日志,存储数据到伯克利DB 2
#编译程序
gcc -o historydb historydb.c -ldb #将2013年8月9日的用户记录写入数据库 (程序自动识别新用户入库,跳过老用户)
./historydb -f .userlist #查询guest1985215666654在2013年8月8日有没有访问业务bch2000
./historydb -s "bch2000 guest1985215666654"
#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[]={};
strncpy(tmp,s,);
date->year = atoi(tmp); memset(tmp,,);
strncpy(tmp,s+,);
date->month = atoi(tmp); memset(tmp,,);
strncpy(tmp,s+,);
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 = ;
for(;i<sizeof(dataArray) / sizeof(int); i++)
{
if(storedDataArray[i] > dataArray[i])
{
return ;
}
}
return ;
} 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>;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, );
if(ret != )
{
fprintf(stderr,"create Db error!\n");
exit();
} ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE,); if(ret != )
{
fprintf(stderr,"open Db error!\n");
exit();
} return dbp;
} int saveViewInfo(DB *dbp, char *user, struct ViewData *data)
{
int ret;
DBT key,saveData; memset(&key, , sizeof(key));
memset(&saveData, , sizeof(saveData)); key.data = user;
key.size = strlen(user) + ; saveData.data = data;
saveData.size = sizeof(*data); if(findViewInfo(dbp, user, data)==)
{
//printf("already has %s \n", user);
return ;
} ret = dbp->put(dbp, NULL, &key, &saveData, ); if(ret == )
{
//printViewData(saveData.data);
return ;
}
else
{
//key storead failed
return ;
}
} int findViewInfo(DB *dbp, char *user, struct ViewData *data)
{
int ret;
DBT key, storedData; memset(&key, , sizeof(key));
memset(&storedData, , sizeof(storedData)); key.data = user;
key.size = strlen(user) + ; ret = dbp->get(dbp, NULL, &key, &storedData, ); if(ret == && compareViewData(data, (struct ViewData *)storedData.data)==)
{
//found user
return ;
} //not found
return ; } void saveViewFile(char *filename, struct ViewData *data)//20130815.save.ul
{
DB *dbp = openDb();
char buffer[ * ];
FILE *fp = fopen(filename,"r");
assert(fp != NULL); while(fgets((char*)buffer, *, fp)!=NULL)
{
char *user = (char*)buffer;
saveViewInfo(dbp, trim(user), data);
memset(&buffer, , * );
}
dbp->close(dbp, );
} void hasViewInfo(char *user, struct ViewData *data)
{
DB *dbp = openDb();
assert(user != NULL); user = trim(user);
if(findViewInfo(dbp, user, data)==)
{
printf("found %s\n",user);
}
else
{
printf("not found %s\n",user);
} dbp->close(dbp, );
} int main (int argc, char *argv[])
{
int oc;
extern char *optarg;
extern int optind, opterr, optopt; struct ViewData viewData;
memset(&viewData, , sizeof(viewData)); while((oc=getopt(argc,argv,"f:s:")) != -)
{
setDate(&viewData.date,argv[optind]);
switch(oc)
{
case 'f':
saveViewFile(optarg, &viewData);
break;
case 's':
hasViewInfo(optarg, &viewData);
break;
}
} return ;
}
C语言解析日志,存储数据到伯克利DB 2的更多相关文章
- C语言解析日志,存储数据到伯克利DB
编译命令 gcc -o dbwriter dbwriter.c -ldb dbwriter.c #include <assert.h> #include <stdlib.h> ...
- C语言解析json类型数据
转自:http://buluzhai.iteye.com/blog/845404 首先感谢作者!! 我使用的是cJSON:http://sourceforge.net/projects/cjson ...
- android开发中的5种存储数据方式
数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...
- [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据
Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...
- scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium
今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...
- Fresco源码解析 - DataSource怎样存储数据
Fresco源码解析 - DataSource怎样存储数据 datasource是一个独立的 package,与FB导入的guava包都在同一个工程内 - fbcore. datasource的类关系 ...
- C语言读写伯克利DB 4
因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存 /* 功能说明:逐日存储来访用户(使用伯克利DB) 根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB) ...
- C语言解析WAV音频文件
C语言解析WAV音频文件 代码地址: Github : https://github.com/CasterWx/c-wave-master 目录 前言 了解WAV音频文件 什么是二进制文件 WAV的二 ...
- SQL Server 深入解析索引存储(下)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
随机推荐
- Unity3d有关图形尺寸大小的注意事项
主要参考了官方文档,然后根据个人的理解撰写该文.Unity3D支持的图形文件格式有 PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT(但根据本人的亲手测试,U ...
- Microsoft.Practices.Unity 给不同的对象注入不同的Logger
场景:我们做项目的时候常常会引用第三方日志框架来帮助我们记录日志,日志组件的用途主要是审计.跟踪.和调试.就说我最常用的日志组件log4net吧,这个在.NET同行当中应该算是用得非常多的一个日志组件 ...
- documentElement vs body区别
documentElement.scrollTop------>0因为,他包含head, body body.scrollTop------------------>才是正确的 scrol ...
- 华为u8800怎样root?
用SuperOneClick就可以root了 .在手机上面进入设置-应用程序-开发-三个都要勾选.用数据线连接到电脑,确认可正常连接.不行就使用豌豆夹连接,豌豆夹会自动帮你安装手机的驱动.运行Supe ...
- java开发经验分享(四)
四. 关于测试 1. 在整个项目计划中,测试时间安排的合理性,对测试阶段的情况应作充分预计,不可为了赶发布点而忽略质量. 2. 务必清楚产品包.更新包.bug包的提交规范.具体请参照<开发规范手 ...
- 专访OPPO李紫贵:ColorOS用户过千万 软硬融合生态版图初现
专访OPPO李紫贵:ColorOS用户过千万 软硬融合生态版图初现 专访OPPO李紫贵:ColorOS用户过千万 软硬融合生态版图初现
- JavaScript Function 函数深入总结
整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下 ...
- MongoDB命令行操作
本文专门介绍MongoDB的命令行操作.其实,这些操作在MongoDB官网提供的Quick Reference上都有,但是英文的,为了方便,这里将其稍微整理下,方便查阅. 这里用来做测试的是远端(10 ...
- PHP5生成图形验证码(有汉字)
利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor 新建一个真彩色图像 imagecolora ...
- 注册AxtiveX控件
Win8.1或者Win7下 首先在“管理员的身份”运行cmd 然后输入:regsvr32 D:\***\*.ocx