Create the lld_copy_subset function
The example shows the code for the lld_copy_subset user-defined routine. This routine copies a portion of a large object and appends it to another large object.
/* LLD SAPI interface example */
#include <mi.h>
#include <lldsapi.h>
/* append a (small) subset of a large object to another large object */
MI_ROW*
lld_copy_subset (MI_ROW* src, /* source LLD_Locator */
MI_ROW* dest, /* destination LLD_Locator */
mi_int8* offset, /* offset to begin copy at */
mi_integer nbytes, /* number of bytes to copy */
MI_FPARAM* fp)
{
MI_ROW* new_dest; /* return value */
MI_CONNECTION* conn; /* database server connection */
mi_string* buffer; /* I/O buffer */
LLD_IO* io; /* open large object descriptor */
mi_int8 new_offset; /* offset after seek */
mi_integer bytes_read; /* actual number of bytes copied */
mi_integer error; /* error argument */
mi_integer _error; /* extra error argument */
mi_boolean created_dest; /* did we create the dest large object? */
/* initialize variables */
new_dest = NULL;
conn = NULL;
buffer = NULL;
io = NULL;
error = LLD_E_OK;
created_dest = MI_FALSE;
/* open a connection to the database server */
conn = mi_open (NULL, NULL, NULL);
if (conn == NULL)
goto bad;
/* allocate memory for I/O */
buffer = mi_alloc (nbytes);
if (buffer == NULL)
goto bad;
/* read from the source large object */
io = lld_open (conn, src, LLD_RDONLY, &error);
if (error != LLD_E_OK)
goto bad;
lld_seek (conn, io, offset, LLD_SEEK_SET, &new_offset, &error);
if (error != LLD_E_OK)
goto bad;
bytes_read = lld_read (conn, io, buffer, nbytes, &error);
if (error != LLD_E_OK)
goto bad;
lld_close (conn, io, &error);
if (error != LLD_E_OK)
goto bad;
/* write to the destination large object */
new_dest = lld_create (conn, dest, &error);
if (error == LLD_E_OK)
created_dest = MI_TRUE;
else if (error != LLD_E_EXISTS)
goto bad;
io = lld_open (conn, new_dest, LLD_WRONLY | LLD_APPEND | LLD_SEQ, &error);
if (error != LLD_E_OK)
goto bad;
lld_write (conn, io, buffer, bytes_read, &error);
if (error != LLD_E_OK)
goto bad;
lld_close (conn, io, &error);
if (error != LLD_E_OK)
goto bad;
/* free memory */
mi_free (buffer);
/* close the database server connection */
mi_close (conn);
return new_dest;
/* error clean up */
bad:
if (io != NULL)
lld_close (conn, io, &_error);
if (created_dest)
lld_delete (conn, new_dest, &_error);
if (buffer != NULL)
mi_free (buffer);
if (conn != NULL)
mi_close (conn);
lld_error_raise (conn, error);
mi_fp_setreturnisnull (fp, 0, MI_TRUE);
return NULL;
}
- A source large object (lld_locator type)
- A destination large object (lld_locator type)
- The byte offset to begin copying
- The number of bytes to copy
It returns an lld_locator, identifying the object being appended.
The mi_open function opens a connection to the database. A buffer is allocated for I/O.
- lld_open
- OpenS the source object
- lld_seek
- Seeks to the specified byte offset in the object
- lld_read
- Reads the specified number of bytes from the object
- lld_close
- Closes the object
- lld_open, to open the destination object
- lld_write, to write the bytes read from the source into the destination object
- lld_close, to close the destination object
The mi_close function closes the database connection.
This function also contains error-handling code. If the database connection cannot be made, if memory cannot be allocated, or if any of the Large Object Locator functions returns an error, the error code is invoked.
- Closes the source file
- Deletes the destination file
- Frees the buffer
- Closes the database connection
- Raises an error
You should establish a callback for exceptions (this example code, in the interest of simplicity and clarity, does not do so). See the HCL Informix® DataBlade API Programmer's Guide for more information.