/* * open or create a database */ DBHANDLE db_open_error(const char* pathname, int oflags, ...) { DB *db; int len, mode; size_t i; char asciiptr[PTR_SZ + 1], hash[(NHASH_DEF + 1) * PTR_SZ + 2]; struct stat statbuf; len = strlen(pathname); if ((db = _db_alloc(len)) == NULL) err_dump("db_open: __db_alloc error for DB"); //初始化db结构体 db->nhash = NHASH_DEF; db->hashoff = HASH_OFF; strcpy(db->name, pathname); strcat(db->name, ".idx"); //创建数据库文件 if (oflags & O_CREAT) { va_list ap; va_start(ap, oflags); mode = va_arg(ap, int); va_end(ap); /*打开索引文件和数据文件*/ db->idxfd = open(db->name, oflags, mode); strcpy(db->name + len, ".dat"); db->datfd = open(db->name, oflags, mode); }
/* Opening or Creating a database */ DB *db_open(const char *pathname, int oflag, int mode) { DB *db; int i, len; char asciiptr[PTR_SZ + 1], hash[(NHASH_DEF + 1) * PTR_SZ +2]; /* +2 for newline and NULL */ struct stat statbuff; /* Allocating a Database structure and the buffer it requires. */ len = strlen(pathname); if((db = _db_alloc(len)) == NULL) err_dump("error"); db->oflag = oflag; /* saving a copy of the open flags */ /* Opening index file */ strcpy(db->name, pathname); strcat(db->name, ".idx"); if((db->idxfd = open(db->name, oflag, mode)) < 0) { _db_free(db); return(NULL); } /* Opening data file */ strcpy(db->name + len, ".dat"); if((db->datfd = open(db->name, oflag, mode)) < 0) { _db_free(db); return(NULL); } /* If the database was created, then initialize it */ if((oflag & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) { /* write lock the entire file and so that, we can stat the file, check it's size & initialize it */ if(writew_lock(db->idxfd, 0, SEEK_SET, 0) < 0) err_dump("error"); if(fstat(db->idxfd, &statbuff) < 0) err_sys("error"); if(statbuff.st_size==0) { /* We gotta build a list of (NHASH_DEF + 1) chain ptr with a value of 0. The +1 is for free list pointer that precedes the hash table. */ sprintf(asciiptr, "%*d", PTR_SZ, 0); hash[0] = 0; for(i=0;i<(NHASH_DEF + 1);i++) strcat(hash, asciiptr); strcat(hash, "\n"); i = strlen(hash); if(write(db->idxfd, hash, i) != i) err_dump("error"); } if(un_lock(db->idxfd, 0, SEEK_SET, 0) < 0) err_dump("error"); } db->nhash = NHASH_DEF; /* hash table size */ db->hashoff = HASH_OFF; /* offset in index file of hash table */ /* free list ptr always at FREE_OFF */ db_rewind(db); return(db); }
/* * Open or create a database. Same arguments as open(2). */ DBHANDLE db_open(const char *pathname, int oflag, ...) { DB *db; int len, mode; size_t i; char asciiptr[PTR_SZ + 1], hash[(NHASH_DEF + 1) * PTR_SZ + 2]; /* +2 for newline and null */ struct stat statbuff; /* * Allocate a DB structure, and the buffers it needs. */ len = strlen(pathname); if ((db = _db_alloc(len)) == NULL) err_dump("db_open: _db_alloc error for DB"); db->nhash = NHASH_DEF;/* hash table size */ db->hashoff = HASH_OFF; /* offset in index file of hash table */ strcpy(db->name, pathname); strcat(db->name, ".idx"); if (oflag & O_CREAT) { va_list ap; va_start(ap, oflag); mode = va_arg(ap, int); va_end(ap); /* * Open index file and data file. */ db->idxfd = open(db->name, oflag, mode); strcpy(db->name + len, ".dat"); db->datfd = open(db->name, oflag, mode); } else {