void PreparedStatement::parseDsqlMessage(const dsql_msg* dsqlMsg, Array<dsc>& values, MsgMetadata* msgMetadata, UCharBuffer& msg) { // hvlad: Parameters in dsqlMsg->msg_parameters almost always linked in descending // order by par_index. The only known exception is EXECUTE BLOCK statement. // To generate correct metadata we must walk params in ascending par_index order. // So store all params in array in an ascending par_index order despite of // order in linked list. // ASF: Input parameters don't come necessarily in ascending or descending order, // so I changed the code to use a SortedArray. // AP: removed assertions for correct parameters order - useless with SortedArray. SortedArray<const dsql_par*, InlineStorage<const dsql_par*, 16>, const dsql_par*, DefaultKeyValue<const dsql_par*>, ParamCmp> params; for (size_t i = 0; i < dsqlMsg->msg_parameters.getCount(); ++i) { dsql_par* par = dsqlMsg->msg_parameters[i]; if (par->par_index) params.add(par); } size_t paramCount = params.getCount(); values.resize(paramCount * 2); msgMetadata->setItemsCount(paramCount); for (size_t i = 0; i < paramCount; ++i) dscToMetaItem(¶ms[i]->par_desc, msgMetadata->getItem(i)); msgMetadata->makeOffsets(); msg.resize(msgMetadata->getMessageLength()); dsc* value = values.begin(); for (size_t i = 0; i < paramCount; ++i) { // value *value = params[i]->par_desc; value->dsc_address = msg.begin() + msgMetadata->getItem(i).offset; ++value; // NULL indicator value->makeShort(0); value->dsc_address = msg.begin() + msgMetadata->getItem(i).nullInd; // set NULL indicator value *((SSHORT*) value->dsc_address) = -1; ++value; } }
// Parse routine BLR. void Routine::parseBlr(thread_db* tdbb, CompilerScratch* csb, bid* blob_id) { Jrd::Attachment* attachment = tdbb->getAttachment(); UCharBuffer tmp; if (blob_id) { blb* blob = blb::open(tdbb, attachment->getSysTransaction(), blob_id); ULONG length = blob->blb_length + 10; UCHAR* temp = tmp.getBuffer(length); length = blob->BLB_get_data(tdbb, temp, length); tmp.resize(length); } parseMessages(tdbb, csb, BlrReader(tmp.begin(), (unsigned) tmp.getCount())); JrdStatement* statement = getStatement(); PAR_blr(tdbb, NULL, tmp.begin(), (ULONG) tmp.getCount(), NULL, &csb, &statement, false, 0); setStatement(statement); if (!blob_id) setImplemented(false); }