Prevent garbage errors from `ci()` calls due to call-in table mismatches
Currently, YDBPython's ci() and cip() functions rely on users to correctly specify whether or not a call-in routine has a return value to determine the number of parameters to allocate for the underlying call to ydb_ci or ydb_cip. If, however, a Python user incorrectly specifies that a routine has return value when its call-in table entry does not (or vice versa), YDBPython will not be able to properly construct arguments to ydb_ci/ydb_cip, leading to YottaDB potentially issuing garbage errors.
This is not very user-friendly, and so should be fixed so that YDBPython behaves consistently regardless of user-error, i.e. there should be no garbage errors/undefined behavior.
To resolve this issue, a Python-level class and/or C-level struct should be maintained with routine definition information derived from the active call-in table, so that YDBPython can detect whether or not to allocate a return value for the call to ydb_ci/ydb_cip and pass the correct number of arguments for the specified routine, avoiding the aforementioned class of garbage errors.
Ideally, this should be done at the Python-level, before any C API calls are made. Presently, the only known issue pertains to return values, and so call-in table information regarding such is all that is necessary for resolving this issue as of this writing. However, if it proves necessary to return routine information regarding the number and possibly size/length of rountine parameters, then this information should be added to the relevant class/struct.
The interfaces for ci()/cip() may need to be updated to reflect these changes. Additionally, tests should be added and/or revised to reflect the new behavior.