void CVDBCursor::SetParam(const char* name, const CTempString& value) const { if ( rc_t rc = VCursorParamsSet ((struct VCursorParams *)GetPointer(), name, "%.*s", value.size(), value.data()) ) { NCBI_THROW2_FMT(CSraException, eNotFound, "Cannot set VDB cursor param: "<<*this<<": "<<name, rc); } }
/* GetSpotId * convert spot name to spot id * * "id" [ OUT ] - return parameter for min(spot_id)-max(spot_id) * * "spot_name" [ IN ] - external spot name string * in platform canonical format. */ LIB_EXPORT rc_t CC SRATableGetSpotId ( const SRATable *self, spotid_t *rslt, const char *spot_name ) { rc_t rc; if( self == NULL || spot_name == NULL){ rc=RC(rcSRA, rcTable, rcListing, rcSelf, rcName); } else { rc=VCursorParamsSet((struct VCursorParams*)self->curs,"QUERY_BY_NAME" ,spot_name); if( rc == 0) { struct { uint64_t start_id; uint64_t id_count; int64_t x; int64_t y; } out; uint32_t idx,len; rc = VCursorAddColumn(self->curs, &idx, "SPOT_IDS_FOUND"); if( rc == 0 || GetRCState(rc) == rcExists){ rc = VCursorReadDirect(self->curs,1,idx,sizeof(out) * 8,&out, 1 , &len); if ( rc == 0 ) { if(out.id_count==1) { if(rslt) *rslt=out.start_id; return 0; } else if(out.id_count > 1) { /*** doing table range scan in Name space - not relying on X and Y***/ uint32_t x_idx; rc = VCursorAddColumn(self->curs, &x_idx, "X"); if( rc == 0 || GetRCState(rc) == rcExists){ uint32_t y_idx; rc = VCursorAddColumn(self->curs, &y_idx, "Y"); if(rc == 0 || GetRCState(rc) == rcExists){ spotid_t rowid; for(rowid = out.start_id; rowid < out.start_id + out.id_count; rowid ++){ int32_t x,y; rc = VCursorReadDirect(self->curs,rowid,x_idx,32,&x,1, &len); if(rc == 0){ rc = VCursorReadDirect(self->curs,rowid,y_idx,32,&y,1, &len); if(rc == 0 && x==out.x && y==out.y){ if(rslt) *rslt=rowid; return 0; } } } } } } rc = RC ( rcSRA, rcIndex, rcSearching, rcColumn, rcNotFound ); } } } } return rc; }
rc_t runChecks(const TestCase& test_case, const VCursor * cursor, uint32_t name_idx, uint32_t name_range_idx) { rc_t rc; int64_t first_id; uint64_t count_id; rc = VCursorIdRange( cursor, name_idx, &first_id, &count_id ); if (rc != 0) { LOGERR( klogInt, rc, "VCursorIdRange() failed" ); return rc; } for (uint64_t row_id = first_id; row_id < first_id + count_id; ++row_id) { const char * name = NULL; uint32_t name_len; RowRange *row_range; rc = VCursorCellDataDirect( cursor, row_id, name_idx, NULL, (void const **)&name, NULL, &name_len ); if ( rc != 0 ) return rc; rc = VCursorParamsSet( ( struct VCursorParams const * )cursor, "QUERY_NAME", "%.*s", name_len, name ); if ( rc != 0 ) return rc; rc = VCursorCellDataDirect( cursor, row_id, name_range_idx, NULL, (void const **)&row_range, NULL, NULL ); if ( rc != 0 ) return rc; std::string name_str(name, name_len); if (test_case.key_ranges.find(name_str) == test_case.key_ranges.end()) { PLOGMSG( klogInt, (klogErr, "Unexpected name '$(NAME)' in test case '$(TC_NAME)'", "TC_NAME=%s,NAME=%s", test_case_name, name_str.c_str()) ); return 1; } RowRange row_range_exp = test_case.key_ranges.find(name_str)->second; if (row_range->start_id != row_range_exp.start_id || row_range->stop_id != row_range_exp.stop_id) { PLOGMSG( klogInt, (klogErr, "Row range for name '$(NAME)' in test case '$(TC_NAME)' does not match. Expected: $(EXP_S)-$(EXP_F), actual: $(ACT_S)-$(ACT_F)", "TC_NAME=%s,NAME=%s,EXP_S=%ld,EXP_F=%ld,ACT_S=%ld,ACT_F=%ld", test_case_name, name_str.c_str(), row_range_exp.start_id, row_range_exp.stop_id, row_range->start_id, row_range->stop_id) ); return 1; } } return rc; }
/* function INSDC:coord:zero NCBI:align:ref_pos ( I64 ref_id, INSDC:coord:zero ref_start ); */ static rc_t CC align_ref_pos ( void *data, const VXformInfo *info, int64_t row_id, VRowResult *rslt, uint32_t argc, const VRowData argv[] ) { rc_t rc = 0; RefPos const *self = ( void const * )data; int64_t ref_row_id = 0; INSDC_coord_zero *ref_pos; unsigned const ploidy = ( unsigned const )argv[ REF_START ].u.data.elem_count; unsigned i; /* get start and length of reference segment */ int64_t const *ref_id = 0; INSDC_coord_zero const *ref_start; assert( argv[ REF_ID ].u.data.elem_bits == sizeof( *ref_id ) * 8 ); assert( argv[ REF_START ].u.data.elem_bits == sizeof( *ref_start ) * 8 ); ref_start = argv[ REF_START ].u.data.base; ref_start += argv[ REF_START ].u.data.first_elem; if ( self->curs != NULL ) { char const *name = NULL; uint32_t name_len; BSTRowRange *brr; ref_id = argv[ REF_ID ].u.data.base; ref_id += argv[ REF_ID ].u.data.first_elem; brr = ( BSTRowRange * )BSTreeFind( &self->tr_range, &ref_id[ 0 ], row_range_cmp ); if ( brr == NULL ) { RowRange *new_rr; SUB_DEBUG( ( "SUB.Rd in 'align-ref-pos.c' at #%lu\n", ref_id[ 0 ] ) ); rc = VCursorCellDataDirect( self->curs, ref_id[ 0 ], self->name_idx, NULL, (void const **)&name, NULL, &name_len ); if ( rc != 0 ) return rc; rc = VCursorParamsSet( ( struct VCursorParams const * )self->curs, "QUERY_SEQ_NAME", "%.*s", name_len, name ); if ( rc != 0 ) return rc; rc = VCursorCellDataDirect( self->curs, ref_id[ 0 ], self->name_range_idx, NULL, (void const **)&new_rr, NULL, NULL ); if ( rc != 0 ) return rc; brr = malloc( sizeof( *brr ) ); if ( brr == NULL ) { return RC( rcXF, rcFunction, rcConstructing, rcMemory, rcExhausted ); } else { memcpy( &brr->rr, new_rr, sizeof( *new_rr ) ); BSTreeInsert( ( BSTree* )&self->tr_range, ( BSTNode* )brr, row_range_sort ); } } ref_row_id = brr->rr.start_id; } rc = KDataBufferResize( rslt->data, ploidy ); if ( rc != 0 ) return rc; ref_pos = rslt->data->base; for ( i = 0; i != ploidy; ++i ) { ref_pos[ i ] = ref_start[ i ]; if ( self->curs != NULL ) { ref_pos[ i ] += ( INSDC_coord_zero )( ( ref_id[ 0 ] - ref_row_id ) * self->max_seq_len ); } } rslt->elem_count = ploidy; rslt->elem_bits = sizeof( ref_pos[ 0 ] ) * 8; return rc; }