void purge_dbb_beyond(INOBNO *inobno) { char *asc_hash = NULL; char *key, *value; int size; int vsize; INOBNO inobnocur; printf("purge_dbb_beyond : purge fileblock metadata after blocknr %llu\n",inobno->blocknr); /* traverse records */ tchdbiterinit(dbb); while ((key = tchdbiternext(dbb, &size)) != NULL) { value = tchdbget(dbb, key, size, &vsize); memcpy(&inobnocur.inode, key, sizeof(unsigned long long)); memcpy(&inobnocur.blocknr, key + sizeof(unsigned long long), sizeof(unsigned long long)); if ( inobno->inode == inobnocur.inode ) { if ( inobnocur.blocknr > inobno->blocknr ) { printf("delete reference %llu-%llu\n",inobnocur.inode,inobnocur.blocknr); tchdbout(dbb,&inobnocur,sizeof(INOBNO)); // Verify dbu in this case. } } free(asc_hash); free(value); free(key); } }
void check_inodes() { char *key, *value; int size; int ksize; DDSTAT *ddstat; DBT *data; unsigned long long inode; char *nfi = "NFI"; CRYPTO *crypto; struct stat stbuf; char *blockdatadir; if (NULL == config->blockdatabs) { blockdatadir = s_dirname(config->blockdata); stat(blockdatadir, &stbuf); free(blockdatadir); } else { stat(config->blockdata, &stbuf); } /* traverse records */ tchdbiterinit(dbp); while ((key = tchdbiternext(dbp, &ksize)) != NULL) { show_progress(); if (0 == memcmp(key, nfi, 3)) { value = tchdbget(dbp, key, strlen(key), &size); memcpy(&inode, value, sizeof(unsigned long long)); free(value); } else { memcpy(&inode, key, sizeof(unsigned long long)); data = search_dbdata(dbp, &inode, sizeof(unsigned long long)); if (inode == 0) { crypto = (CRYPTO *) data->data; } else { ddstat = value_to_ddstat(data); if ( 0 == check_inode_orphaned(ddstat)) { if (S_ISREG(ddstat->stbuf.st_mode)) { if ( NULL != config->blockdatabs ) { check_inode_structure(ddstat); } else { file_check_inode_structure(ddstat); } } } else { printf("Deleting corrupted inode %llu\n",(unsigned long long)ddstat->stbuf.st_ino); search_and_delete_dbdirent(ddstat); delete_key(dbp, key, ksize); } ddstatfree(ddstat); } DBTfree(data); } free(key); } }
/* iternext */ JNIEXPORT jbyteArray JNICALL Java_tokyocabinet_HDB_iternext (JNIEnv *env, jobject self){ TCHDB *hdb = (TCHDB *)(intptr_t)(*env)->GetLongField(env, self, hdb_fid_ptr); int vsiz; char *vbuf = tchdbiternext(hdb, &vsiz); jbyteArray val; if(vbuf){ val = (*env)->NewByteArray(env, vsiz); if(!val){ throwoutmem(env); return NULL; } (*env)->SetByteArrayRegion(env, val, 0, vsiz, (jbyte *)vbuf); tcfree(vbuf); } else { val = NULL; } return val; }
static int _tc_nextkey (mu_dbm_file_t db, struct mu_dbm_datum *ret) { TCHDB *hdb = db->db_descr; void *ptr; int retsize; ptr = tchdbiternext (hdb, &retsize); if (ptr) { mu_dbm_datum_free (ret); ret->mu_dptr = ptr; ret->mu_dsize = retsize; return 0; } else if ((db->db_errno.n = tchdbecode (hdb)) == TCENOREC) return MU_ERR_NOENT; return MU_ERR_FAILURE; }
void* db_obj_local::dbiternext(int *sp) { return tchdbiternext(_hdb,sp); }
void set_next_itr() { free(pitr_); pitr_ = tchdbiternext(pdb_, &pitr_size_); }
/* perform list command */ static int proclist(const char *path, int omode, int max, bool pv, bool px, const char *fmstr){ TCHDB *hdb = tchdbnew(); if(g_dbgfd >= 0) tchdbsetdbgfd(hdb, g_dbgfd); if(!tchdbsetcodecfunc(hdb, _tc_recencode, NULL, _tc_recdecode, NULL)) printerr(hdb); if(!tchdbopen(hdb, path, HDBOREADER | omode)){ printerr(hdb); tchdbdel(hdb); return 1; } bool err = false; if(fmstr){ TCLIST *keys = tchdbfwmkeys2(hdb, fmstr, max); for(int i = 0; i < tclistnum(keys); i++){ int ksiz; const char *kbuf = tclistval(keys, i, &ksiz); printdata(kbuf, ksiz, px); if(pv){ int vsiz; char *vbuf = tchdbget(hdb, kbuf, ksiz, &vsiz); if(vbuf){ putchar('\t'); printdata(vbuf, vsiz, px); tcfree(vbuf); } } putchar('\n'); } tclistdel(keys); } else { if(!tchdbiterinit(hdb)){ printerr(hdb); err = true; } if(pv){ TCXSTR *key = tcxstrnew(); TCXSTR *val = tcxstrnew(); int cnt = 0; while(tchdbiternext3(hdb, key, val)){ printdata(tcxstrptr(key), tcxstrsize(key), px); putchar('\t'); printdata(tcxstrptr(val), tcxstrsize(val), px); putchar('\n'); if(cnt > 0 && cnt % 100 == 0){ putc('.', stderr); fflush(stderr); if(cnt % 5000 == 0) fprintf(stderr, " (%08d)\n", cnt); } cnt++; if(max >= 0 && cnt >= max) break; } fprintf(stderr, " (%08d)\n", cnt); tcxstrdel(val); tcxstrdel(key); } else { char *kbuf; int ksiz; int cnt = 0; while((kbuf = tchdbiternext(hdb, &ksiz)) != NULL) { printdata(kbuf, ksiz, px); putchar('\n'); tcfree(kbuf); if(max >= 0 && ++cnt >= max) break; } } } if(!tchdbclose(hdb)){ if(!err) printerr(hdb); err = true; } tchdbdel(hdb); return err ? 1 : 0; }