Lines Matching defs:db

31 #define dbm_dirty(db) ((db)->dbm_flags & _DBM_DIRTY)
32 #define dbm_dirdirty(db) ((db)->dbm_flags & _DBM_DIRDIRTY)
33 #define dbm_defwrite(db) ((db)->dbm_flags & _DBM_DEFWRITE)
34 #define dbm_setdirty(db) (db)->dbm_flags |= _DBM_DIRTY
35 #define dbm_clrdirty(db) (db)->dbm_flags &= ~_DBM_DIRTY
36 #define dbm_setdirdirty(db) (db)->dbm_flags |= _DBM_DIRDIRTY
37 #define dbm_clrdirdirty(db) (db)->dbm_flags &= ~_DBM_DIRDIRTY
52 dbm_setdefwrite(DBM *db)
54 db->dbm_flags |= _DBM_DEFWRITE;
58 dbm_flush(DBM *db)
61 if (dbm_flushpag(db)<0) ok= -1;
62 if (dbm_flushdir(db)<0) ok= -1;
67 dbm_flushpag(DBM *db)
70 if (dbm_dirty(db)){ /*must page out the page*/
71 (void) lseek(db->dbm_pagf, (long)(db->dbm_pagbno*PBLKSIZ), L_SET);
72 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) {
73 db->dbm_flags |= _DBM_IOERR;
76 dbm_clrdirty(db);
82 dbm_flushdir(DBM *db)
85 if (dbm_dirdirty(db)){ /*must page out the dir*/
86 (void) lseek(db->dbm_dirf, (long)(db->dbm_dirbno*DBLKSIZ), L_SET);
87 if (write(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ) {
90 dbm_clrdirdirty(db);
101 DBM *db;
104 if ((db = (DBM *)malloc(sizeof *db)) == 0) {
108 db->dbm_flags = (flags & 03) == O_RDONLY ? _DBM_RDONLY : 0;
111 if (strlcpy(db->dbm_pagbuf, file, sizeof (db->dbm_pagbuf)) >=
112 sizeof (db->dbm_pagbuf) ||
113 strlcat(db->dbm_pagbuf, ".pag", sizeof (db->dbm_pagbuf)) >=
114 sizeof (db->dbm_pagbuf)) {
122 db->dbm_pagf = open(db->dbm_pagbuf, flags, mode);
123 if (db->dbm_pagf < 0) {
132 (void) strlcpy(db->dbm_pagbuf, file, sizeof (db->dbm_pagbuf));
133 (void) strlcat(db->dbm_pagbuf, ".dir", sizeof (db->dbm_pagbuf));
134 db->dbm_dirf = open(db->dbm_pagbuf, flags, mode);
135 if (db->dbm_dirf < 0) {
139 (void) fstat(db->dbm_dirf, &statb);
140 db->dbm_maxbno = statb.st_size*BYTESIZ-1;
141 db->dbm_pagbno = db->dbm_dirbno = -1;
142 return (db);
144 (void) close(db->dbm_pagf);
146 free((char *)db);
152 dbm_close(DBM *db)
154 (void) dbm_close_status(db);
159 dbm_close_status(DBM *db)
164 if (dbm_flush(db) <0) ok = -1;
165 if (close(db->dbm_dirf)<0) ok= -1;
166 if ( close(db->dbm_pagf)<0) ok= -1;
167 free((char *)db);
172 dbm_forder(DBM *db, datum key)
177 for (db->dbm_hmask=0;; db->dbm_hmask=(db->dbm_hmask<<1)+1) {
178 db->dbm_blkno = hash & db->dbm_hmask;
179 db->dbm_bitno = db->dbm_blkno + db->dbm_hmask;
180 if (getbit(db) == 0)
183 return (db->dbm_blkno);
187 dbm_fetch(DBM *db, datum key)
192 if (dbm_error(db))
194 dbm_access(db, dcalchash(key));
195 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) {
196 item = makdatum(db->dbm_pagbuf, i+1);
207 dbm_delete(DBM *db, datum key)
211 if (dbm_error(db))
213 if (dbm_rdonly(db)) {
217 dbm_access(db, dcalchash(key));
218 if ((i = finddatum(db->dbm_pagbuf, key)) < 0)
220 if (!delitem(db->dbm_pagbuf, i))
222 db->dbm_pagbno = db->dbm_blkno;
223 if (dbm_defwrite(db)) {
224 dbm_setdirty(db);
227 (void) lseek(db->dbm_pagf, (long)(db->dbm_blkno*PBLKSIZ), L_SET);
228 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) {
230 db->dbm_flags |= _DBM_IOERR;
238 dbm_store(DBM *db, datum key, datum dat, int replace)
244 if (dbm_error(db))
246 if (dbm_rdonly(db)) {
251 dbm_access(db, dcalchash(key));
252 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) {
255 if (!delitem(db->dbm_pagbuf, i)) {
256 db->dbm_flags |= _DBM_IOERR;
260 if (!additem(db->dbm_pagbuf, key, dat))
262 db->dbm_pagbno = db->dbm_blkno;
263 if (dbm_defwrite(db)) {
264 dbm_setdirty(db);
268 (void) lseek(db->dbm_pagf, (long)(db->dbm_blkno*PBLKSIZ), L_SET);
269 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) {
270 db->dbm_flags |= _DBM_IOERR;
278 db->dbm_flags |= _DBM_IOERR;
284 item = makdatum(db->dbm_pagbuf, i);
287 if (dcalchash(item) & (db->dbm_hmask+1)) {
288 item1 = makdatum(db->dbm_pagbuf, i+1);
291 db->dbm_flags |= _DBM_IOERR;
295 !delitem(db->dbm_pagbuf, i)) {
296 db->dbm_flags |= _DBM_IOERR;
303 db->dbm_pagbno = db->dbm_blkno;
304 (void) lseek(db->dbm_pagf, (long)(db->dbm_blkno*PBLKSIZ), L_SET);
305 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) {
306 db->dbm_flags |= _DBM_IOERR;
309 dbm_clrdirty(db); /*clear dirty*/
310 (void) lseek(db->dbm_pagf,
311 (long)((db->dbm_blkno+db->dbm_hmask+1)*PBLKSIZ), L_SET);
312 if (write(db->dbm_pagf, ovfbuf, PBLKSIZ) != PBLKSIZ) {
313 db->dbm_flags |= _DBM_IOERR;
316 if (setbit(db) < 0) {
317 db->dbm_flags |= _DBM_IOERR;
324 dbm_hashinc(DBM *db, long hash)
329 hash &= db->dbm_hmask;
330 bit = db->dbm_hmask+1;
346 dbm_firsthash(DBM *db, long hash)
352 dbm_access(db, hash);
354 bitem = makdatum(db->dbm_pagbuf, 0);
356 item = makdatum(db->dbm_pagbuf, i);
365 db->dbm_keyptr = j + 2;
366 db->dbm_blkptr = db->dbm_blkno;
369 hash = dbm_hashinc(db,hash);
377 dbm_firstkey(DBM *db)
380 db->dbm_blkptr = 0L;
381 db->dbm_keyptr = 0;
382 return (dbm_firsthash(db, 0L));
386 dbm_nextkey(DBM *db)
389 return (dbm_do_nextkey(db, nullkey));
400 dbm_slow_nextkey(DBM *db)
405 if (dbm_error(db) || fstat(db->dbm_pagf, &statb) < 0)
410 if (db->dbm_blkptr != db->dbm_pagbno) {
412 if (dbm_dirty(db)) dbm_flushpag(db);
414 db->dbm_pagbno = db->dbm_blkptr;
415 (void) lseek(db->dbm_pagf, (long)(db->dbm_blkptr*PBLKSIZ), L_SET);
416 if (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)
417 bzero(db->dbm_pagbuf, PBLKSIZ);
419 else if (chkblk(db->dbm_pagbuf) < 0)
420 db->dbm_flags |= _DBM_IOERR;
424 if (((short *)db->dbm_pagbuf)[0] != 0) {
425 item = makdatum(db->dbm_pagbuf, db->dbm_keyptr);
427 db->dbm_keyptr += 2;
430 db->dbm_keyptr = 0;
433 if (++db->dbm_blkptr >= statb.st_size)
443 dbm_do_nextkey(DBM *db, datum inkey)
455 if ( dbm_error(db) ) {
464 dbm_access(db, (hash=dcalchash(inkey)));
465 if ((i = finddatum(db->dbm_pagbuf, inkey)) >= 0) {
466 db->dbm_keyptr = i + 2;
467 db->dbm_blkptr = db->dbm_blkno;
474 if (db->dbm_blkptr == 0L &&
475 db->dbm_keyptr == 0)
476 return (dbm_firsthash(db, 0L));
480 if (db->dbm_blkptr != db->dbm_pagbno) {
482 if (dbm_dirty(db)) dbm_flushpag(db);
483 db->dbm_pagbno = db->dbm_blkptr;
484 (void) lseek(db->dbm_pagf, (long)(db->dbm_blkptr*PBLKSIZ), L_SET);
485 if (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)
486 bzero(db->dbm_pagbuf, PBLKSIZ);
488 else if (chkblk(db->dbm_pagbuf) < 0)
489 db->dbm_flags |= _DBM_IOERR;
493 if (db->dbm_keyptr >=2) key= makdatum(db->dbm_pagbuf,(db->dbm_keyptr-2));
501 if (key.dptr == NULL) return (dbm_slow_nextkey(db));
509 sp = (short *)db->dbm_pagbuf;
523 item.dptr = db->dbm_pagbuf+sp[i+1];
526 /* item = makdatum(db->dbm_pagbuf, i);*/
589 db->dbm_keyptr = j + 2;
590 db->dbm_blkptr = db->dbm_blkno;
598 hash = dbm_hashinc(db,hash);
603 return (dbm_firsthash(db, hash));
609 dbm_access(DBM *db, long hash)
621 if (my_bitno > db->dbm_maxbno) break;
626 if (b != db->dbm_dirbno) {
627 if (dbm_dirdirty(db)) dbm_flushdir(db); /*must flush*/
628 db->dbm_dirbno = b;
629 (void) lseek(db->dbm_dirf, (long)(b*DBLKSIZ), L_SET);
630 if (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ)
631 bzero(db->dbm_dirbuf, DBLKSIZ);
633 if ( (db->dbm_dirbuf[i] & (1<<n)) == 0 ) break;
636 if (getbit(db) == 0)
641 db->dbm_blkno=my_blkno;
642 db->dbm_bitno=my_bitno;
643 db->dbm_hmask=my_hmask;
645 if (my_blkno != db->dbm_pagbno) {
646 if (dbm_dirty(db)){ /*must page out the page*/
647 (void) lseek(db->dbm_pagf, (long)(db->dbm_pagbno*PBLKSIZ), L_SET);
648 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) {
649 db->dbm_flags |= _DBM_IOERR;
651 dbm_clrdirty(db);
654 db->dbm_pagbno = my_blkno;
655 (void) lseek(db->dbm_pagf, (long)(my_blkno*PBLKSIZ), L_SET);
656 if (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)
657 bzero(db->dbm_pagbuf, PBLKSIZ);
659 else if (chkblk(db->dbm_pagbuf) < 0)
660 db->dbm_flags |= _DBM_IOERR;
666 getbit(DBM *db)
672 if (db->dbm_bitno > db->dbm_maxbno)
674 n = db->dbm_bitno % BYTESIZ;
675 bn = db->dbm_bitno / BYTESIZ;
678 if (b != db->dbm_dirbno) {
679 if (dbm_dirdirty(db)) dbm_flushdir(db); /*must flush*/
680 db->dbm_dirbno = b;
681 (void) lseek(db->dbm_dirf, (long)(b*DBLKSIZ), L_SET);
682 if (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ)
683 bzero(db->dbm_dirbuf, DBLKSIZ);
685 return (db->dbm_dirbuf[i] & (1<<n));
689 setbit(DBM *db)
694 if (db->dbm_bitno > db->dbm_maxbno)
695 db->dbm_maxbno = db->dbm_bitno;
696 n = db->dbm_bitno % BYTESIZ;
697 bn = db->dbm_bitno / BYTESIZ;
700 if (b != db->dbm_dirbno) {
701 if (dbm_dirdirty(db)) dbm_flushdir(db);
702 db->dbm_dirbno = b;
703 (void) lseek(db->dbm_dirf, (long)(b*DBLKSIZ), L_SET);
704 if (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ)
705 bzero(db->dbm_dirbuf, DBLKSIZ);
707 db->dbm_dirbuf[i] |= 1<<n;
708 db->dbm_dirbno = b;
709 if (dbm_defwrite(db)) {
710 dbm_setdirdirty(db);
712 (void) lseek(db->dbm_dirf, (long)(b*DBLKSIZ), L_SET);
713 if (write(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ) {