Map data from external world into message or from message to external world.
| 830 | |
| 831 | // Map data from external world into message or from message to external world. |
| 832 | void DsqlDmlRequest::mapInOut(thread_db* tdbb, bool toExternal, const dsql_msg* message, |
| 833 | IMessageMetadata* meta, UCHAR* dsql_msg_buf, const UCHAR* in_dsql_msg_buf) |
| 834 | { |
| 835 | USHORT count = parseMetadata(meta, message->msg_parameters); |
| 836 | |
| 837 | // Sanity check |
| 838 | |
| 839 | if (count) |
| 840 | { |
| 841 | if (toExternal) |
| 842 | { |
| 843 | if (dsql_msg_buf == NULL) |
| 844 | { |
| 845 | ERRD_post(Arg::Gds(isc_dsql_sqlda_err) << |
| 846 | Arg::Gds(isc_dsql_no_output_sqlda)); |
| 847 | } |
| 848 | } |
| 849 | else |
| 850 | { |
| 851 | if (in_dsql_msg_buf == NULL) |
| 852 | { |
| 853 | ERRD_post(Arg::Gds(isc_dsql_sqlda_err) << |
| 854 | Arg::Gds(isc_dsql_no_input_sqlda)); |
| 855 | } |
| 856 | } |
| 857 | } |
| 858 | |
| 859 | USHORT count2 = 0; |
| 860 | |
| 861 | for (FB_SIZE_T i = 0; i < message->msg_parameters.getCount(); ++i) |
| 862 | { |
| 863 | dsql_par* parameter = message->msg_parameters[i]; |
| 864 | |
| 865 | if (parameter->par_index) |
| 866 | { |
| 867 | // Make sure the message given to us is long enough |
| 868 | |
| 869 | dsc desc; |
| 870 | if (!req_user_descs.get(parameter, desc)) |
| 871 | desc.clear(); |
| 872 | |
| 873 | /*** |
| 874 | ULONG length = (IPTR) desc.dsc_address + desc.dsc_length; |
| 875 | if (length > msg_length) |
| 876 | { |
| 877 | ERRD_post(Arg::Gds(isc_dsql_sqlda_err) << |
| 878 | Arg::Gds(isc_random) << "Message buffer too short"); |
| 879 | } |
| 880 | ***/ |
| 881 | if (!desc.dsc_dtype) |
| 882 | { |
| 883 | ERRD_post(Arg::Gds(isc_dsql_sqlda_err) << |
| 884 | Arg::Gds(isc_dsql_datatype_err) << |
| 885 | Arg::Gds(isc_dsql_sqlvar_index) << Arg::Num(parameter->par_index-1)); |
| 886 | } |
| 887 | |
| 888 | UCHAR* msgBuffer = req_msg_buffers[parameter->par_message->msg_buffer_number]; |
| 889 |
no test coverage detected