int dse_key_srch(block_id srch, block_id_ptr_t key_path, int4 *off, char *targ_key, int targ_len) { int status; status = dse_ksrch(srch, key_path, off, targ_key, targ_len); if (status) return status; else if(!patch_find_root_search) { /* We are not searching for the global name in the directory tree and search for the regular-key * has failed. So, adjust to the input key with special subscript to indicate it as a spanning node key. * call dse_ksrch() again. */ targ_len -= 1; /* back off 1 to overlay terminator */ SPAN_INITSUBS((span_subs *)(targ_key + targ_len), 0); targ_len += SPAN_SUBS_LEN; targ_key[targ_len++] = KEY_DELIMITER; targ_key[targ_len++] = KEY_DELIMITER; patch_path_count = 1; /*This indicates the length of the path of node in gvtree*/ patch_find_root_search = FALSE; status = dse_ksrch(srch, key_path, off, targ_key, targ_len); /* Undo updates to "targ_key" */ targ_len -= (SPAN_SUBS_LEN + 2); targ_key[targ_len] = KEY_DELIMITER; return status; } return FALSE; }
void dse_f_key(void) { block_id path[MAX_BT_DEPTH + 1], root_path[MAX_BT_DEPTH + 1]; int4 offset[MAX_BT_DEPTH + 1], root_offset[MAX_BT_DEPTH + 1], nocrit_present; char targ_key[256], targ_key_root[256], *key_top, util_buff[MAX_UTIL_LEN]; int size, size_root, root_path_count, count, util_len; bool found, was_crit; if (!dse_getki(&targ_key[0],&size,LIT_AND_LEN("KEY"))) return; patch_path_count = 1; root_path[0] = get_dir_root(); for (key_top = &targ_key[0]; key_top <= &targ_key[256]; ) if (!*key_top++) break; size_root = key_top - &targ_key[0] + 1; memcpy(&targ_key_root[0],&targ_key[0],size_root); targ_key_root[size_root - 1] = targ_key_root[size_root] = 0; patch_find_root_search = TRUE; was_crit = cs_addrs->now_crit; nocrit_present = (CLI_NEGATED == cli_present("CRIT")); if (!was_crit) { if (nocrit_present) cs_addrs->now_crit = TRUE; else grab_crit(gv_cur_region); } if (!dse_ksrch(root_path[0],&root_path[1],&root_offset[0],&targ_key_root[0],size_root)) { util_out_print("!/Key not found, no root present.!/",TRUE); if (!was_crit) { if (nocrit_present) cs_addrs->now_crit = FALSE; else rel_crit(gv_cur_region); } return; } root_path_count = patch_path_count; patch_path_count = 1; path[0] = ksrch_root; patch_find_root_search = FALSE; if (!dse_ksrch(path[0],&path[1],&offset[0],&targ_key[0],size)) { memcpy(util_buff,"!/Key not found, would be in block ",36); util_len = 36; util_len += i2hex_nofill(path[patch_path_count - 2], (uchar_ptr_t)&util_buff[util_len], 8); memcpy(&util_buff[util_len], ".",1); util_len += 1; util_buff[util_len] = 0; util_out_print(util_buff,FALSE); patch_path_count -= 1; }else { memcpy(util_buff,"!/Key found in block ",22); util_len = 22; util_len += i2hex_nofill(path[patch_path_count - 1], (uchar_ptr_t)&util_buff[util_len], 8); memcpy(&util_buff[util_len], ".",1); util_len += 1; util_buff[util_len] = 0; util_out_print(util_buff,FALSE); } util_out_print("!/ Directory path!/ Path--blk:off",TRUE); for (count = 0; count < root_path_count ;count++) { memcpy(util_buff," ",1); util_len = 1; util_len += i2hex_nofill(root_path[count],(uchar_ptr_t)&util_buff[util_len], 8); memcpy(&util_buff[util_len],":",1); util_len += 1; util_len += i2hex_nofill(root_offset[count],(uchar_ptr_t)&util_buff[util_len], 4); memcpy(&util_buff[util_len],",",1); util_len += 1; util_buff[util_len] = 0; util_out_print(util_buff,FALSE); } util_out_print("!/ Global tree path!/ Path--blk:off",TRUE); if (patch_path_count) { for (count = 0; count < patch_path_count ;count++) { memcpy(util_buff," ",1); util_len = 1; util_len += i2hex_nofill(path[count],(uchar_ptr_t)&util_buff[util_len], 8); memcpy(&util_buff[util_len],":",1); util_len += 1; util_len += i2hex_nofill(offset[count],(uchar_ptr_t)&util_buff[util_len], 4); memcpy(&util_buff[util_len],",",1); util_len += 1; util_buff[util_len] = 0; util_out_print(util_buff,FALSE); } util_out_print(0,TRUE); } else { memcpy(util_buff," ",1); util_len = 1; util_len += i2hex_nofill(root_path[count],(uchar_ptr_t)&util_buff[util_len], 8); memcpy(&util_buff[util_len],"!/",2); util_len += 2; util_buff[util_len] = 0; util_out_print(util_buff,TRUE); } if (!was_crit) { if (nocrit_present) cs_addrs->now_crit = FALSE; else rel_crit(gv_cur_region); } return; }
int dse_ksrch(block_id srch, block_id_ptr_t pp, int4 *off, char *targ_key, int targ_len) { cache_rec_ptr_t dummy_cr; int rsize, tmp_cmpc; int4 cmp, dummy_int; ssize_t size; sm_uc_ptr_t blk_id, bp, b_top, key_top, rp, r_top; unsigned short cc, dummy_short; if(!(bp = t_qread(srch, &dummy_int, &dummy_cr))) rts_error_csa(CSA_ARG(cs_addrs) VARLSTCNT(1) ERR_DSEBLKRDFAIL); if (((blk_hdr_ptr_t) bp)->bsiz > cs_addrs->hdr->blk_size) b_top = bp + cs_addrs->hdr->blk_size; else if (((blk_hdr_ptr_t) bp)->bsiz < SIZEOF(blk_hdr)) b_top = bp + SIZEOF(blk_hdr); else b_top = bp + ((blk_hdr_ptr_t) bp)->bsiz; CLEAR_DSE_COMPRESS_KEY; *off = 0; for (rp = bp + SIZEOF(blk_hdr); rp < b_top; rp = r_top) { *off = (int4)(rp - bp); GET_SHORT(dummy_short, &((rec_hdr_ptr_t)rp)->rsiz); rsize = dummy_short; if (rsize < SIZEOF(rec_hdr)) r_top = rp + SIZEOF(rec_hdr); else r_top = rp + rsize; if (r_top > b_top) r_top = b_top; if (r_top - rp < (((blk_hdr_ptr_t)bp)->levl ? SIZEOF(block_id) : MIN_DATA_SIZE) + SIZEOF(rec_hdr)) { *pp = 0; break; } for (key_top = rp + SIZEOF(rec_hdr); key_top < r_top ; ) if (!*key_top++ && !*key_top++) break; if (((blk_hdr_ptr_t)bp)->levl && key_top > (blk_id = r_top - SIZEOF(block_id))) key_top = blk_id; if (EVAL_CMPC((rec_hdr_ptr_t)rp) > patch_comp_count) cc = patch_comp_count; else cc = EVAL_CMPC((rec_hdr_ptr_t)rp); size = (ssize_t)(key_top - rp - SIZEOF(rec_hdr)); if (size > MAX_KEY_SZ - cc) size = MAX_KEY_SZ - cc; if (size < 0) size = 0; memcpy(&patch_comp_key[cc], rp + SIZEOF(rec_hdr), size); patch_comp_count = (int)(cc + size); GET_LONGP(pp, key_top); cmp = memvcmp(targ_key, targ_len, &patch_comp_key[0], patch_comp_count); if (0 > cmp) break; if (!cmp) { if (0 != ((blk_hdr_ptr_t)bp)->levl) break; if (patch_find_root_search) { for (key_top = rp + SIZEOF(rec_hdr); key_top < r_top; ) if (!*key_top++ && !*key_top++) break; GET_LONG(ksrch_root, key_top); } return TRUE; } } patch_path_count++; if (((blk_hdr_ptr_t) bp)->levl && *pp > 0 && *pp < cs_addrs->ti->total_blks && (*pp % cs_addrs->hdr->bplmap) && dse_ksrch(*pp, pp + 1, off + 1, targ_key, targ_len)) return TRUE; return FALSE; }