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 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
随机推荐
- Eclipse远程调试weblogic
http://www.cnblogs.com/dyllove98/archive/2013/08/06/3241140.html http://blog.csdn.net/afgasdg/articl ...
- 玩Linux桌面发现一个最佳的组合配置
其实前段时间玩Arch,其实不难,主要是太浪费时间配置折腾了,学到有用的东西太少,不能让我快速进入编程工作的状态,(真不知道有些人用Gentoo和Arch都能用出优越感了,就因为难安装和配置??)但是 ...
- auto space advisor
<pre name="code" class="sql">首先:oracle有自动Job,进行shrink space SQL> select ...
- js深入研究之自定义混合Mixin函数
<script type="text/javascript"> /* 增加函数 */ function augment(receivingClass, givingCl ...
- 2015第19周三小众app
今天搜集下个人知道好玩的小众app: 1.开眼每日推荐5个小视频,世界那么大,一起来看看吧. 2.懒人周末周末去哪了?简洁美观 3.LOFTER 网易良心出品. 4.玩儿去 发现很多很多好玩的去处 5 ...
- java内存模型和线程
概述 多任务的处理在现在的计算机中可以说是"标配"了,在许多的情况下,让计算机同时做几件事情,不仅是因为计算机的运算能力的强大,还有一个重要的原因是:cpu的运算速度和计算机的存储 ...
- 玩转指针(Playing with Pointers)
Question: What is a Pointer? What are its limitations? What are its benefits? How do we use it? What ...
- 【每天一个Linux命令】19. 创建文件夹目录命令mkdir
命令用途 mkdir 命令用来创建指定的名称的目录 使用说明 1. 创建目录的用户在当前目录中具有写权限 2. 指定的目录名不能是当前目录中已有的目录. 命令实例 0. 帮助文件 bixiaopen ...
- 好用的QT连接
QT属性控件项目https://github.com/lexxmark/QtnProperty比特币交易软件https://github.com/JulyIGHOR/QtBitcoinTrader导航 ...
- 56个PHP开发常用代码
2016/02/14 6203 4 在编写代码的时候有个神奇的工具总是好的!下面这里收集了 50+ PHP 代码片段,可以帮助你开发 PHP 项目. 这些 PHP 片段对于 PHP 初学者也非常 ...