C语言读写伯克利DB 3

时间:2022-09-09 08:06:12
gcc -o channeldb channel.c -db -Wall
# -Wall参数等价于执行lint,即:进行代码的静态分析,它可以指出未初始化的变量,未使用的变量
#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/data/userlist/historydb/channel.db" #define DATABASE "/mnt/disk1/ucshuqi/touch/userlist/historydb/channel.db"
#define YES 1
#define NO 0 /* ViewData Module */ struct ViewData {
int date;
}; void setDate(struct ViewData *data,char *s)
{
assert(data!=NULL && s!= NULL && strlen(s) == );
data->date = atoi(s);
} // the function return YES when query.date >= stored.date
int isHistoryViewInfo(struct ViewData *query , struct ViewData *stored)
{
assert(query != NULL && stored != NULL);
printf("query date is %d , stored date is %d \n",query->date, stored->date); if(query->date >= stored->date)
{
return YES;
}
else
{
return NO;
}
} void printViewData(struct ViewData *data)
{
printf("print view date : %d\n",data->date);
} /* string helper module */ 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;
} /* database helper module */ 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;
} /* business module */ int saveViewInfo(DB *dbp, char *user, struct ViewData *data)
{
DBT key,value; memset(&key, , sizeof(key));
key.data = user;
key.size = strlen(user) + ; memset(&value, , sizeof(value));
value.data = data;
value.size = sizeof(*data);
if(dbp->put(dbp, NULL, &key, &value, ) == )
{
//printf("save ---> %s, %d\n", key.data, key.size);
printViewData(value.data);
return YES;
}
else
{
return NO;
}
} int findViewInfo(DB *dbp, char *user, struct ViewData *data)
{
DBT key,value; memset(&key, , sizeof(key));
key.data = user;
key.size = strlen(user) + ; memset(&value,,sizeof(value)); // must !!! if(dbp->get(dbp, NULL, &key, &value, ) == )
{
memcpy((char*)data,(char*)value.data,value.size);
//printViewData(data);
return YES; //view in database
}
else
{
return NO; //view not in database
}
} void recordNewView(FILE *fp, char *user)
{
char buffer[] = {};
assert(fp != NULL && user != NULL); printf("%s is new view\n", user);
sprintf(buffer, "%s found\n", user);
fwrite(buffer, sizeof(char), strlen(buffer), fp);
} void saveViewFile(char *from, char *to, struct ViewData *writeData)
{
DB *dbp = openDb();
struct ViewData stored;
char buffer[ * ];
FILE *fp = fopen(from,"r");
FILE *fpResult = fopen(to,"w"); assert(fp != NULL && fpResult != NULL && writeData != NULL); while(fgets((char*)buffer, *, fp)!=NULL)
{
char *user = trim((char*)buffer);
memset(&stored, , sizeof(stored)); if(findViewInfo(dbp, user, &stored) == YES)
{
if(isHistoryViewInfo(writeData,&stored) == NO)
{
recordNewView(fpResult, user);
}
continue;
} recordNewView(fpResult, user);
if(saveViewInfo(dbp, user, writeData) == NO)
{
printf("save %s faild\n", user);
}
memset(&buffer, , * );
}
dbp->close(dbp, );
fclose(fp);
fclose(fpResult);
} void hasViewInfo(char *user, struct ViewData *query)
{
DB *dbp = NULL;
struct ViewData stored; dbp = openDb();
assert(user != NULL);
memset(&stored, ,sizeof(stored));
user = trim(user); if(findViewInfo(dbp, user, &stored) == YES)
{
if(isHistoryViewInfo(query, &stored) == YES)
{
printf("found %s\n",user);
}
else
{
//printf("%s in db\n",user);
printf("not found %s\n",user);
}
}
else
{
printf("%s not in db\n",user);
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; char *from = NULL;
char *to = NULL; struct ViewData viewData;
memset(&viewData, , sizeof(viewData)); while((oc=getopt(argc,argv,"f:s:t:")) != -)
{
switch(oc)
{
case 's':
setDate(&viewData,argv[optind]);
hasViewInfo(optarg, &viewData);
break; case 'f':
from = optarg;
to = argv[optind++];
setDate(&viewData,argv[optind]);
saveViewFile(from, to, &viewData);
break;
}
} return ;
}

我开始把ViewData写成了这样:

struct ViewData{
char date[];
}; void setDate(char *date, char *s)
{
assert(date != NULL && s!= NULL);
strncpy(&date,s,);
} //call setDate
struct ViewData viewData;
memset(viewData,,sizeof(viewData));
setDate(&viewData.date,"");

后来还是觉得viewData直接存int更好:

struct ViewData{
int date;
}; void setDate(int *date, char *s)
{
assert(date != NULL && s!= NULL);
*date = atoi(s);
} //call setDate
struct ViewData viewData;
memset(viewData,,sizeof(viewData));
setDate(&viewData.date,"");

看似没啥问题,但其实我已经暴露了ViewData的实现!

//call setDate
struct ViewData viewData;
memset(viewData,,sizeof(viewData));
setDate(&viewData.date,"");
//断言设置之后的日期等于20130808,用户这么写是因为已经暴露了ViewData的date是字符串这个事情!
assert(strcmp(viewData.date,"")==);

那你说,不怎么写我想知道是不是设置成功了怎么办?

//call setDate
struct ViewData viewData;
memset(viewData,,sizeof(viewData));
setDate(&viewData.date,"");
//断言设置之后的日期等于20130808,这个函数由ViewData模块提供
verifyDate(&viewDate,"");

C语言读写伯克利DB 3的更多相关文章

  1. C语言读写伯克利DB 4

    因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存 /* 功能说明:逐日存储来访用户(使用伯克利DB) 根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB) ...

  2. C语言解析日志,存储数据到伯克利DB

    编译命令 gcc -o dbwriter dbwriter.c -ldb dbwriter.c #include <assert.h> #include <stdlib.h> ...

  3. R语言读写中文编码方式

    最近遇到一个很头疼的事,就是 R语言读写中文编码方式.在网上找到了一篇博文,谢谢博主的精彩分享,让我很快解决了问题,在此也分享一下 R语言读写数据的方法很多,这里主要是我在使用read.csv/rea ...

  4. 伯克利DB的一个BUG

    一旦没有手工close掉伯克利DB,则缓存里的数据不会主动写入到文件中,因此非常难于排查这个BUG,记录在这里提醒自己

  5. R语言读写数据

    R语言读写数据 一般做模型的时候,从外部的excel中读入数据,我现在常用的比较多的是read_csv(file) 读入之前先把excel数据转化成.csv格式 同样的把结果输出来的时候用的是writ ...

  6. C&plus;&plus;封装C语言读写文件

    自己项目需要,封装C语言读写文件. 为了兼容低版本的编译器,因为低版本的编译器(比如,Vs2010,Vs2008)他们可能不支持 modern c++. 项目 使用 cmake管理的项目. 可以在 g ...

  7. C语言解析日志,存储数据到伯克利DB 2

    #编译程序 gcc -o historydb historydb.c -ldb #将2013年8月9日的用户记录写入数据库 (程序自动识别新用户入库,跳过老用户) ./historydb -f .us ...

  8. C语言读写文件

    对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: 字符读写函数  :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式 ...

  9. Go 语言读写 Excel

    Excelize 是 Golang 编写的一个用来操作 Office Excel 文档类库,基于微软的 Office OpenXML 标准.可以使用它来读取.写入 XLSX 文件.相比较其他的开源类库 ...

随机推荐

  1. Django博客功能实现—文章评论功能

    功能:在A网页提交一个评论Forms_B,提交之后自动刷新页面,能够显示刚刚的画面思路:利用一个已经创建的表单,通过视图让其在网页中表现出来,填写玩信息之后提交,会提交到一个新的视图里面去做接受,接受 ...

  2. GLM in SPM

    主要记一句话: SPM的GLM模型中的β,指的是相应regressor对最后测量得到的信号所产生的效应(effect). 后续的假设检验过程实际上都是对各个regressor的β向量进行的. The ...

  3. Windows系统:桌面,开始菜单和工具栏都不见了

    win7桌面,开始菜单和工具栏都不见了 ctrl+alt+del 打开任务管理器 然后文件-运行 ---  输入框里输入  explorer.exe 其实就是打开系统文件夹下的(大约是‘windows ...

  4. ORM框架-VB&sol;C&num;&period;Net实体代码生成工具&lpar;EntitysCodeGenerate&rpar;【ECG】4&period;5

    摘要:VB/C#.Net实体代码生成工具(EntitysCodeGenerate)[ECG]是一款专门为.Net数据库程序开发量身定做的(ORM框架)代码生成工具,所生成的程序代码基于OO.ADO.N ...

  5. UML&lowbar;交互图

    交互图(Interaction Diagram)用来描述系统中的对象是如何进行相互作用的.即一组对象是如何进行消息传递的. 当交互图建模时,通常既包括对象(每个对象都扮演某一特定的角色),又包括消息( ...

  6. CF451E

    一道不错的题,对排列组合能力的要求较高 题意:给定s个相同的小球放在n个不同的盒子里,可以不放,每个盒子有一个放的上限,求一共有多少种放法 解析:首先考虑没有上限的情况,这里比较好解决,采用隔板法,可 ...

  7. 我心目中的Dream-购物车

    功能要求: 1.要求用户输入自己拥有的总资产,例如:30000 2.显示商品列表的序号,商品名称,商品价格,让用户根据序号选择商品,然后加入购物车 例如: 1 Macbook 12000 2 Logi ...

  8. &lbrack;原创&period;数据可视化系列之八&rsqb;使用等d3进行灰度图转伪彩色

    对灰度图进行彩色化是数据可视化中常见的需求,使用d3在客户端比较容易实现,本文使用d3生成图片,并显示: 代码如下: 代码中首先下载数据文件,然后设定d3的色带信息,生成一个空白的canvas元素,并 ...

  9. artDialog4&period;1&period;7 摘自网络

    jquery.artDialog.source.js学习 1 关键的对象关系 art = jQuery = $ function artDialog() {...} artDialog.fn = ar ...

  10. 一款基于TweenMax跟随鼠标单击移动的div

    今天给大家分享一款基于TweenMax跟随鼠标单击移动的div.在这款实例中你可以单击任意位置,div会移动到你单击的位置.效果图如下: 在线预览   源码下载 实现的代码. html代码: < ...