int check_directory_has_parent(unsigned long long inode) { BDBCUR *cur; char *key, *value; int size; unsigned long long dir; unsigned long long ent; int hasparent=0; /* traverse records */ cur = tcbdbcurnew(dbdirent); tcbdbcurfirst(cur); while ((key = tcbdbcurkey2(cur)) != NULL) { memcpy(&dir, key, sizeof(dir)); value = tcbdbcurval(cur, &size);; if (value) { memcpy(&ent, value, sizeof(ent)); if ( inode == ent ) hasparent=1; free(value); } free(key); tcbdbcurnext(cur); } tcbdbcurdel(cur); return(hasparent); }
void search_and_delete_dbdirent(DDSTAT *ddstat) { BDBCUR *cur; char *key, *value; int size; unsigned long long dir; unsigned long long ent; /* traverse records */ cur = tcbdbcurnew(dbdirent); tcbdbcurfirst(cur); while ((key = tcbdbcurkey2(cur)) != NULL) { memcpy(&dir, key, sizeof(dir)); value = tcbdbcurval(cur, &size);; if (value) { memcpy(&ent, value, sizeof(ent)); if ( ent == ddstat->stbuf.st_ino) { printf("Delete %llu:%llu\n",dir,ent); btdelete_curkey(dbdirent, &dir, sizeof(unsigned long long), &ent, sizeof(unsigned long long)); } free(value); } free(key); tcbdbcurnext(cur); } tcbdbcurdel(cur); }
ex_t db_foreach(void *vhandle, db_foreach_t hook, void *userdata) { int ret = 0; dbh_t *handle = vhandle; TCBDB *dbp = handle->dbp; BDBCUR *cursor; dbv_t dbv_key, dbv_data; int ksiz, dsiz; char *key, *data; cursor = tcbdbcurnew(dbp); ret = tcbdbcurfirst(cursor); if (ret) { while ((key = tcbdbcurkey(cursor, &ksiz))) { data = tcbdbcurval(cursor, &dsiz); if (data) { /* switch to "dbv_t *" variables */ dbv_key.leng = ksiz; dbv_key.data = xmalloc(dbv_key.leng+1); memcpy(dbv_key.data, key, ksiz); ((char *)dbv_key.data)[dbv_key.leng] = '\0'; dbv_data.data = data; dbv_data.leng = dsiz; /* read count */ /* call user function */ ret = hook(&dbv_key, &dbv_data, userdata); xfree(dbv_key.data); if (ret != 0) break; free(data); /* not xfree() as allocated by dpget() */ } free(key); /* not xfree() as allocated by dpiternext() */ tcbdbcurnext(cursor); } } else { print_error(__FILE__, __LINE__, "(tc) tcbdbcurfirst err: %d, %s", tcbdbecode(dbp), tcbdberrmsg(tcbdbecode(dbp))); exit(EX_ERROR); } tcbdbcurdel(cursor); return EX_OK; }
/* val */ JNIEXPORT jbyteArray JNICALL Java_tokyocabinet_BDBCUR_val (JNIEnv *env, jobject self){ BDBCUR *cur = (BDBCUR *)(intptr_t)(*env)->GetLongField(env, self, bdbcur_fid_ptr); int vsiz; char *vbuf = tcbdbcurval(cur, &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; }
unsigned long long get_offset(unsigned long long size) { unsigned long long mbytes; unsigned long long offset; BDBCUR *cur; unsigned long long *dbkey; unsigned long long *dboffset; int dbsize; bool found = 0; FUNC; mbytes = round_512(size); mbytes = mbytes / 512; offset = nextoffset; LDEBUG("get_offset : search for %llu blocks on the freelist", mbytes); cur = tcbdbcurnew(freelist); if (tcbdbcurjump(cur, (void *) &mbytes, sizeof(unsigned long long))) { if ((dbkey = tcbdbcurkey(cur, &dbsize)) != NULL) { if (0 == memcmp(dbkey, &mbytes, sizeof(unsigned long long))) { if ((dboffset = tcbdbcurval(cur, &dbsize)) == NULL) die_dataerr("No value for key"); memcpy(&offset, dboffset, sizeof(unsigned long long)); found = 1; LDEBUG ("get_offset : reclaim %llu blocks on the freelist at offset %llu", mbytes, offset); if (!tcbdbcurout(cur)) { die_dataerr ("Failed to delete key, this should never happen!"); } free(dboffset); } free(dbkey); } } if (!found) set_new_offset(size); tcbdbcurdel(cur); LDEBUG("get_offset returns = %llu", offset); EFUNC; return (offset); }
IoObject *IoTokyoCabinetPrefixCursor_value(IoObject *self, IoObject *locals, IoMessage *m) { /*doc TokyoCabinetPrefixCursor value Returns current cursor value or nil. */ int size; char *value; IOASSERT(TokyoCabinetPrefixCursor(self), "invalid TokyoCabinetPrefixCursor"); value = tcbdbcurval(TokyoCabinetPrefixCursor(self), &size); if (value) { IoSeq *s = IoSeq_newWithData_length_(IOSTATE, (unsigned char *)value, size); free(value); return s; } return IONIL(self); }
void check_directory_structure() { BDBCUR *cur; char *key, *value; int size; int hasparent; unsigned long long dir; unsigned long long lastdir=0; unsigned long long ent; int multi=0; DBT *data; /* traverse records */ recheck: cur = tcbdbcurnew(dbdirent); tcbdbcurfirst(cur); while ((key = tcbdbcurkey2(cur)) != NULL) { show_progress(); memcpy(&dir, key, sizeof(dir)); if ( lastdir == dir ) { if ( multi == 2 ) { tcbdbcurnext(cur); continue; } else { multi=1; } } else multi=0; value = tcbdbcurval(cur, &size);; if (value) { memcpy(&ent, value, sizeof(ent)); data = search_dbdata(dbp, &ent, sizeof(unsigned long long)); if (NULL == data) { printf("%ccheck_directory_structure : delete inode %llu present in dbdirent but not found in dbp.\n", BACKSPACE,ent); btdelete_curkey(dbdirent, &dir, sizeof(unsigned long long), &ent, sizeof(unsigned long long)); free(value); free(key); tcbdbcurdel(cur); goto recheck; } DBTfree(data); free(value); if ( multi == 1 ) { multi++; if ( dir > 1 ) { // Skip the root directory. // This is a directory, check if it is linked. hasparent=check_directory_has_parent(dir); if ( hasparent == 0 ) { printf("Directory with inode number %llu is orphaned, relink to lost+found\n", dir); btbin_write_dup(dbdirent, &lafinode, sizeof(unsigned long long), &dir, sizeof(unsigned long long)); } } } } lastdir=dir; free(key); tcbdbcurnext(cur); } tcbdbcurdel(cur); }