/** * Get information about a key: length of its value and index within the page. * * @return TRUE if key was found, value length via *length, index via *idx, * and whether value is stored in a .dat file via *big. */ bool infopair(DBM *db, char *pag, datum key, size_t *length, int *idx, bool *big) { int i; unsigned n; size_t dsize; const unsigned short *ino = (const unsigned short *) pag; if ((n = ino[0]) == 0) return FALSE; if ((i = seepair(db, pag, n, key.dptr, key.dsize)) == 0) return FALSE; dsize = offset(ino[i]) - offset(ino[i + 1]); #ifdef BIGDATA if (is_big(ino[i + 1])) { g_assert(dsize >= sizeof(uint32)); dsize = big_length(pag + offset(ino[i + 1])); } #endif if (length != NULL) *length = dsize; if (idx != NULL) *idx = i; if (big != NULL) *big = is_big(ino[i + 1]); return TRUE; /* Key exists */ }
datum getpair(DBM *db, char *pag, datum key) { int i; unsigned n; datum val; const unsigned short *ino = (const unsigned short *) pag; if ((n = ino[0]) == 0) return nullitem; if ((i = seepair(db, pag, n, key.dptr, key.dsize)) == 0) return nullitem; val.dptr = pag + offset(ino[i + 1]); val.dsize = offset(ino[i]) - offset(ino[i + 1]); #ifdef BIGDATA if (is_big(ino[i + 1])) { size_t dsize = big_length(val.dptr); val.dptr = bigval_get(db, val.dptr, val.dsize); val.dsize = (NULL == val.dptr) ? 0 : dsize; } #endif return val; }
bool exipair(DBM *db, const char *pag, datum key) { const unsigned short *ino = (const unsigned short *) pag; if (ino[0] == 0) return FALSE; return seepair(db, pag, ino[0], key.dptr, key.dsize) != 0; }
int exipair(char *pag, datum key) { register short *ino = (short *) pag; if (ino[0] == 0) return 0; return (seepair(pag, ino[0], key.dptr, key.dsize) != 0); }
int delpair(char *pag, datum key) { int n; int i; short *ino = (short *) pag; if ((n = ino[0]) == 0) return 0; if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0) return 0; /* * found the key. if it is the last entry * [i.e. i == n - 1] we just adjust the entry count. * hard case: move all data down onto the deleted pair, * shift offsets onto deleted offsets, and adjust them. * [note: 0 < i < n] */ if (i < n - 1) { int m; char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]); char *src = pag + ino[i + 1]; int zoo = dst - src; debug(("free-up %d ", zoo)); /* * shift data/keys down */ m = ino[i + 1] - ino[n]; #ifdef DUFF #define MOVB *--dst = *--src if (m > 0) { int loop = (m + 8 - 1) >> 3; switch (m & (8 - 1)) { case 0: do { MOVB; case 7: MOVB; case 6: MOVB; case 5: MOVB; case 4: MOVB; case 3: MOVB; case 2: MOVB; case 1: MOVB; } while (--loop); } }
datum getpair(char *pag, datum key) { register int i; register int n; datum val; register short *ino = (short *) pag; if ((n = ino[0]) == 0) return nullitem; if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0) return nullitem; val.dptr = pag + ino[i + 1]; val.dsize = ino[i] - ino[i + 1]; return val; }
bool duppair(DBM *db, const char *pag, datum key) { const unsigned short *ino = (const unsigned short *) pag; return ino[0] > 0 && seepair(db, pag, ino[0], key.dptr, key.dsize) > 0; }
int delpair(char *pag, datum key) { register int n; register int i; register short *ino = (short *) pag; if ((n = ino[0]) == 0) return 0; if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0) return 0; /* * found the key. if it is the last entry * [i.e. i == n - 1] we just adjust the entry count. * hard case: move all data down onto the deleted pair, * shift offsets onto deleted offsets, and adjust them. * [note: 0 < i < n] */ if (i < n - 1) { register int m; register char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]); register char *src = pag + ino[i + 1]; register int zoo = dst - src; debug(("free-up %d ", zoo)); /* * shift data/keys down */ m = ino[i + 1] - ino[n]; #ifdef DUFF #define MOVB *--dst = *--src if (m > 0) { register int loop = (m + 8 - 1) >> 3; switch (m & (8 - 1)) { case 0: do { MOVB; case 7: MOVB; case 6: MOVB; case 5: MOVB; case 4: MOVB; case 3: MOVB; case 2: MOVB; case 1: MOVB; } while (--loop); } } #else #ifdef HAS_MEMMOVE dst -= m; src -= m; memmove(dst, src, m); #else while (m--) *--dst = *--src; #endif #endif /* * adjust offset index up */ while (i < n - 1) { ino[i] = ino[i + 2] + zoo; i++; } } ino[0] -= 2; return 1; }
int duppair(char *pag, datum key) { register short *ino = (short *) pag; return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0; }