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);
    }
  • 相关阅读:
    UIButton的遍历
    UIbutton 圆角和边线
    UIbutton 和UIview 切单角
    为运行Microsoft Dynamics CRM 异步处理服务指定账户没有性能计数器权限
    转:细说ASP.NET Windows身份认证
    CRM 模拟用户
    CRM 2016 Get IOrganizationService
    模拟SQL用户 EXECUTE AS USER
    Calling Custom Actions from JavaScript
    processjs Documentation
  • 原文地址:https://www.cnblogs.com/code-style/p/3262706.html
Copyright © 2011-2022 走看看