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 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
随机推荐
- Powershell ForEach-Object 循环
Powershell管道就像流水线,对于数据的处理是一个环节接着一个环节,如果你想在某一环节对流进来的数据逐个细致化的处理,可是使用ForEach-Object,$_ 代表当前的数据. 对管道对象逐个 ...
- GSM Channel Mode Modify和Channel Mode Modify Acknowledge信令
最近研究了下如何通过GSM Channel Mode Modify和Channel Mode Modify Acknowledge信令,获知GSM终端支持的data Rate 思路与原理: • I ...
- linux磁盘限额配置:quota命令
LINUX下也有类似WINDOWS NTFS所用的磁盘限额,用的是quota来实现通过rpm -q quota确定是否已安装用quota只能对patation做限额,要做到针对某个目录来做只能靠ln ...
- bzoj 1197
http://www.lydsy.com/JudgeOnline/problem.php?id=1197 我们考虑从低维向高维考虑. 记F[i][j]表示维度为i,用了j个球时最多能将空间划分为多少个 ...
- Android:TextView跑马灯-详解
Android:TextView跑马灯_详解 引言: TextView之所以需要跑马灯,是由于文字太长,或者是吸引眼球. 关键代码如下: android:singleLine="true&q ...
- FreeBSD ipfw App配置Examples
Step # 1: Enabling IPFW Open /etc/rc.conf file # vi /etc/rc.conf Append following settings: firewall ...
- Windows系统基本概念
windows API:被文档化的可以调用的子例程,如CreateProcess 原生的系统服务(执行体系统服务):未被文档化的.可以再用户模式下调用的底层服务,如NtCreateProcess 内核 ...
- 单片微机原理P4:80C51串口与串行总线拓展
0. 串口通讯 0. 串口通讯的数据传输方式:单工(单向传输数据),半双工(非同时双向传输),全双工(同时,双向传输) 1. 根据通信方式的不同又分为同步通讯和异步通讯. 同步通讯:所有设备都使用同一 ...
- python3-day4(re正则表达式,冒泡)
一.正则表达式常用 1.re.match:只尝试从字符串的查找,后面不作查找. 例子: import re text="aabcdefg123123" m=re.match('a' ...
- (转)iOS Wow体验 - 第八章 - 易用性与自动化技术
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第八章译文精选,也是全书译文的最后一篇.上一篇:W ...