Lines Matching refs:db

57 #define	dbm_dirty(db) ((db)->dbm_flags & _DBM_DIRTY)
58 #define dbm_dirdirty(db) ((db)->dbm_flags & _DBM_DIRDIRTY)
59 #define dbm_defwrite(db) ((db)->dbm_flags & _DBM_DEFWRITE)
60 #define dbm_setdirty(db) (db)->dbm_flags |= _DBM_DIRTY
61 #define dbm_clrdirty(db) (db)->dbm_flags &= ~_DBM_DIRTY
62 #define dbm_setdirdirty(db) (db)->dbm_flags |= _DBM_DIRDIRTY
63 #define dbm_clrdirdirty(db) (db)->dbm_flags &= ~_DBM_DIRDIRTY
78 static int dbm_flushpag(DBM *db);
86 dbm_setdefwrite(DBM *db)
88 db->dbm_flags |= _DBM_DEFWRITE;
94 dbm_error(DBM *db)
96 return (db->dbm_flags & _DBM_IOERR);
102 dbm_clearerr(DBM *db)
104 return (db->dbm_flags &= ~_DBM_IOERR);
108 dbm_flush(DBM *db)
111 if (dbm_flushpag(db) < 0)
113 if (dbm_flushdir(db) < 0)
119 dbm_flushpag(DBM *db)
124 if (dbm_dirty(db)) { /* must page out the page */
125 where = (((off64_t)db->dbm_pagbno) * PBLKSIZ);
126 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
127 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
128 db->dbm_flags |= _DBM_IOERR;
131 dbm_clrdirty(db);
137 dbm_flushdir(DBM *db)
141 if (dbm_dirdirty(db)) { /* must page out the dir */
142 where = (((off64_t)db->dbm_dirbno) * DBLKSIZ);
143 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
144 (write(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ)) {
147 dbm_clrdirdirty(db);
159 DBM *db;
162 if ((db = (DBM *)malloc(sizeof (*db))) == 0) {
166 db->dbm_flags = (flags & 03) == O_RDONLY ? _DBM_RDONLY : 0;
169 if (strlcpy(db->dbm_pagbuf, file, sizeof (db->dbm_pagbuf)) >=
170 sizeof (db->dbm_pagbuf) ||
171 strlcat(db->dbm_pagbuf, ".pag", sizeof (db->dbm_pagbuf)) >=
172 sizeof (db->dbm_pagbuf)) {
180 db->dbm_pagf = open64(db->dbm_pagbuf, flags, mode);
181 if (db->dbm_pagf < 0) {
190 (void) strlcpy(db->dbm_pagbuf, file, sizeof (db->dbm_pagbuf));
191 (void) strlcat(db->dbm_pagbuf, ".dir", sizeof (db->dbm_pagbuf));
192 db->dbm_dirf = open64(db->dbm_pagbuf, flags, mode);
193 if (db->dbm_dirf < 0) {
197 (void) fstat64(db->dbm_dirf, &statb);
198 db->dbm_maxbno = statb.st_size * BYTESIZ-1;
199 db->dbm_pagbno = db->dbm_dirbno = -1;
200 return (db);
202 (void) close(db->dbm_pagf);
204 free((char *)db);
210 dbm_close(DBM *db)
212 (void) dbm_close_status(db);
217 dbm_close_status(DBM *db)
222 if (dbm_flush(db) < 0)
224 if (close(db->dbm_dirf) < 0)
226 if (close(db->dbm_pagf) < 0)
228 free((char *)db);
233 dbm_forder(DBM *db, datum key)
238 for (db->dbm_hmask = 0; ; db->dbm_hmask = (db->dbm_hmask<<1)+1) {
239 db->dbm_blkno = hash & db->dbm_hmask;
240 db->dbm_bitno = db->dbm_blkno + db->dbm_hmask;
241 if (getbit(db) == 0)
244 return (db->dbm_blkno);
248 dbm_fetch(DBM *db, datum key)
253 if (dbm_error(db))
255 dbm_access(db, dcalchash(key));
256 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) {
257 item = makdatum(db->dbm_pagbuf, i+1);
268 dbm_delete(DBM *db, datum key)
273 if (dbm_error(db))
275 if (dbm_rdonly(db)) {
279 dbm_access(db, dcalchash(key));
280 if ((i = finddatum(db->dbm_pagbuf, key)) < 0)
282 if (!delitem(db->dbm_pagbuf, i))
284 db->dbm_pagbno = db->dbm_blkno;
285 if (dbm_defwrite(db)) {
286 dbm_setdirty(db);
288 where = (((off64_t)db->dbm_blkno) * PBLKSIZ);
289 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
290 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
292 db->dbm_flags |= _DBM_IOERR;
300 dbm_store(DBM *db, datum key, datum dat, int replace)
308 if (dbm_error(db))
310 if (dbm_rdonly(db)) {
316 dbm_access(db, key_hash);
317 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) {
320 if (!delitem(db->dbm_pagbuf, i)) {
321 db->dbm_flags |= _DBM_IOERR;
325 if (!additem(db->dbm_pagbuf, key, dat))
327 db->dbm_pagbno = db->dbm_blkno;
328 if (dbm_defwrite(db)) {
329 dbm_setdirty(db);
331 where = (((off64_t)db->dbm_blkno) * PBLKSIZ);
332 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
333 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
334 db->dbm_flags |= _DBM_IOERR;
342 db->dbm_flags |= _DBM_IOERR;
348 item = makdatum(db->dbm_pagbuf, i);
356 if (item_hash & (db->dbm_hmask+1)) {
357 item1 = makdatum(db->dbm_pagbuf, i+1);
361 db->dbm_flags |= _DBM_IOERR;
365 !delitem(db->dbm_pagbuf, i)) {
366 db->dbm_flags |= _DBM_IOERR;
373 db->dbm_pagbno = db->dbm_blkno;
374 where = (((off64_t)db->dbm_blkno) * PBLKSIZ);
375 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
376 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
377 db->dbm_flags |= _DBM_IOERR;
380 dbm_clrdirty(db); /* clear dirty */
381 where = (((off64_t)db->dbm_blkno + db->dbm_hmask + 1) * PBLKSIZ);
382 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
383 (write(db->dbm_pagf, ovfbuf, PBLKSIZ) != PBLKSIZ)) {
384 db->dbm_flags |= _DBM_IOERR;
387 if (setbit(db) < 0) {
388 db->dbm_flags |= _DBM_IOERR;
392 db->dbm_flags |= _DBM_IOERR;
399 dbm_hashinc(DBM *db, unsigned long hash)
403 hash &= db->dbm_hmask;
404 bit = db->dbm_hmask+1;
420 dbm_firsthash(DBM *db, unsigned long hash)
426 dbm_access(db, hash);
428 bitem = makdatum(db->dbm_pagbuf, 0);
430 item = makdatum(db->dbm_pagbuf, i);
439 db->dbm_keyptr = j + 2;
440 db->dbm_blkptr = db->dbm_blkno;
443 hash = dbm_hashinc(db, hash);
451 dbm_firstkey(DBM *db)
463 db->dbm_blkptr = 0L;
464 db->dbm_keyptr = 0;
466 rval = dbm_firsthash(db, 0L);
472 dbm_nextkey(DBM *db)
475 return (dbm_do_nextkey(db, nullkey));
489 dbm_slow_nextkey(DBM *db)
496 if (dbm_error(db) || fstat64(db->dbm_pagf, &statb) < 0)
501 if (db->dbm_blkptr != db->dbm_pagbno) {
503 if (dbm_dirty(db)) (void) dbm_flushpag(db);
505 db->dbm_pagbno = db->dbm_blkptr;
506 where = (((off64_t)db->dbm_blkptr) * PBLKSIZ);
507 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
508 (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) !=
510 (void) memset(db->dbm_pagbuf, 0, PBLKSIZ);
512 else if (chkblk(db->dbm_pagbuf) < 0)
513 db->dbm_flags |= _DBM_IOERR;
517 if (((short *)(uintptr_t)db->dbm_pagbuf)[0] != 0) {
518 item = makdatum(db->dbm_pagbuf, db->dbm_keyptr);
520 db->dbm_keyptr += 2;
523 db->dbm_keyptr = 0;
526 if (++db->dbm_blkptr >= statb.st_size)
538 dbm_do_nextkey(DBM *db, datum inkey)
551 if (dbm_error(db)) {
560 dbm_access(db, (hash = dcalchash(inkey)));
561 if ((i = finddatum(db->dbm_pagbuf, inkey)) >= 0) {
562 db->dbm_keyptr = i + 2;
563 db->dbm_blkptr = db->dbm_blkno;
569 if (db->dbm_blkptr == 0L &&
570 db->dbm_keyptr == 0)
571 return (dbm_firsthash(db, 0L));
575 if (db->dbm_blkptr != db->dbm_pagbno) {
577 if (dbm_dirty(db)) (void) dbm_flushpag(db);
578 db->dbm_pagbno = db->dbm_blkptr;
579 where = (((off64_t)db->dbm_blkptr) * PBLKSIZ);
580 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
581 (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) !=
583 (void) memset(db->dbm_pagbuf, 0, PBLKSIZ);
585 else if (chkblk(db->dbm_pagbuf) < 0)
586 db->dbm_flags |= _DBM_IOERR;
590 if (db->dbm_keyptr >= 2)
591 key = makdatum(db->dbm_pagbuf, (db->dbm_keyptr-2));
602 return (dbm_slow_nextkey(db));
612 sp = (short *)(uintptr_t)db->dbm_pagbuf;
625 item.dptr = db->dbm_pagbuf+sp[i + 1];
628 /* item = makdatum(db->dbm_pagbuf, i); */
693 db->dbm_keyptr = j + 2;
694 db->dbm_blkptr = db->dbm_blkno;
703 hash = dbm_hashinc(db, hash);
708 return (dbm_firsthash(db, hash));
714 dbm_access(DBM *db, unsigned long hash)
728 if (my_bitno > db->dbm_maxbno) break;
733 if (b != db->dbm_dirbno) {
734 if (dbm_dirdirty(db))
735 (void) dbm_flushdir(db); /* must flush */
736 db->dbm_dirbno = b;
738 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
739 (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) !=
741 (void) memset(db->dbm_dirbuf, 0, DBLKSIZ);
743 if ((db->dbm_dirbuf[i] & (1<<n)) == 0) break;
746 * if (getbit(db) == 0)
751 db->dbm_blkno = my_blkno;
752 db->dbm_bitno = my_bitno;
753 db->dbm_hmask = my_hmask;
755 if (my_blkno != db->dbm_pagbno) {
756 if (dbm_dirty(db)) { /* must page out the page */
757 where = (((off64_t)db->dbm_pagbno) * PBLKSIZ);
758 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
759 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) !=
761 db->dbm_flags |= _DBM_IOERR;
763 dbm_clrdirty(db);
766 db->dbm_pagbno = my_blkno;
768 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
769 (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ))
770 (void) memset(db->dbm_pagbuf, 0, PBLKSIZ);
772 else if (chkblk(db->dbm_pagbuf) < 0)
773 db->dbm_flags |= _DBM_IOERR;
779 getbit(DBM *db)
785 if (db->dbm_bitno > db->dbm_maxbno)
787 n = db->dbm_bitno % BYTESIZ;
788 bn = db->dbm_bitno / BYTESIZ;
791 if (b != db->dbm_dirbno) {
792 if (dbm_dirdirty(db))
793 (void) dbm_flushdir(db); /* must flush */
794 db->dbm_dirbno = b;
796 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
797 (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ))
798 (void) memset(db->dbm_dirbuf, 0, DBLKSIZ);
800 return (db->dbm_dirbuf[i] & (1<<n));
804 setbit(DBM *db)
810 if (db->dbm_bitno > db->dbm_maxbno)
811 db->dbm_maxbno = db->dbm_bitno;
812 n = db->dbm_bitno % BYTESIZ;
813 bn = db->dbm_bitno / BYTESIZ;
816 if (b != db->dbm_dirbno) {
817 if (dbm_dirdirty(db))
818 (void) dbm_flushdir(db);
819 db->dbm_dirbno = b;
821 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
822 (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ))
823 (void) memset(db->dbm_dirbuf, 0, DBLKSIZ);
825 db->dbm_dirbuf[i] |= 1<<n;
826 db->dbm_dirbno = b;
827 if (dbm_defwrite(db)) {
828 dbm_setdirdirty(db);
831 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
832 (write(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ)) {