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 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
随机推荐
- ROM包内的大致框架及各个文件的作用[转]
1.system/app这个里面主要存放的是常规的应用程序,都是以apk格式结尾的文件,在这个文件夹下面的程序为系统默认的组件,个人安装的软件不会出现在这里,而是data文件夹中. 2.system/ ...
- Use OWIN to Self-Host ASP.NET Web API 2
Open Web Interface for .NET (OWIN)在Web服务器和Web应用程序之间建立一个抽象层.OWIN将网页应用程序从网页服务器分离出来,然后将应用程序托管于OWIN的程序 ...
- 利用php unpack读取c struct的二进制数据,struct内存对齐引起的一些问题
c语言代码 #include <stdio.h> struct test{ int a; unsigned char b; int c; }; int main(){ FILE *fp; ...
- AS3排序
package { import flash.display.Sprite; public class Sort extends Sprite { private var arr:Vector.< ...
- hdu2460-Network:边的双连通分量
题目大意:给出一个无向图以及Q次询问,每次询问增加一条无向边,要求输出增加这条边后剩余的桥的数目. 算法:类似于求割点的方法,先做一次dfs求出所有的桥,并且维护这棵dfs树,当一次询问加入一条边(a ...
- 符号表(Symbol Tables)
小时候我们都翻过词典,现在接触过电脑的人大多数都会用文字处理软件(例如微软的word,附带拼写检查).拼写检查本身也是一个词典,只不过容量比较小.现实生活中有许多词典的应用: 拼写检查 数据库管理应用 ...
- 第29讲 UI组件之 ListView与 BaseAdapter,SimpleAdapter
第29讲 UI组件之 ListView与 BaseAdapter,SimpleAdapter 1.BaseAdapter BaseAdapter是Android应用程序中经常用到的基础数据适配器,它的 ...
- js+css实现模态层效果
在做web前端的时候,有些时候会涉及到模态层,在此提供一种实现思路.希望对大家实用.先贴效果吧: 模态层效果 以下说说在写模态层的时候的思路:通过可配置的參数width,height,title以及c ...
- BUG出现的地方真的令我这个测试新人想象不到
今天上班,仍然在等待下一阶段项目的研发完成. 没有正式测试任务的我,作为新手肯定要趁着这个时间好好学习了,偶尔再拿出公司已经上线发布的APP来到处看看. 就在这偶尔的情况下让我发现了一个在正式测试时根 ...
- jquery之null的数组
去掉null的数组 function ClearNullArr(arr) { for (var i = 0; i < arr.length; i++) { if(arr[ ...