00001
00002
00003
00004
00005
00006
00007
00008 #include "config.h"
00009
00010 #ifndef lint
00011 static const char revid[] = "$Id: db__reclaim_8c-source.html,v 1.1 2008/06/08 10:18:15 sebdiaz Exp $";
00012 #endif
00013
00014 #ifndef NO_SYSTEM_INCLUDES
00015 #include <sys/types.h>
00016 #endif
00017
00018 #include "db_int.h"
00019 #include "db_page.h"
00020 #include "db_am.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 int
00034 CDB___db_traverse_dup(dbp, pgno, callback, cookie)
00035 DB *dbp;
00036 db_pgno_t pgno;
00037 int (*callback) __P((DB *, PAGE *, void *, int *));
00038 void *cookie;
00039 {
00040 PAGE *p;
00041 int did_put, i, opgno, ret;
00042
00043 do {
00044 did_put = 0;
00045 if ((ret = CDB_memp_fget(dbp->mpf, &pgno, 0, &p)) != 0)
00046 return (ret);
00047 pgno = NEXT_PGNO(p);
00048
00049 for (i = 0; i < NUM_ENT(p); i++) {
00050 if (B_TYPE(GET_BKEYDATA(p, i)->type) == B_OVERFLOW) {
00051 opgno = GET_BOVERFLOW(p, i)->pgno;
00052 if ((ret = CDB___db_traverse_big(dbp,
00053 opgno, callback, cookie)) != 0)
00054 goto err;
00055 }
00056 }
00057
00058 if ((ret = callback(dbp, p, cookie, &did_put)) != 0)
00059 goto err;
00060
00061 if (!did_put)
00062 if ((ret = CDB_memp_fput(dbp->mpf, p, 0)) != 0)
00063 return (ret);
00064 } while (pgno != PGNO_INVALID);
00065
00066 if (0) {
00067 err: if (did_put == 0)
00068 (void)CDB_memp_fput(dbp->mpf, p, 0);
00069 }
00070 return (ret);
00071 }
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 int
00085 CDB___db_traverse_big(dbp, pgno, callback, cookie)
00086 DB *dbp;
00087 db_pgno_t pgno;
00088 int (*callback) __P((DB *, PAGE *, void *, int *));
00089 void *cookie;
00090 {
00091 PAGE *p;
00092 int did_put, ret;
00093
00094 do {
00095 did_put = 0;
00096 if ((ret = CDB_memp_fget(dbp->mpf, &pgno, 0, &p)) != 0)
00097 return (ret);
00098 pgno = NEXT_PGNO(p);
00099 if ((ret = callback(dbp, p, cookie, &did_put)) == 0 &&
00100 !did_put)
00101 ret = CDB_memp_fput(dbp->mpf, p, 0);
00102 } while (ret == 0 && pgno != PGNO_INVALID);
00103
00104 return (ret);
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 int
00119 CDB___db_reclaim_callback(dbp, p, cookie, putp)
00120 DB *dbp;
00121 PAGE *p;
00122 void *cookie;
00123 int *putp;
00124 {
00125 int ret;
00126
00127 COMPQUIET(dbp, NULL);
00128
00129 if ((ret = CDB___db_free(cookie, p)) != 0)
00130 return (ret);
00131 *putp = 1;
00132
00133 return (0);
00134 }