zoukankan      html  css  js  c++  java
  • 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='';
                                    *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
    ", 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
    ", (char*)key.data, (char*)data.data);
                    return 1;
            }
            else
            {
                    //dbp->err(dbp, ret "DB->put");
                    fprintf(stderr,"save Db error!
    ");
                    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 
    ", 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 
    " , (char*)key.data, (char*) data.data);
                    return 1;
            }
            else
            {
                    fprintf(stderr,"read Db error!
    ");
                    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
    ", newpv);
                    memset(&buffer, 0, 1024 * 4);
            }                                                                                                                                  
     
            dbp->close(dbp, 0);
    }
  • 相关阅读:
    外观模式
    享元模式
    c#中的抽象类和接口
    装饰者模式
    组合模式
    适配器模式
    springboot 源码篇002## web层自动装配部分源码
    springboot 源码篇002## 自动装配原理
    springboot 源码篇 01
    shell 脚本基础 第二篇
  • 原文地址:https://www.cnblogs.com/code-style/p/3262706.html
Copyright © 2011-2022 走看看