技术宅,fat-man

增加语言的了解程度可以避免写出愚蠢的代码

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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

编译命令

gcc -o dbwriter dbwriter.c -ldb

dbwriter.c

复制代码
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <db.h>
#include <sys/types.h>

#define DATABASE "demo.db"

/*
    功能:解析日志提取数据(pv)
日志格式:pp.cn guest:123456 100
*/
int parseLog(char *s,char **pv)
{
        int flag = 0;
        while(*s)
        {
                if(*s==' ')
                {
                        if(flag==0)
                        {
                                s++;
                                flag++;
                                continue;
                        }
                        else
                        {
                                *s='\0';
                                *pv = s+1;
                                return;
                        }
                }
                s++;
        }
}

/*
功能:打开伯克利DB的连接
*/
DB *openDb()
{
        int ret;
        DB *dbp = NULL;

        ret = db_create(&dbp, NULL, 0);
        if(ret != 0)
        {
                exit(1);
        }

        ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE,0664);

        if(ret != 0)
        {
                exit(1);
        }

        return dbp;
}

/*
功能:存储用户的浏览信息
*/
int saveViewInfo(DB *dbp, char *user, char *pv)
{
        int ret;
        DBT key , data;
        char oldpv[100] = {0};
        char newpv[100] = {0};

        //如果用户之前已经访问过了,那么PV等于之前的PV+现在的PV
        if(findViewInfo(dbp, user, &oldpv) == 1)
        {
                sprintf(&newpv,"%d", atoi(pv) + atoi(oldpv));
                printf("new new is %s\n", newpv);
        }
        else
        {
                strcpy(newpv,pv);
        }

        //初始化数据
        memset(&key, 0, sizeof(key));
        memset(&data, 0, sizeof(data));

        key.data = user;
        key.size = strlen(user) + 1;

        data.data = newpv;
        data.size = strlen(newpv) + 1;

        //写入DB
        ret = dbp->put(dbp, NULL, &key, &data, 0);

        if(ret == 0)
        {
                printf("db: %s key stored. value is %s\n", (char*)key.data, (char*)data.data);
                return 1;
        }
        else
        {
                //dbp->err(dbp, ret "DB->put");
                fprintf(stderr,"save Db error!\n");
                return 0;
        }

}

/*
功能:查找是否已经存在浏览信息
*/
int findViewInfo(DB *dbp, char *user, char *pv)
{
        int ret;
        DBT key, data;

        memset(&key, 0, sizeof(key));
        memset(&data, 0, sizeof(data));

        key.data = user;
        key.size = strlen(user) + 1;
        printf("get : %s , it %d \n", key.data, key.size);

        ret = dbp->get(dbp, NULL, &key, &data, 0);

        if(ret == 0)
        {
                //从data里把数据复制出来,因为data是栈上数据,不能拿出去使用
                strncpy(pv,data.data,data.size);
                printf("get : key is %s : data is %s \n" , (char*)key.data, (char*) data.data);
                return 1;
        }
        else
        {
                fprintf(stderr,"read Db error!\n");
                return 0;
        }
}

int main (int argc, char **argv)
{
        DB *dbp = NULL;
        FILE *fp = NULL;
        char buffer[1024 * 4];


        dbp = openDb();
        fp = fopen("20130815.ul","r");
        assert(fp != NULL);                                                                                                                
        
        while(fgets((char*)buffer, 1024*4,fp)!=NULL)                                                                                            
        {                                                                                                                                  
                char *user;                                                                                                                
                char *pv;
                char newpv[100] = {0};

                user = (char*)buffer;                                                                                                  
                parseLog(buffer,&pv);
                saveViewInfo(dbp, user, pv);
                findViewInfo(dbp,user,&newpv);
                printf("now pv is %s\n", newpv);
                memset(&buffer, 0, 1024 * 4);
        }                                                                                                                                  
 
        dbp->close(dbp, 0);
}
复制代码

 

posted on   codestyle  阅读(502)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2012-08-16 使用source命令向数据库写入数据中文乱码的解决方案
点击右上角即可分享
微信分享提示