控制台参数处理berkeley db测试小程序

来源:互联网 发布:网络推广方案分析 编辑:程序博客网 时间:2024/05/18 01:09
 
仅仅是实验,远远不完善。

./dbtest -n  create a new db
./dbtest -f xxxx 查找关键字为XXXX的记录。
./dbtest -a xxxx
./dbtest -d xxxx

CODE:
/*
* db test code. seeker. 2005.12
* to compile
* gcc -o dbtest -g -ldb id.c
*  
*  
*/
#include <db.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

typedef struct {
        time_t          time;
        unsigned int    count;
        //char          name[120];
} ID_STRUCT;

ID_STRUCT id;

#define DB_FILE  "id.db"
#define DB_BTREE  DB_HASH


void error(int ret)
{
        if(ret != 0) {
           printf("ERROR: %s/n",db_strerror(ret));
        }
}


void init_val(DBT * key, DBT * data)
{
        memset(key, 0, sizeof(DBT));
        memset(data, 0, sizeof(DBT));
}


cursor(DB *dbp)
{
unsigned long cur;
    if (dbp->cursor(dbp, NULL, &cur, 0) != 0) {
           return NULL;
    }
    printf("dba->cursor = %p/n", cur);
}

show(void *k, void *d)
{
    printf("%p %p/n", k, d);
}

/*
* PUBLIC: int  __db_pr_callback __P((void *, const void *));
*/
int
__db_pr_callback(handle, str_arg)
        void *handle;
        const void *str_arg;
{
        char *str;
        FILE *f;

        str = (char *)str_arg;
        f = (FILE *)handle;

        if (fprintf(f, "%s", str) != (int)strlen(str))
                return (-1);

        return (0);
}

void main(int argc, char **argv)
{
FILE *fp;
char *cp;
char  buf[256];
unsigned long ip;
int r;

DB *dbp;
DBT key, data;
u_int32_t flags;
int ret;

  ret = db_create(&dbp, NULL, 0);

  //create a new db
  if(argc > 1 && argv[1][0] == 'n') {
    flags = DB_CREATE;

    ret = dbp->open(dbp, NULL, DB_FILE, NULL,
                        DB_BTREE, //DB_HASH,
                        flags, 0);
    error(ret);

    for(r = 0; r < 64*1024; r++) {
        ip = random();
        if(r == 63*1024) ip = 0x10101010;
        cp = inet_ntoa(*(struct in_addr*)&ip);

        strcpy(buf, cp);
        printf("%s/n", cp);

        init_val(&key, &data);
        key.size = strlen(buf);
        key.data = buf;

        id.count = 1;
        id.time = 0x01020304; //time(0);
        //strcpy(id.name, cp);
        data.size = sizeof(ID_STRUCT);
        data.data = &id;

        ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
        error(ret);
        //printf("cp = %s/n", cp);

    }

    dbp->close(dbp, 0);
    printf("r = %d/n", r);
    exit(0);
  }

  //find a record
  if(argc > 2 && (argv[1][0] == 'f')) {

        strcpy(buf, argv[2]);
        ret = dbp->open(dbp, NULL, DB_FILE, NULL,
                        DB_BTREE, //DB_HASH,
                        flags, 0);
        error(ret);

        memset(&id, 0, sizeof(ID_STRUCT));

        printf("ret = %d/n", ret);

        init_val(&key, &data);
        key.size = strlen(buf);
        key.data = buf;

        data.data = &id;
        data.ulen = sizeof(id);
        data.flags = DB_DBT_USERMEM;

        ret = dbp->get(dbp, NULL, &key, &data, 0);
        if(!ret) {
          printf("data: %d %x/n", id.count, id.time);
        }
        printf("ret = %d/n", ret);
        error(ret);

        cursor(dbp);


        if(dbp != NULL)
                dbp->close(dbp, 0);
        exit(0);
  }

  //delete a key
  if(argc > 2 && (argv[1][0] == 'd')) {

        strcpy(buf, argv[2]);

        ret = dbp->open(dbp, NULL, DB_FILE, NULL,
                        DB_BTREE, //DB_HASH,
                        flags, 0);
        error(ret);

        memset(&id, 0, sizeof(ID_STRUCT));

        printf("ret = %d/n", ret);

        init_val(&key, &data);
        key.size = strlen(buf);
        key.data = buf;

        ret = dbp->del(dbp, NULL, &key, 0);
        if(!ret) {
          printf("data: %d %x/n", id.count, id.time);
        }
        printf("ret = %d/n", ret);
        error(ret);

        cursor(dbp);


        if(dbp != NULL)
                dbp->close(dbp, 0);
        exit(0);
  }

  //dump
  if(argc > 1 && (argv[1][0] == 'i')) {
        int pflag = 1;
        int keyflag = 0;

        ret = dbp->open(dbp, NULL, DB_FILE, NULL,
                        DB_BTREE, //DB_HASH,
                        flags, 0);
        error(ret);
        printf("dump./n");

        ret = dbp->dump(dbp, NULL, __db_pr_callback, stdout, pflag, keyflag);

        //ret = dbp->dump(dbp, NULL, show, 0, 1, 20);
        if(!ret) {
          printf("data: %d %x/n", id.count, id.time);
        }
        //printf("ret = %d/n", ret);
        error(ret);


        if(dbp != NULL)
                dbp->close(dbp, 0);
        exit(0);
  }

  //add a key
  if(argc > 2 && (argv[1][0] == 'a')) {
        strcpy(buf, argv[2]);

        ret = dbp->open(dbp, NULL, DB_FILE, NULL,
                        DB_BTREE, //DB_HASH,
                        flags, 0);
        error(ret);

        memset(&id, 0, sizeof(ID_STRUCT));

        printf("ret = %d/n", ret);

        init_val(&key, &data);
        key.size = strlen(buf);
        key.data = buf;

        id.count = 2;
        if(argv[3]) id.count = atol(argv[3]);
        id.time = 0x01020304; //time(0);
        if(argv[4]) id.time = atol(argv[4]);
        //strcpy(id.name, cp);
        data.size = sizeof(ID_STRUCT);
        data.data = &id;


        ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
        if(!ret) {
          printf("data: %d %x/n", id.count, id.time);
        }
        printf("ret = %d/n", ret);
        error(ret);

        cursor(dbp);


        if(dbp != NULL)
                dbp->close(dbp, 0);
        exit(0);
  }

}



原创粉丝点击