Reference

odbx_result(3)

Retrieves a result set from the database server

NAME

odbx_result - Retrieves a result set from the database server

SYNOPSIS

FC#include <opendbx/api.h>F[0]

FCint odbx_resultF[0] FC(odbx_t* handle, odbx_result_t** result, struct timeval* timeout, unsigned long chunk);F[0]

DESCRIPTION

Retrieves the result of a query statement sent by FCodbx_queryF[0]() from the database server. After a statement was successfully executed, a dynamically allocated object representing the result set is stored in FCresultF[0] which must be freed afterwards by FCodbx_result_finishF[0](). Result sets for SELECT-like statements returned successfully by this function can be processed by calling FCodbx_row_fetchF[0]() until all rows are retrieved. If the statement was an INSERT, UPDATE, DELETE or a similar statement, the number of affected rows is available via FCodbx_rows_affectedF[0]().

If a timeout or error occurs, the FCresultF[0] pointer is set to NULL. In case of a timeout, FCodbx_resultF[0]() should be called again because the query isn't canceled. This function must be called multiple times until it returns zero, even if the query contains only one statement. Otherwise, memory will be leaked and FCodbx_queryF[0]() will return an error.

The third parameter (FCtimeoutF[0]) restricts the time the function is waiting for a result form the server. It may be NULL to wait until a result arrives. Otherwise, it can contain any number of seconds and microseconds in a timeval structure to wait for. The timeval structure must be set each time before calling FCodbx_resultF[0]() because its content may get changed by the function. If the server doesn't respond within the timeout, the query isn't canceled! Instead, the next call to this function will wait for the same result set. Waiting the specified time may be implemented in the backends if it is possible, but there is no guarantee. If not, FCodbx_resultF[0]() will return not before a responds arrives.

Dependent on the native database library, it may be possible to retrieve all rows at once (if FCchunkF[0] is zero), one by one or more than one row at once. All positive values including zero are allowed as values for FCchunkF[0] If paging (more than one row at once) is not supported by the backend, it will use "one by one" or "all at once" if this is the only option provided.

RETURN VALUE

FCodbx_resultF[0]() returns FCODBX_RES_ROWSF[0] ("3") if a result set is available and zero if no more results will be returned for the last query string sent via FCodbx_queryF[0]() successfully. FCODBX_RES_NOROWSF[0] ("2") is returned if the statement was executed successfully but will not return a results set (like for INSERT, UPDATE and DELETE statements) and FCODBX_RES_TIMEOUTF[0] ("1") indicates a timeout. As soon as FCODBX_RES_DONEF[0] ("0") is returned, the available result sets were processed. The named constants are available since OpenDBX 1.3.2 and the numbers in brackets have to be used instead if a previous release is is the basis for the application development.

It returns an error code whose value is less than zero if one of the operations couldn't be completed successfully. Possible error codes are listed in the error section and they can be feed to FCodbx_errorF[0]() and FCodbx_error_typeF[0]() to get further details. In this case, the backends are responsible for freeing the data structures they allocated inside the function and to clear the errornous result set if there's one available. The backends will also set the given result pointer to NULL before returning the error. Nevertheless, if a non-fatal error occurred it's possible to retrieve further result sets and this is necessary before calling FCodbx_queryF[0]() on the same connection again.

ERRORS

-FCODBX_ERR_BACKENDF[0]

The native database library returned an error

-FCODBX_ERR_PARAMF[0]

Either FChandleF[0] or FCresultF[0] are NULL or FChandleF[0] is invalid

-FCODBX_ERR_NOMEMF[0]

Allocating the required memory for the result failed

-FCODBX_ERR_RESULTF[0]

Waiting for a response from the server failed because the connection was lost

SEE ALSO

FCodbx_column_countF[0](), FCodbx_column_nameF[0](), FCodbx_column_typeF[0](), FCodbx_rows_affectedF[0](), FCodbx_row_fetchF[0](), FCodbx_result_finishF[0]()

History