diff --git a/src/MyFirstUDRKit.cpp b/src/MyFirstUDRKit.cpp index 59ae072..73d75cb 100644 --- a/src/MyFirstUDRKit.cpp +++ b/src/MyFirstUDRKit.cpp @@ -65,6 +65,60 @@ using namespace Firebird; + +// First, let's start with a function from the UdfBackwardCompatibility +// library and add some additional comments. +// We will also use self-docmenting variable names +// ////////////////////////////////////////////////// + +/*** + * create function div ( + * anumerator integer, + * adenominator integer + * ) returns double precision + * external name 'udf_compat!UC_div!Divide param1 by param2' + * engine udr; + ***/ +FB_UDR_BEGIN_FUNCTION(UC_div) + +// Divide integer param 1 by integer param2 using the stdlib + +FB_UDR_MESSAGE(InMessage, + (FB_INTEGER, anumerator) + (FB_INTEGER, adenominator) +); + +FB_UDR_MESSAGE(OutMessage, + (FB_DOUBLE, result) +); + +FB_UDR_EXECUTE_FUNCTION +{ + if (in->anumeratorNull || in->adenominatorNull) + { + out->resultNull = FB_TRUE; + out->result = 0; + } + else + { + out->resultNull = FB_FALSE; + if (in->adenominator) { + out->result = div(in->anumerator, in->adenominator).quot; + } + else + { + out->result = std::numeric_limits::infinity(); + ISC_STATUS_ARRAY StatusVector = {isc_arg_gds, isc_arith_except, + isc_arg_gds, isc_exception_integer_divide_by_zero, isc_arg_end}; + FbException::check(isc_exception_integer_divide_by_zero, status, StatusVector); + } + } +} +FB_UDR_END_FUNCTION + + + + /*** DDL create function flagged ( n1 integer,