fs_rid fs_hash_uri(const char *str) { uint64_t top; if (!str) { return 0; } if (strncmp(str, "bnode:b", 7) == 0) { fs_rid bnode_id = strtoll(str+7, NULL, 16); if (!bnode_id) { return FS_RID_GONE; } return FS_NUM_BNODE(bnode_id); } else if (strncmp(str, "_:b", 3) == 0) { fs_rid bnode_id = strtoll(str+3, NULL, 16); if (!bnode_id) { return FS_RID_GONE; } return FS_NUM_BNODE(bnode_id); } else if (!isalpha(str[0])) { return FS_RID_GONE; } top = umac_wrapper(str, 0); top |= 0xC000000000000000LL; return top; }
fs_value fn_bnode(fs_query *q, fs_value a) { a = fs_value_fill_rid(q, a); /* scramble the RID number a bit */ fs_value b = fs_value_blank(); b.rid = a.rid + q->block * 39916801; b.rid += q->row; b.rid += FS_NUM_BNODE(a.rid & ~0xC000000000000000LL); b.valid = fs_valid_bit(FS_V_RID); b.attr = FS_RID_NULL; return b; }