📄 gdbm.c
字号:
/***************************************************************************************** Copyright (c) 2006* All rights reserved.* * $Id****************************************************************************************/#include <gdbm.h>#include <stdio.h>#include <fcntl.h>#include <string.h>//定义大数组#define MAXKEYLEN 255#define MAXVALUELEN 3096int query_gdbm(GDBM_FILE db,char *key);int create_gdbm(GDBM_FILE db,char *srcFile);int main(int argc,char **argv){ GDBM_FILE db = NULL; char *dbName=NULL; char *srcFile =NULL; char *use; int beginSecond; int endSecond; int totalSecond; if (argc != 4) { printf("usage %s -c|-s dbname srcfile\n",argv[0]); return 1; } use = argv[1]; dbName =argv[2]; //db = gdbm_open(dbName, 1024, GDBM_READER |GDBM_WRITER |GDBM_WRCREAT, 0660 ,0); if (strcmp(use,"-c")==0) { /* *创建数据库,dbName是数据库文件名,1024是从硬盘到内存的块的大小,GDBM_WRITER是写的权限,GDBM_WRCREAT是创建的权限 *0660是mode,0表示用缺省的函数 */ db = gdbm_open(dbName, 2048, GDBM_WRITER |GDBM_WRCREAT, 0644 ,0); if (db ==NULL) { printf("create %s error\n",dbName); return 0; } //记录开始的时间,单位为秒 beginSecond = time((time_t *)NULL); srcFile = argv[3]; //调用函数 create_gdbm(db,srcFile); //关闭数据库文件 gdbm_close(db); //记录结束时间 endSecond = time((time_t *)NULL); //得到创建数据库文件所发费的总时间 totalSecond = endSecond - beginSecond; printf("spend total time is :%d seconds\n", totalSecond); return 0; } else if (strcmp(use,"-s")==0) { /* *打开数据库,dbName是数据库文件名,1024是从硬盘到内存的块的大小,GDBM_READER是读的权限 *0660是mode,0表示用缺省的函数 */ db = gdbm_open(dbName, 2048, GDBM_READER , 0400 ,0); if (db ==NULL) { printf("open %s error\n",dbName); return 1; } //调用查询函数 query_gdbm(db,argv[3]); //关闭数据库文件 gdbm_close(db); return 0; } else { gdbm_close(db); printf("use error\n"); return 1; }}//创建gdbm数据库int create_gdbm(GDBM_FILE db,char *srcFile){ datum name; datum value; datum mytest; FILE *fp; int ret; char word[MAXKEYLEN]; char url[MAXVALUELEN]; char line[30960]; char *ptr = NULL; char *pptr = NULL; fp = fopen(srcFile,"r"); if (fp ==NULL) { printf(" error open %s\n",srcFile); return 1; } while (fgets(line, 3096, fp) != NULL) { line[3095] = 0; memset(word,0,MAXKEYLEN); memset(url,0,MAXVALUELEN); ptr = strchr(line, '\t'); if(ptr == NULL) continue; *ptr = '\0'; strncpy(word, line, 255); word[254] = '\0'; pptr = ptr + 1; if(pptr == NULL) continue; strncpy(url, pptr, 3096); url[3095] = 0; ptr = strchr(url, '\n'); if(ptr != NULL) *ptr = '\0'; if(url[0] == '\0' || strlen(url) <=1) continue; //fscanf(fp,"%s\t%s\n", word,url); //printf("%s\t%s\n", word,url); //word[strlen(word)]='\0'; //url[strlen(url)]='\0'; name.dptr = word; name.dsize = strlen(word); value.dptr = url; value.dsize = strlen(url); //把结构体name,value的内容插入到数据库文件中去 ret = gdbm_store(db, name, value, GDBM_INSERT); } strcpy(word,"PLASTICSPACK"); word[strlen(word)]='\0'; memset(&name,0,sizeof(name)); name.dptr=word; name.dsize=sizeof(word); printf("name.dprt=%s\tlen dptr=%d\tname.dsize=%d\n",name.dptr,strlen(name.dptr),name.dsize); mytest = gdbm_fetch(db, name); if (mytest.dptr) printf("name %s\tvalue %s\n",name.dptr,mytest.dptr); memset(word,0,MAXKEYLEN); strcpy(word,"IMPORTER"); word[strlen(word)]='\0'; memset(&name,0,sizeof(name)); name.dptr=word; name.dsize=sizeof(word); printf("name.dprt=%s\tlen dptr=%d\tname.dsize=%d\n",name.dptr,strlen(name.dptr),name.dsize); //根据nam在数据库中查找value的值 mytest = gdbm_fetch(db, name); if (mytest.dptr) printf("name %s\tvalue %s\n",name.dptr,mytest.dptr); fclose(fp); return 0;}//查询一条记录int query_gdbm(GDBM_FILE db,char *key){ datum name; datum value; char word[MAXKEYLEN]; name.dptr=key; name.dsize=strlen(key); //根据nam在数据库中查找value的值 value = gdbm_fetch(db, name); if (value.dptr !=NULL) { printf("name %s\tvalue %s\n",name.dptr,value.dptr); free(value.dptr); } else { printf("found not \n"); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -