Lines Matching defs:db

60 #define	dbm_dirty(db) ((db)->dbm_flags & _DBM_DIRTY)
61 #define dbm_dirdirty(db) ((db)->dbm_flags & _DBM_DIRDIRTY)
62 #define dbm_defwrite(db) ((db)->dbm_flags & _DBM_DEFWRITE)
63 #define dbm_setdirty(db) (db)->dbm_flags |= _DBM_DIRTY
64 #define dbm_clrdirty(db) (db)->dbm_flags &= ~_DBM_DIRTY
65 #define dbm_setdirdirty(db) (db)->dbm_flags |= _DBM_DIRDIRTY
66 #define dbm_clrdirdirty(db) (db)->dbm_flags &= ~_DBM_DIRDIRTY
81 static int dbm_flushpag(DBM *db);
89 dbm_setdefwrite(DBM *db)
91 db->dbm_flags |= _DBM_DEFWRITE;
97 dbm_error(DBM *db)
99 return (db->dbm_flags & _DBM_IOERR);
105 dbm_clearerr(DBM *db)
107 return (db->dbm_flags &= ~_DBM_IOERR);
111 dbm_flush(DBM *db)
114 if (dbm_flushpag(db) < 0)
116 if (dbm_flushdir(db) < 0)
122 dbm_flushpag(DBM *db)
127 if (dbm_dirty(db)) { /* must page out the page */
128 where = (((off64_t)db->dbm_pagbno) * PBLKSIZ);
129 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
130 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
131 db->dbm_flags |= _DBM_IOERR;
134 dbm_clrdirty(db);
140 dbm_flushdir(DBM *db)
144 if (dbm_dirdirty(db)) { /* must page out the dir */
145 where = (((off64_t)db->dbm_dirbno) * DBLKSIZ);
146 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
147 (write(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ)) {
150 dbm_clrdirdirty(db);
162 DBM *db;
165 if ((db = (DBM *)malloc(sizeof (*db))) == 0) {
169 db->dbm_flags = (flags & 03) == O_RDONLY ? _DBM_RDONLY : 0;
172 if (strlcpy(db->dbm_pagbuf, file, sizeof (db->dbm_pagbuf)) >=
173 sizeof (db->dbm_pagbuf) ||
174 strlcat(db->dbm_pagbuf, ".pag", sizeof (db->dbm_pagbuf)) >=
175 sizeof (db->dbm_pagbuf)) {
183 db->dbm_pagf = open64(db->dbm_pagbuf, flags, mode);
184 if (db->dbm_pagf < 0) {
193 (void) strlcpy(db->dbm_pagbuf, file, sizeof (db->dbm_pagbuf));
194 (void) strlcat(db->dbm_pagbuf, ".dir", sizeof (db->dbm_pagbuf));
195 db->dbm_dirf = open64(db->dbm_pagbuf, flags, mode);
196 if (db->dbm_dirf < 0) {
200 (void) fstat64(db->dbm_dirf, &statb);
201 db->dbm_maxbno = statb.st_size * BYTESIZ-1;
202 db->dbm_pagbno = db->dbm_dirbno = -1;
203 return (db);
205 (void) close(db->dbm_pagf);
207 free((char *)db);
213 dbm_close(DBM *db)
215 (void) dbm_close_status(db);
220 dbm_close_status(DBM *db)
225 if (dbm_flush(db) < 0)
227 if (close(db->dbm_dirf) < 0)
229 if (close(db->dbm_pagf) < 0)
231 free((char *)db);
236 dbm_forder(DBM *db, datum key)
241 for (db->dbm_hmask = 0; ; db->dbm_hmask = (db->dbm_hmask<<1)+1) {
242 db->dbm_blkno = hash & db->dbm_hmask;
243 db->dbm_bitno = db->dbm_blkno + db->dbm_hmask;
244 if (getbit(db) == 0)
247 return (db->dbm_blkno);
251 dbm_fetch(DBM *db, datum key)
256 if (dbm_error(db))
258 dbm_access(db, dcalchash(key));
259 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) {
260 item = makdatum(db->dbm_pagbuf, i+1);
271 dbm_delete(DBM *db, datum key)
276 if (dbm_error(db))
278 if (dbm_rdonly(db)) {
282 dbm_access(db, dcalchash(key));
283 if ((i = finddatum(db->dbm_pagbuf, key)) < 0)
285 if (!delitem(db->dbm_pagbuf, i))
287 db->dbm_pagbno = db->dbm_blkno;
288 if (dbm_defwrite(db)) {
289 dbm_setdirty(db);
291 where = (((off64_t)db->dbm_blkno) * PBLKSIZ);
292 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
293 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
295 db->dbm_flags |= _DBM_IOERR;
303 dbm_store(DBM *db, datum key, datum dat, int replace)
311 if (dbm_error(db))
313 if (dbm_rdonly(db)) {
319 dbm_access(db, key_hash);
320 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) {
323 if (!delitem(db->dbm_pagbuf, i)) {
324 db->dbm_flags |= _DBM_IOERR;
328 if (!additem(db->dbm_pagbuf, key, dat))
330 db->dbm_pagbno = db->dbm_blkno;
331 if (dbm_defwrite(db)) {
332 dbm_setdirty(db);
334 where = (((off64_t)db->dbm_blkno) * PBLKSIZ);
335 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
336 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
337 db->dbm_flags |= _DBM_IOERR;
345 db->dbm_flags |= _DBM_IOERR;
351 item = makdatum(db->dbm_pagbuf, i);
359 if (item_hash & (db->dbm_hmask+1)) {
360 item1 = makdatum(db->dbm_pagbuf, i+1);
364 db->dbm_flags |= _DBM_IOERR;
368 !delitem(db->dbm_pagbuf, i)) {
369 db->dbm_flags |= _DBM_IOERR;
376 db->dbm_pagbno = db->dbm_blkno;
377 where = (((off64_t)db->dbm_blkno) * PBLKSIZ);
378 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
379 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ)) {
380 db->dbm_flags |= _DBM_IOERR;
383 dbm_clrdirty(db); /* clear dirty */
384 where = (((off64_t)db->dbm_blkno + db->dbm_hmask + 1) * PBLKSIZ);
385 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
386 (write(db->dbm_pagf, ovfbuf, PBLKSIZ) != PBLKSIZ)) {
387 db->dbm_flags |= _DBM_IOERR;
390 if (setbit(db) < 0) {
391 db->dbm_flags |= _DBM_IOERR;
395 db->dbm_flags |= _DBM_IOERR;
402 dbm_hashinc(DBM *db, unsigned long hash)
406 hash &= db->dbm_hmask;
407 bit = db->dbm_hmask+1;
423 dbm_firsthash(DBM *db, unsigned long hash)
429 dbm_access(db, hash);
431 bitem = makdatum(db->dbm_pagbuf, 0);
433 item = makdatum(db->dbm_pagbuf, i);
442 db->dbm_keyptr = j + 2;
443 db->dbm_blkptr = db->dbm_blkno;
446 hash = dbm_hashinc(db, hash);
454 dbm_firstkey(DBM *db)
466 db->dbm_blkptr = 0L;
467 db->dbm_keyptr = 0;
469 rval = dbm_firsthash(db, 0L);
475 dbm_nextkey(DBM *db)
478 return (dbm_do_nextkey(db, nullkey));
492 dbm_slow_nextkey(DBM *db)
499 if (dbm_error(db) || fstat64(db->dbm_pagf, &statb) < 0)
504 if (db->dbm_blkptr != db->dbm_pagbno) {
506 if (dbm_dirty(db)) (void) dbm_flushpag(db);
508 db->dbm_pagbno = db->dbm_blkptr;
509 where = (((off64_t)db->dbm_blkptr) * PBLKSIZ);
510 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
511 (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) !=
513 (void) memset(db->dbm_pagbuf, 0, PBLKSIZ);
515 else if (chkblk(db->dbm_pagbuf) < 0)
516 db->dbm_flags |= _DBM_IOERR;
520 if (((short *)(uintptr_t)db->dbm_pagbuf)[0] != 0) {
521 item = makdatum(db->dbm_pagbuf, db->dbm_keyptr);
523 db->dbm_keyptr += 2;
526 db->dbm_keyptr = 0;
529 if (++db->dbm_blkptr >= statb.st_size)
541 dbm_do_nextkey(DBM *db, datum inkey)
554 if (dbm_error(db)) {
563 dbm_access(db, (hash = dcalchash(inkey)));
564 if ((i = finddatum(db->dbm_pagbuf, inkey)) >= 0) {
565 db->dbm_keyptr = i + 2;
566 db->dbm_blkptr = db->dbm_blkno;
572 if (db->dbm_blkptr == 0L &&
573 db->dbm_keyptr == 0)
574 return (dbm_firsthash(db, 0L));
578 if (db->dbm_blkptr != db->dbm_pagbno) {
580 if (dbm_dirty(db)) (void) dbm_flushpag(db);
581 db->dbm_pagbno = db->dbm_blkptr;
582 where = (((off64_t)db->dbm_blkptr) * PBLKSIZ);
583 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
584 (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) !=
586 (void) memset(db->dbm_pagbuf, 0, PBLKSIZ);
588 else if (chkblk(db->dbm_pagbuf) < 0)
589 db->dbm_flags |= _DBM_IOERR;
593 if (db->dbm_keyptr >= 2)
594 key = makdatum(db->dbm_pagbuf, (db->dbm_keyptr-2));
605 return (dbm_slow_nextkey(db));
615 sp = (short *)(uintptr_t)db->dbm_pagbuf;
628 item.dptr = db->dbm_pagbuf+sp[i + 1];
631 /* item = makdatum(db->dbm_pagbuf, i); */
696 db->dbm_keyptr = j + 2;
697 db->dbm_blkptr = db->dbm_blkno;
706 hash = dbm_hashinc(db, hash);
711 return (dbm_firsthash(db, hash));
717 dbm_access(DBM *db, unsigned long hash)
731 if (my_bitno > db->dbm_maxbno) break;
736 if (b != db->dbm_dirbno) {
737 if (dbm_dirdirty(db))
738 (void) dbm_flushdir(db); /* must flush */
739 db->dbm_dirbno = b;
741 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
742 (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) !=
744 (void) memset(db->dbm_dirbuf, 0, DBLKSIZ);
746 if ((db->dbm_dirbuf[i] & (1<<n)) == 0) break;
749 * if (getbit(db) == 0)
754 db->dbm_blkno = my_blkno;
755 db->dbm_bitno = my_bitno;
756 db->dbm_hmask = my_hmask;
758 if (my_blkno != db->dbm_pagbno) {
759 if (dbm_dirty(db)) { /* must page out the page */
760 where = (((off64_t)db->dbm_pagbno) * PBLKSIZ);
761 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
762 (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) !=
764 db->dbm_flags |= _DBM_IOERR;
766 dbm_clrdirty(db);
769 db->dbm_pagbno = my_blkno;
771 if ((lseek64(db->dbm_pagf, where, L_SET) != where) ||
772 (read(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ))
773 (void) memset(db->dbm_pagbuf, 0, PBLKSIZ);
775 else if (chkblk(db->dbm_pagbuf) < 0)
776 db->dbm_flags |= _DBM_IOERR;
782 getbit(DBM *db)
788 if (db->dbm_bitno > db->dbm_maxbno)
790 n = db->dbm_bitno % BYTESIZ;
791 bn = db->dbm_bitno / BYTESIZ;
794 if (b != db->dbm_dirbno) {
795 if (dbm_dirdirty(db))
796 (void) dbm_flushdir(db); /* must flush */
797 db->dbm_dirbno = b;
799 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
800 (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ))
801 (void) memset(db->dbm_dirbuf, 0, DBLKSIZ);
803 return (db->dbm_dirbuf[i] & (1<<n));
807 setbit(DBM *db)
813 if (db->dbm_bitno > db->dbm_maxbno)
814 db->dbm_maxbno = db->dbm_bitno;
815 n = db->dbm_bitno % BYTESIZ;
816 bn = db->dbm_bitno / BYTESIZ;
819 if (b != db->dbm_dirbno) {
820 if (dbm_dirdirty(db))
821 (void) dbm_flushdir(db);
822 db->dbm_dirbno = b;
824 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
825 (read(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ))
826 (void) memset(db->dbm_dirbuf, 0, DBLKSIZ);
828 db->dbm_dirbuf[i] |= 1<<n;
829 db->dbm_dirbno = b;
830 if (dbm_defwrite(db)) {
831 dbm_setdirdirty(db);
834 if ((lseek64(db->dbm_dirf, where, L_SET) != where) ||
835 (write(db->dbm_dirf, db->dbm_dirbuf, DBLKSIZ) != DBLKSIZ)) {